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

test("Cox can start and cancel trip", async ({ page }, testInfo) => {
  await page.goto("/auth");
  await page.getByPlaceholder("Name").click();
  await page.getByPlaceholder("Name").fill("cox2");
  await page.getByPlaceholder("Name").press("Tab");
  await page.getByPlaceholder("Passwort").fill("cox");
  await page.getByPlaceholder("Passwort").press("Enter");

  await page.goto("/");
  await page.getByRole("link", { name: "Ausfahrt eintragen" }).click();
  if (testInfo.project.name.includes("Mobile")) {
    // No left boat selector on mobile views
    await page.getByText('-- Wähle ein Boot aus ---').nth(1).click();
    await page.getByRole("option", { name: "Joe" }).click();
  } else {
    await page.getByText('2x', { exact: true }).click();
    await page.getByText("Joe", { exact: true }).click();
  }
  await page.getByLabel('Remove item: \'6\'').click(); // remove pre-filled cox2
  await page.getByPlaceholder("Ruderer auswählen").click();
  await page.getByRole("option", { name: "rower2" }).click();
  await page.getByRole("option", { name: "cox2" }).click();
  await expect(page.getByRole("listbox")).toContainText(
    "Nur 2 Ruderer können hinzugefügt werden",
  );
  await expect(page.locator("#shipmaster-newrowerjs")).toContainText("cox");
  await expect(page.locator("#steering_person-newrowerjs")).toContainText(
    "rower2 cox",
  );
  await page.getByRole("button", { name: "Ausfahrt eintragen" }).click();
  await expect(page.locator("body")).toContainText(
    "Ausfahrt erfolgreich hinzugefügt",
  );
  await expect(page.locator("body")).toContainText("Joe");

  await page.getByRole("link", { name: "Joe" }).click();
  page.once("dialog", (dialog) => {
    dialog.accept().catch(() => {});
  });
  await page.getByRole("link", { name: "Löschen" }).click();
});

test("Cox can start and finish trip", async ({ page }, testInfo) => {
  await page.goto("/auth");
  await page.getByPlaceholder("Name").click();
  await page.getByPlaceholder("Name").fill("cox2");
  await page.getByPlaceholder("Name").press("Tab");
  await page.getByPlaceholder("Passwort").fill("cox");
  await page.getByPlaceholder("Passwort").press("Enter");

  await page.goto("/");
  await page.getByRole("link", { name: "Ausfahrt eintragen" }).click();
  if (testInfo.project.name.includes("Mobile")) {
    // No left boat selector on mobile views
    await page.getByText('-- Wähle ein Boot aus ---').nth(1).click();
    await page.getByRole("option", { name: "Joe" }).click();
  } else {
    await page.getByText('2x', { exact: true }).click();
    await page.getByText("Joe", { exact: true }).click();
  }
  await page.getByLabel('Remove item: \'6\'').click(); // remove pre-filled cox2
  await page.getByPlaceholder("Ruderer auswählen").click();
  await page.getByRole("option", { name: "rower2" }).click();
  await page.getByRole("option", { name: "cox2" }).click();
  await expect(page.getByRole("listbox")).toContainText(
    "Nur 2 Ruderer können hinzugefügt werden",
  );

  // Trip starts 2 hours ago
  const datetimeSelector = '#departure';
  const currentValue = await page.$eval(datetimeSelector, el => el.value);
  const currentDate = new Date(currentValue);
  currentDate.setMinutes(currentDate.getMinutes());
  currentDate.setHours(currentDate.getHours() - new Date().getTimezoneOffset()/60 - 2);
  const newDatetime = currentDate.toISOString().slice(0, 16);
  await page.$eval(datetimeSelector, (el, value) => el.value = value, newDatetime);

  await expect(page.locator("#shipmaster-newrowerjs")).toContainText("cox");
  await expect(page.locator("#steering_person-newrowerjs")).toContainText(
    "rower2 cox",
  );
  await page.getByRole("button", { name: "Ausfahrt eintragen" }).click();
  await expect(page.locator("body")).toContainText(
    "Ausfahrt erfolgreich hinzugefügt",
  );
  await expect(page.locator("body")).toContainText("Joe");

  await page.goto("/log");
  await page.locator("div:nth-child(2) > .border-0").click();

  await page.getByRole("combobox", { name: "Destination" }).click();
  await page.getByRole("combobox", { name: "Destination" }).fill("Ottensheim");
  await page.getByRole("button", { name: "Ausfahrt beenden" }).click();
  await expect(page.locator("body")).toContainText(
    "Ausfahrt korrekt eingetragen",
  );

  await page.goto('/log/show');
  await expect(page.locator('body')).toContainText('Joe');
  await expect(page.locator('body')).toContainText('(cox2)');
  await expect(page.locator('body')).toContainText('Ottensheim (25 km)');
  await expect(page.locator('body')).toContainText('Ruderer: cox2, rower2');
});

test("Kiosk can start and cancel trip", async ({ page }, testInfo) => {
  await page.goto("/log/kiosk/ekrv2019/Linz");
  if (testInfo.project.name.includes("Mobile")) {
    // No left boat selector on mobile views
    await page.getByText('-- Wähle ein Boot aus ---').nth(1).click();
    await page.getByRole("option", { name: "Joe" }).click();
  } else {
    await page.getByText('2x', { exact: true }).click();
    await page.getByText("Joe", { exact: true }).click();
  }
  await page.getByPlaceholder("Ruderer auswählen").click();
  await page.getByRole("option", { name: "rower2" }).click();
  await page.getByRole("option", { name: "cox2" }).click();
  await expect(page.getByRole("listbox")).toContainText(
    "Nur 2 Ruderer können hinzugefügt werden",
  );
  await expect(page.locator("#shipmaster-newrowerjs")).toContainText("cox");
  await expect(page.locator("#steering_person-newrowerjs")).toContainText(
    "rower2 cox",
  );
  await page.getByRole("button", { name: "Ausfahrt eintragen" }).click();
  await expect(page.locator("body")).toContainText(
    "Ausfahrt erfolgreich hinzugefügt",
  );
  await expect(page.locator("body")).toContainText("Joe");

  await page.getByRole("link", { name: "Joe" }).click();
  page.once("dialog", (dialog) => {
    dialog.accept().catch(() => {});
  });
  await page.getByRole("link", { name: "Löschen" }).click();
});

test("Kiosk can start and finish trip", async ({ page }, testInfo) => {
  await page.goto("/log/kiosk/ekrv2019/Linz");

  if (testInfo.project.name.includes("Mobile")) {
    // No left boat selector on mobile views
    await page.getByText('-- Wähle ein Boot aus ---').nth(1).click();
    await page.getByRole("option", { name: "Joe" }).click();
  } else {
    await page.getByText('2x', { exact: true }).click();
    await page.getByText("Joe", { exact: true }).click();
  }
  await page.getByPlaceholder("Ruderer auswählen").click();
  await page.getByRole("option", { name: "rower2" }).click();
  await page.getByRole("option", { name: "cox2" }).click();
  await expect(page.getByRole("listbox")).toContainText(
    "Nur 2 Ruderer können hinzugefügt werden",
  );

  // Trip starts 2 hours ago
  const datetimeSelector = '#departure';
  const currentValue = await page.$eval(datetimeSelector, el => el.value);
  const currentDate = new Date(currentValue);
  currentDate.setMinutes(currentDate.getMinutes());
  currentDate.setHours(currentDate.getHours() - new Date().getTimezoneOffset()/60 - 2);
  const newDatetime = currentDate.toISOString().slice(0, 16);
  await page.$eval(datetimeSelector, (el, value) => el.value = value, newDatetime);

  await expect(page.locator("#shipmaster-newrowerjs")).toContainText("cox");
  await expect(page.locator("#steering_person-newrowerjs")).toContainText(
    "rower2 cox",
  );
  await page.getByRole("button", { name: "Ausfahrt eintragen" }).click();
  await expect(page.locator("body")).toContainText(
    "Ausfahrt erfolgreich hinzugefügt",
  );
  await expect(page.locator("body")).toContainText("Joe");

  await page.goto("/log");
  await page.locator('div:nth-child(2) > .pt-2 > div > div > div:nth-child(2) > .border-0').click(); // 2 trips currently running, try to close second one
  
  await page.getByRole("combobox", { name: "Destination" }).click();
  await page.getByRole("combobox", { name: "Destination" }).fill("Ottensheim");
  await page.getByRole("button", { name: "Ausfahrt beenden" }).click();
  await expect(page.locator("body")).toContainText(
    "Ausfahrt korrekt eingetragen",
  );

  await page.getByRole('link', { name: 'Logbuch' }).click();
  await expect(page.locator('body')).toContainText('Joe');
  await expect(page.locator('body')).toContainText('(cox2)');
  await expect(page.locator('body')).toContainText('Ottensheim (25 km)');
  await expect(page.locator('body')).toContainText('Ruderer: cox2, rower2');
});

test("Cox can start and finish trip with cox steering only", async ({ page }, testInfo) => {
  await page.goto("/auth");
  await page.getByPlaceholder("Name").click();
  await page.getByPlaceholder("Name").fill("cox2");
  await page.getByPlaceholder("Name").press("Tab");
  await page.getByPlaceholder("Passwort").fill("cox");
  await page.getByPlaceholder("Passwort").press("Enter");

  await page.goto("/");
  await page.getByRole("link", { name: "Ausfahrt eintragen" }).click();
  if (testInfo.project.name.includes("Mobile")) {
    // No left boat selector on mobile views
    await page.getByText('-- Wähle ein Boot aus ---').nth(1).click();
    await page.getByRole("option", { name: "cox_only_steering_boat" }).click();
  } else {
    await page.getByText('2+', { exact: true }).click();
    await page.getByText("cox_only_steering_boat", { exact: true }).click();
  }

  // Trip starts 2 hours ago
  const datetimeSelector = '#departure';
  const currentValue = await page.$eval(datetimeSelector, el => el.value);
  const currentDate = new Date(currentValue);
  currentDate.setMinutes(currentDate.getMinutes());
  currentDate.setHours(currentDate.getHours() - new Date().getTimezoneOffset()/60 - 2);
  const newDatetime = currentDate.toISOString().slice(0, 16);
  await page.$eval(datetimeSelector, (el, value) => el.value = value, newDatetime);

  await expect(page.locator("#shipmaster-newrowerjs")).toContainText("cox");
  await expect(page.locator("#steering_person-newrowerjs")).toContainText(
    "cox",
  );
  await page.getByRole("button", { name: "Ausfahrt eintragen" }).click();
  await expect(page.locator("body")).toContainText(
    "Ausfahrt erfolgreich hinzugefügt",
  );
  await expect(page.locator("body")).toContainText("cox_only_steering_boat");

  await page.goto("/log");
  await page.locator("div:nth-child(2) > .border-0").click();

  await page.getByRole("combobox", { name: "Destination" }).click();
  await page.getByRole("combobox", { name: "Destination" }).fill("Ottensheim");
  await page.getByRole("button", { name: "Ausfahrt beenden" }).click();
  await expect(page.locator("body")).toContainText(
    "Ausfahrt korrekt eingetragen",
  );

  await page.goto('/log/show');
  await expect(page.locator('body')).toContainText('cox_only_steering_boat');
  await expect(page.locator('body')).toContainText('(cox2)');
  await expect(page.locator('body')).toContainText('Ottensheim (25 km)');
});

test("Kiosk can start and finish trip in one stop", async ({ page }, testInfo) => {
  await page.goto("/log/kiosk/ekrv2019/Linz");

  if (testInfo.project.name.includes("Mobile")) {
    // No left boat selector on mobile views
    await page.getByText('-- Wähle ein Boot aus ---').nth(1).click();
    await page.getByRole("option", { name: "Joe" }).click();
  } else {
    await page.getByText('2x', { exact: true }).click();
    await page.getByText("Joe", { exact: true }).click();
  }
  await page.getByPlaceholder("Ruderer auswählen").click();
  await page.getByRole("option", { name: "rower2" }).click();
  await page.getByRole("option", { name: "cox2" }).click();
  await expect(page.getByRole("listbox")).toContainText(
    "Nur 2 Ruderer können hinzugefügt werden",
  );

  // Trip starts 2 hours ago
  const datetimeSelector = '#departure';
  const currentValue = await page.$eval(datetimeSelector, el => el.value);
  const currentDate = new Date(currentValue);
  currentDate.setMinutes(currentDate.getMinutes());
  currentDate.setHours(currentDate.getHours() - new Date().getTimezoneOffset()/60 - 2);
  const newDatetime = currentDate.toISOString().slice(0, 16);
  await page.$eval(datetimeSelector, (el, value) => el.value = value, newDatetime);

  await page.getByLabel('Ankunftszeit').click();
  await page.locator('#destination').fill('a');
  await page.getByLabel('Distanz').fill('1');

  await expect(page.locator("#shipmaster-newrowerjs")).toContainText("cox");
  await expect(page.locator("#steering_person-newrowerjs")).toContainText(
    "rower2 cox",
  );
  await page.getByRole("button", { name: "Ausfahrt eintragen" }).click();
  await expect(page.locator("body")).toContainText(
    "Ausfahrt erfolgreich hinzugefügt",
  );
  await page.getByRole('link', { name: 'Logbuch' }).click();
  await expect(page.locator('body')).toContainText('Joe');
  await expect(page.locator('body')).toContainText('(cox2)');
  await expect(page.locator('body')).toContainText('a (1 km)');
  await expect(page.locator('body')).toContainText('Ruderer: cox2, rower2');
});