import { test, expect, Page } from "@playwright/test";

test("cox can create and delete trip", async ({ page }) => {
  await page.goto("/auth");
  await page.getByPlaceholder("Name").click();
  await page.getByPlaceholder("Name").fill("cox");
  await page.getByPlaceholder("Name").press("Tab");
  await page.getByPlaceholder("Passwort").fill("cox");
  await page.getByPlaceholder("Passwort").press("Enter");
  await page.locator('li').filter({ hasText: 'Geplante Ausfahrten' }).getByRole('link').click();
  await page.locator(".relative").first().click();
  await page.locator("#sidebar #planned_starting_time").click();
  await page.locator("#sidebar #planned_starting_time").fill("18:00");
  await page.locator("#sidebar #planned_starting_time").press("Tab");
  await page.locator("#sidebar #planned_starting_time").press("Tab");
  await page.getByRole("spinbutton").fill("5");
  await page.getByRole("button", { name: "Erstellen", exact: true }).click();
  await expect(page.locator("body")).toContainText("18:00 Uhr (cox) Details");

  await page.goto("/planned");
  await page.getByRole("link", { name: "Details" }).click();
  await page.getByRole("link", { name: "Termin löschen" }).click();
  await expect(page.locator("body")).toContainText("Erfolgreich gelöscht!");
});

// TODO: group -> cox can create trips
// TODO: cox can help/register at trips/events

test.describe("cox can edit trips", () => {
  let sharedPage: Page;

  test.beforeAll(async ({ browser }) => {
    const page = await browser.newPage();

    await page.goto("/auth");
    await page.getByPlaceholder("Name").click();
    await page.getByPlaceholder("Name").fill("cox");
    await page.getByPlaceholder("Name").press("Tab");
    await page.getByPlaceholder("Passwort").fill("cox");
    await page.getByPlaceholder("Passwort").press("Enter");
  await page.locator('li').filter({ hasText: 'Geplante Ausfahrten' }).getByRole('link').click();
    await page.locator(".relative").first().click();
    await page.locator("#sidebar #planned_starting_time").click();
    await page.locator("#sidebar #planned_starting_time").fill("18:00");
    await page.locator("#sidebar #planned_starting_time").press("Tab");
    await page.locator("#sidebar #planned_starting_time").press("Tab");
    await page.getByRole("spinbutton").fill("5");
    await page.getByRole("button", { name: "Erstellen", exact: true }).click();

    sharedPage = page;
  });

  test("edit remarks", async () => {
    await sharedPage.goto("/planned");
    await sharedPage.getByRole("link", { name: "Details" }).click();
    await sharedPage.locator("#sidebar #notes").click();
    await sharedPage.locator("#sidebar #notes").fill("Meine Anmerkung");
    await sharedPage.getByRole("button", { name: "Speichern" }).click();
    await sharedPage.getByRole("link", { name: "Details" }).click();
    await expect(sharedPage.locator("#sidebar")).toContainText(
      "Meine Anmerkung",
    );

    await sharedPage
      .getByRole("button", { name: "Ausfahrt erstellen schließen" })
      .click();
  });

  test("add and remove guest", async () => {
    await sharedPage.goto("/planned");
    await sharedPage.getByRole("link", { name: "Details" }).click();
    await sharedPage.locator("#sidebar #user_note").click();
    await sharedPage.locator("#sidebar #user_note").fill("Mein Gast");
    await sharedPage.getByRole("button", { name: "Gast hinzufügen" }).click();
    await expect(sharedPage.locator("body")).toContainText(
      "Erfolgreich angemeldet!",
    );
    await sharedPage.getByRole("link", { name: "Details" }).click();
    await expect(sharedPage.locator("#sidebar")).toContainText(
      "Freie Plätze: 4",
    );
    await expect(sharedPage.locator("#sidebar")).toContainText(
      "Mein Gast (Gast) Abmelden",
    );
    await expect(
      sharedPage.getByRole("link", { name: "Termin löschen" }),
    ).not.toBeVisible();

    await sharedPage.getByRole("link", { name: "Abmelden" }).click();
    await expect(sharedPage.locator("body")).toContainText(
      "Erfolgreich abgemeldet!",
    );
    await sharedPage.getByRole("link", { name: "Details" }).click();
    await expect(sharedPage.locator("#sidebar")).toContainText(
      "Freie Plätze: 5",
    );
    await expect(sharedPage.locator("#sidebar")).toContainText(
      "Keine Ruderer angemeldet",
    );
    await expect(
      sharedPage.getByRole("link", { name: "Termin löschen" }),
    ).toBeVisible();

    await sharedPage
      .getByRole("button", { name: "Ausfahrt erstellen schließen" })
      .click();
  });

  test("change amount rower", async () => {
    await sharedPage.goto("/planned");
    await sharedPage.getByRole("link", { name: "Details" }).click();
    await expect(sharedPage.locator("#sidebar")).toContainText(
      "Freie Plätze: 5",
    );
    await sharedPage.getByRole("spinbutton").click();
    await sharedPage.getByRole("spinbutton").fill("3");
    await sharedPage.getByRole("button", { name: "Speichern" }).click();
    await expect(sharedPage.locator("body")).toContainText(
      "Ausfahrt erfolgreich aktualisiert.",
    );
  });

  test("call off trip", async () => {
    await sharedPage.goto("/planned");
    await sharedPage.getByRole("link", { name: "Details" }).click();
    await expect(sharedPage.locator("#sidebar")).toContainText(
      "Freie Plätze: 3",
    );
    await sharedPage.getByRole("spinbutton").click();
    await sharedPage.getByRole("spinbutton").fill("0");
    await sharedPage.getByRole("button", { name: "Speichern" }).click();
    await expect(sharedPage.locator("body")).toContainText(
      "Ausfahrt erfolgreich aktualisiert.",
    );
    await expect(sharedPage.locator("body")).toContainText("(Absage cox)");
  });

  test.afterAll(async () => {
    await sharedPage.goto("/planned");
    await sharedPage.getByRole("link", { name: "Details" }).click();
    await sharedPage.getByRole("link", { name: "Termin löschen" }).click();
    await sharedPage.close();
  });

  // TODO: 'Immer anzeigen' (also verify the functionality), 'Gesperrt' + type
});