import { expect, test } from '@playwright/test';
import { expectNoA11yViolations } from './support/axe';

/**
 * História 13 — LGPD (política de privacidade e canal do titular) — ADR-019.
 *
 * Prova que as páginas públicas de privacidade são acessíveis: navio de 1º nível, rótulos e o
 * formulário nativo do DSAR (funciona sem JavaScript). O envio em si é coberto no PHPUnit
 * (`LgpdTest`) — aqui não criamos registros no banco de demonstração.
 */
test.describe('LGPD — política e canal do titular', () => {
  test('a política de privacidade é pública e passa no axe', async ({ page }) => {
    await page.goto('/politica-de-privacidade');

    await expect(page.getByRole('heading', { level: 1 })).toBeVisible();

    await expectNoA11yViolations(page);
  });

  test('o formulário do titular é acessível e tem campos rotulados', async ({ page }) => {
    await page.goto('/lgpd');

    await expect(page.getByRole('heading', { level: 1 })).toBeVisible();
    await expect(page.getByLabel(/Nome completo/)).toBeVisible();
    await expect(page.getByLabel(/E-mail/)).toBeVisible();

    await expectNoA11yViolations(page);
  });

  test('o formulário inválido mostra a mensagem traduzida (nunca a chave crua) e passa no axe', async ({
    page,
  }) => {
    await page.goto('/lgpd');

    // Contorna a validação nativa do browser (queremos a resposta do servidor) e envelhece o
    // `opened_at` além do time-trap de 2s — sem espera fixa (ADR-001).
    await page.locator('form[action$="/lgpd"]').evaluate((form: HTMLFormElement) => {
      form.noValidate = true;
    });
    await page.locator('input[name="opened_at"]').evaluate((input: HTMLInputElement) => {
      input.value = String(Math.floor(Date.now() / 1000) - 10);
    });

    await page.getByRole('button', { name: /Enviar|Solicitar/ }).click();

    await expect(page).toHaveURL(/\/lgpd$/);

    // O resumo (`role="alert"`) é do módulo; a mensagem do **campo** é a do framework e precisa
    // estar traduzida (nunca `validation.required`).
    await expect(page.locator('#error-name')).toContainText(/obrigatório/i);
    await expect(page.locator('#error-name')).not.toContainText('validation.');
    await expect(page.getByRole('alert').first()).not.toContainText('validation.');

    await expectNoA11yViolations(page);
  });
});
