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

/**
 * História do CMS de Configurações (P0.S3/ADR-046): a seção Geral é um documento validado,
 * com erro acessível e foco no primeiro campo inválido. O teste restaura o valor original
 * pela própria UI para não deixar a instância de dev alterada.
 */
test.describe('CMS — Configurações', () => {
  test('edita a seção Geral e trata o erro de schema', async ({ page }) => {
    await signIn(page);

    await page.goto('/configuracoes');
    await expect(page.getByRole('heading', { name: 'Configurações', level: 1 })).toBeVisible();
    await expectNoA11yViolations(page);

    await page.getByRole('link', { name: 'Geral', exact: true }).click();
    await expect(page.getByRole('heading', { name: 'Geral', level: 1 })).toBeVisible();
    await expectNoA11yViolations(page);

    const name = page.locator('#field-name');
    const site = page.locator('#field-site');
    const originalName = await name.inputValue();
    const originalSite = await site.inputValue();
    const uniqueName = `Configuração E2E ${Date.now()}`;

    try {
      await name.fill(uniqueName);
      await page.getByRole('button', { name: 'Salvar' }).click();
      await expect(page).toHaveURL(/\/configuracoes\/institution$/);
      await expect(name).toHaveValue(uniqueName);

      await site.fill('javascript:alert(1)');
      await page.getByRole('button', { name: 'Salvar' }).click();
      await expect(page.locator('.alert-error')).toContainText('O campo Site é inválido.');
      await expect(site).toHaveAttribute('aria-invalid', 'true');
      await expect(site).toBeFocused();
      await expectNoA11yViolations(page);

      await site.fill(originalSite);
      await name.fill(originalName);
      await page.getByRole('button', { name: 'Salvar' }).click();
      await expect(name).toHaveValue(originalName);
    } finally {
      // Restauração defensiva: se o teste falhou no meio, o documento não fica com o valor de teste.
      await page.goto('/configuracoes/institution');
      if ((await name.inputValue()) !== originalName) {
        await name.fill(originalName);
        await site.fill(originalSite);
        await page.getByRole('button', { name: 'Salvar' }).click();
        await expect(name).toHaveValue(originalName);
      }
    }
  });

  test('Aparência tem editor próprio; seção desconhecida responde 404', async ({ page }) => {
    await signIn(page);

    // P1.S2: `theme` saiu da lista de "fora do escopo" — é um editor real, não um 404.
    const editor = await page.goto('/configuracoes/theme');

    expect(editor?.status()).toBe(200);
    await expect(page.getByRole('heading', { name: 'Aparência', level: 1 })).toBeVisible();
    await expect(page.locator('#field-color_primary')).toBeVisible();
    await expectNoA11yViolations(page);

    // Seção que não existe continua 404 (nunca formulário genérico de JSON livre).
    const unknown = await page.goto('/configuracoes/desconhecida');

    expect(unknown?.status()).toBe(404);
  });
});
