/**
 * Regression for the review's CR1: the LightboxModal posted comments to
 * `/upload/{id}/comment` (singular) while the only route is `/comments` (plural),
 * so every comment submitted through the UI 404'd and was silently lost. The
 * earlier "comment → SSE" spec passed by posting via a fetch helper, bypassing
 * the component — a false green. This drives the real component end-to-end.
 */
import { test, expect } from '../../fixtures/test';
import { seedUpload } from '../../helpers/seed';
import { BASE } from '../../helpers/env';

test.describe('Comments — UI round-trip (CR1)', () => {
  test('a comment typed in the lightbox persists to the backend', async ({
    page,
    guest,
    signIn,
  }) => {
    const author = await guest('CommentAuthor');
    const commenter = await guest('Commenter');
    const uploadId = await seedUpload(author.jwt, { caption: 'Comment target' });

    await signIn(page, commenter);
    await page.goto('/feed');

    // Open the lightbox. Only one upload exists, so the first open-button is it.
    const imageButton = page.getByRole('button', { name: 'Bild vergrößern' }).first();
    await expect(imageButton).toBeVisible({ timeout: 15_000 });
    await imageButton.click();

    const lightbox = page.locator('[role="dialog"][aria-labelledby="lightbox-title"]');
    await expect(lightbox).toBeVisible();

    const text = `Wunderschönes Foto ${Date.now()}`;
    await lightbox.getByPlaceholder(/kommentar/i).fill(text);
    await lightbox.getByRole('button', { name: /senden/i }).click();

    // The component appends the comment only on a 2xx — with the old singular path
    // it threw and nothing appeared. Assert it's visible in the panel...
    await expect(lightbox.getByText(text)).toBeVisible();

    // ...and that it actually persisted server-side (the crux CR1 broke).
    await expect
      .poll(async () => {
        const res = await fetch(`${BASE}/api/v1/upload/${uploadId}/comments`, {
          headers: { Authorization: `Bearer ${commenter.jwt}` },
        });
        const body = await res.json();
        return Array.isArray(body) && body.some((c: { body: string }) => c.body === text);
      })
      .toBe(true);
  });
});
