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

test('cox can create and delete trip', async ({ page }) => {
  await page.goto('http://localhost:8000/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.getByRole('link', { name: 'Geplante Ausfahrten' }).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('http://localhost:8000/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.beforeEach(async ({ browser }) => {
    const page = await browser.newPage();

    await page.goto('http://localhost:8000/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.getByRole('link', { name: 'Geplante Ausfahrten' }).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('http://localhost:8000/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('http://localhost:8000/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('http://localhost:8000/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('http://localhost:8000/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('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.afterEach(async () => {
    await sharedPage.goto('http://localhost:8000/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
});