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

import {
  createDoc,
  expectLoginPage,
  keyCloakSignIn,
  mockedDocument,
  verifyDocName,
} from './common';

test.describe('Doc Routing', () => {
  test.beforeEach(async ({ page }) => {
    await page.goto('/');
  });

  test('Check the presence of the meta tag noindex', async ({ page }) => {
    const buttonCreateHomepage = page.getByRole('button', {
      name: 'New doc',
    });

    await expect(buttonCreateHomepage).toBeVisible();
    await buttonCreateHomepage.click();
    await expect(
      page.getByRole('button', {
        name: 'Share',
      }),
    ).toBeVisible();
    const metaDescription = page.locator('meta[name="robots"]');
    await expect(metaDescription).toHaveAttribute('content', 'noindex');
  });

  test('checks alias docs url with homepage', async ({ page }) => {
    await expect(page).toHaveURL('/');

    const buttonCreateHomepage = page.getByRole('button', {
      name: 'New doc',
    });

    await expect(buttonCreateHomepage).toBeVisible();

    await page.goto('/docs/');
    await expect(buttonCreateHomepage).toBeVisible();
    await expect(page).toHaveURL(/\/docs\/$/);
  });

  test('checks 404 on docs/[id] page', async ({ page }) => {
    // eslint-disable-next-line playwright/no-wait-for-timeout
    await page.waitForTimeout(300);

    await page.goto('/docs/some-unknown-doc');
    await expect(
      page.getByText(
        'It seems that the page you are looking for does not exist or cannot be displayed correctly.',
      ),
    ).toBeVisible({
      timeout: 15000,
    });
  });

  test('checks 401 on docs/[id] page', async ({ page, browserName }) => {
    const [docTitle] = await createDoc(page, 'My new doc', browserName, 1);
    await verifyDocName(page, docTitle);

    const responsePromise = page.route(
      /.*\/link-configuration\/$|users\/me\/$/,
      async (route) => {
        const request = route.request();

        if (
          request.method().includes('PUT') ||
          request.method().includes('GET')
        ) {
          await route.fulfill({
            status: 401,
            json: {
              detail: 'Log in to access the document',
            },
          });
        } else {
          await route.continue();
        }
      },
    );

    await page.getByRole('button', { name: 'Share' }).click();

    const selectVisibility = page.getByLabel('Visibility', { exact: true });
    await selectVisibility.click();
    await page.getByLabel('Connected').click();

    await responsePromise;

    await expect(page.getByText('Log in to access the document')).toBeVisible();
  });
});

test.describe('Doc Routing: Not loggued', () => {
  test.use({ storageState: { cookies: [], origins: [] } });

  test('checks redirect to a doc after login', async ({
    page,
    browserName,
  }) => {
    await mockedDocument(page, { link_reach: 'public' });
    await page.goto('/docs/mocked-document-id/');
    await expect(page.locator('h2').getByText('Mocked document')).toBeVisible();
    await page.getByRole('button', { name: 'Login' }).click();
    await keyCloakSignIn(page, browserName, false);
    await expect(page.locator('h2').getByText('Mocked document')).toBeVisible();
  });

  // eslint-disable-next-line playwright/expect-expect
  test('The homepage redirects to login.', async ({ page }) => {
    await page.goto('/');
    await expectLoginPage(page);
  });
});
