<?php

declare(strict_types=1);

namespace App\Tests\Module\Core\Api;

/**
 * Regression test de pagination sur GET /api/audit-logs (ERP-72).
 *
 * Avant ce ticket, `paginationItemsPerPage` etait fixe a 30 dans
 * AuditLogResource. Apres migration vers les defaults globaux (10/50),
 * ce fichier verrouille le nouveau contrat :
 *  - la reponse est paginee (max 10 items par page par defaut) ;
 *  - un itemsPerPage excessif est plafonne a 50.
 *
 * Pas de seed : la table audit_log contient deja des lignes issues des
 * fixtures / autres tests. Les assertions utilisent des inegalites pour
 * rester robustes quelle que soit la quantite exacte de donnees presentes.
 *
 * @internal
 */
final class AuditLogPaginationRegressionTest extends AbstractApiTestCase
{
    /**
     * La collection /api/audit-logs doit etre paginee avec les defaults globaux :
     *  - `member`, `totalItems`, `view` presentes dans la reponse JSON-LD ;
     *  - au plus 10 items par page (nouveau defaut, etait 30 avant ce ticket).
     */
    public function testAuditLogCollectionStillPaginated(): void
    {
        $client   = $this->authenticatedClient('admin', 'admin');
        $response = $client->request('GET', '/api/audit-logs');

        self::assertSame(200, $response->getStatusCode());

        $data = $response->toArray();
        self::assertArrayHasKey('totalItems', $data, 'La collection audit-logs doit exposer totalItems.');
        self::assertArrayHasKey('view', $data, 'La collection audit-logs doit exposer view (pagination active).');
        self::assertIsArray($data['member'], 'member doit etre un tableau.');

        // Le nouveau defaut global est 10 (etait 30 dans AuditLogResource avant ERP-72).
        self::assertLessThanOrEqual(
            10,
            count($data['member']),
            'La page par defaut ne doit pas depasser 10 items (default global ERP-72).',
        );
    }

    /**
     * Un itemsPerPage excessif (99999) doit etre plafonne au maximum global (50).
     * Teste la regression specifique du paginator DBAL custom (DbalPaginator) qui
     * pourrait ignorer la limite si la logique de cap n'est pas appliquee cote provider.
     */
    public function testAuditLogItemsPerPageCappedAt50(): void
    {
        $client   = $this->authenticatedClient('admin', 'admin');
        $response = $client->request('GET', '/api/audit-logs?itemsPerPage=99999');

        self::assertSame(200, $response->getStatusCode());

        $data = $response->toArray();
        self::assertIsArray($data['member'], 'member doit etre un tableau.');

        // Le cap global est 50 : jamais plus d'items par page que le maximum.
        self::assertLessThanOrEqual(
            50,
            count($data['member']),
            'itemsPerPage=99999 doit etre plafonne a 50 (maximum global ERP-72).',
        );
    }
}
