<?php

declare(strict_types=1);

namespace App\Module\Core\Infrastructure\ApiPlatform\Resource;

use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Get;
use ApiPlatform\Metadata\GetCollection;
use App\Module\Core\Application\DTO\AuditLogOutput;
use App\Module\Core\Infrastructure\ApiPlatform\State\Provider\AuditLogProvider;

/**
 * Resource API Platform en lecture seule sur le journal d'audit.
 *
 * Aucune operation d'ecriture exposee (POST/PUT/PATCH/DELETE -> 405)
 * conformement au caractere append-only de la table `audit_log`.
 *
 * La resource est un simple porteur de metadonnees #[ApiResource] ; le
 * provider lit via DBAL et retourne directement des instances du DTO
 * `AuditLogOutput` (declare via `output:`). La table n'est pas geree par
 * l'ORM : aucune entite Doctrine n'est necessaire ici.
 *
 * Filtres query-param supportes par le provider :
 *   ?entity_type=core.User
 *   ?entity_id=42
 *   ?action=update
 *   ?performed_by=admin
 *   ?performed_at[after]=2026-04-01T00:00:00Z
 *   ?performed_at[before]=2026-04-30T23:59:59Z
 *
 * La pagination herite du standard global (10 items / page, max 50, cf.
 * `config/packages/api_platform.yaml`). Elle est materialisee par le
 * DbalPaginator du provider qui implemente PaginatorInterface — API Platform
 * genere automatiquement hydra:view sans construction manuelle.
 */
#[ApiResource(
    shortName: 'AuditLog',
    operations: [
        new GetCollection(
            uriTemplate: '/audit-logs',
            security: "is_granted('core.audit_log.view')",
            provider: AuditLogProvider::class,
        ),
        new Get(
            uriTemplate: '/audit-logs/{id}',
            requirements: ['id' => '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'],
            security: "is_granted('core.audit_log.view')",
            provider: AuditLogProvider::class,
        ),
    ],
    output: AuditLogOutput::class,
)]
final class AuditLogResource {}
