<?php

declare(strict_types=1);

namespace App\Administration\Domain\Event;

use App\Administration\Domain\Model\RefreshToken\TokenFamilyId;
use App\Shared\Domain\DomainEvent;
use DateTimeImmutable;
use Ramsey\Uuid\UuidInterface;

/**
 * Événement émis lors de la détection d'une tentative de replay attack.
 *
 * Indique qu'un token déjà utilisé a été présenté, ce qui suggère
 * un vol de token. Toute la famille de tokens a été invalidée.
 *
 * Cet événement doit déclencher une alerte sécurité.
 *
 * @see Story 1.4 - Connexion utilisateur (sécurité refresh tokens)
 */
final readonly class TokenReplayDetecte implements DomainEvent
{
    public function __construct(
        public TokenFamilyId $familyId,
        public string $ipAddress,
        public string $userAgent,
        public DateTimeImmutable $occurredOn,
    ) {
    }

    public function occurredOn(): DateTimeImmutable
    {
        return $this->occurredOn;
    }

    public function aggregateId(): UuidInterface
    {
        return $this->familyId->value;
    }
}
