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

/**
 * História do lote da galeria (F5.I4/ADR-026 §2): 3 imagens são enviadas **uma por requisição**
 * com concorrência limitada, a grade exige alt, o lote é orçado no servidor e o commit cataloga
 * após a digestão. (O teste usa 3, não 50: os caps de 50/250 MiB são provados no PHPUnit.)
 */
test.describe('CMS — Galeria em lote', () => {
  test('envia várias imagens com alt, cataloga e mostra no catálogo', async ({ page }) => {
    test.setTimeout(90_000);

    await signIn(page);
    await page.goto('/galeria');

    const batch = page.locator('[data-gallery-batch]');
    await expect(batch).toBeVisible();

    const stamp = Date.now();
    const png = Buffer.from(
      'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==',
      'base64',
    );

    const files = [1, 2, 3].map((index) => ({
      name: `lote-${stamp}-${index}.png`,
      mimeType: 'image/png',
      buffer: png,
    }));
    const alts = files.map((file, index) => `Foto em lote ${stamp} ${index + 1}`);

    await batch.locator('[data-batch-files]').setInputFiles(files);

    const altInputs = batch.locator('[data-batch-alt]');
    await expect(altInputs).toHaveCount(3);

    for (const [index, alt] of alts.entries()) {
      await altInputs.nth(index).fill(alt);
    }

    await expectNoA11yViolations(page);

    await batch.locator('[data-batch-start]').click();

    // O commit recarrega a página para mostrar os cards criados no servidor.
    for (const alt of alts) {
      await expect(page.getByText(alt, { exact: true }).first()).toBeVisible({ timeout: 45_000 });
    }

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