<?php

declare(strict_types=1);

namespace App\Module\Core\Infrastructure\Audit;

use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\Uid\Uuid;

/**
 * Fournit un identifiant de requete HTTP (UUID v4) partage par toutes les
 * lignes d'audit produites au cours d'une meme requete principale.
 *
 * Utilite : retrouver d'un seul coup d'oeil toutes les ecritures liees a un
 * meme appel utilisateur (ex: PATCH qui cascade des updates sur plusieurs
 * entites). Null en CLI (fixtures, commandes batch).
 *
 * Service singleton (scope container par defaut) — un unique UUID est
 * genere au kernel.request principal et reutilise pour toute la requete.
 */
final class RequestIdProvider
{
    private ?string $requestId = null;

    #[AsEventListener(event: 'kernel.request')]
    public function onKernelRequest(RequestEvent $event): void
    {
        // Ignorer les sub-requests (ESI, forward interne) pour ne pas
        // ecraser l'UUID de la requete principale.
        if (!$event->isMainRequest()) {
            return;
        }

        $this->requestId = Uuid::v4()->toRfc4122();
    }

    public function getRequestId(): ?string
    {
        return $this->requestId;
    }
}
