import { expect, test } from '@playwright/test';
import { gotoExpecting, trackExternalRequests } from './support/portal';

/**
 * @intent História 03 — o portal funciona sem JavaScript (`histories/03-sem-javascript.md`).
 *
 * @description Roda no projeto `portal-no-js` (`javaScriptEnabled: false`) — ADR-010.
 */

test.describe('História 03 — Sem JavaScript', () => {
  test('a home renderiza e a navegação por links funciona', async ({ page }) => {
    await gotoExpecting(page, '/', 200);
    await expect(page.locator('main#main-content h1')).toBeVisible();

    await page.getByRole('link', { name: 'Notícias' }).first().click();
    await expect(page).toHaveURL(/\/noticias$/);
    await expect(page.locator('main#main-content h1')).toBeVisible();

    await page.getByRole('link', { name: 'Início' }).first().click();
    await expect(page).toHaveURL(/\/$/);
    await expect(page.locator('main#main-content h1')).toBeVisible();
  });

  test('as preferências chegam do servidor (cookie) e valem no CSS computado', async ({
    page,
    context,
  }, testInfo) => {
    const hostname = new URL(testInfo.project.use.baseURL as string).hostname;

    await context.addCookies([
      { name: 'a11y_contrast', value: '1', domain: hostname, path: '/' },
    ]);

    await gotoExpecting(page, '/', 200);

    await expect(page.locator('html')).toHaveAttribute('data-a11y-contrast', 'high');

    const background = await page.evaluate(
      () => getComputedStyle(document.documentElement).getPropertyValue('--surface').trim(),
    );

    expect(background, 'alto contraste precisa alterar o token de superfície').toBe(
      'oklch(0% 0 0)',
    );
  });

  test('nenhuma requisição externa por padrão (zero CDN)', async ({ page }) => {
    const external = trackExternalRequests(page);

    await gotoExpecting(page, '/', 200);
    await page.waitForLoadState('load');

    expect(external, `requisições fora da origem: ${external.join(', ')}`).toEqual([]);
  });

  test('estrutura e landmarks conferem sem JavaScript', async ({ page }) => {
    await gotoExpecting(page, '/', 200);

    // O axe exige JavaScript para injetar as regras: a auditoria automática roda nos projetos
    // com JS (spec 04). Aqui garantimos o contrato estrutural do shell sem script nenhum.
    await expect(page.locator('header.site-header')).toHaveCount(1);
    await expect(page.locator('main#main-content')).toHaveCount(1);
    await expect(page.locator('footer#site-footer')).toHaveCount(1);
    expect(await page.locator('nav').count()).toBeGreaterThan(0);
    expect(await page.locator('h1').count()).toBe(1);
  });
});
