<?php

declare(strict_types=1);

namespace App\Administration\Domain\Exception;

use App\Administration\Domain\Model\RefreshToken\TokenFamilyId;
use DomainException;

use function sprintf;

/**
 * Exception levée quand un replay attack sur un refresh token est détecté.
 *
 * Cette exception indique qu'un token déjà utilisé a été présenté à nouveau,
 * suggérant que le token a été volé et utilisé par un attaquant.
 *
 * Quand cette exception est levée :
 * - Toute la famille de tokens est invalidée
 * - L'utilisateur doit se reconnecter
 * - Un audit log doit être créé
 * - Une alerte de sécurité peut être envoyée
 */
final class TokenReplayDetectedException extends DomainException
{
    public function __construct(
        public readonly TokenFamilyId $familyId,
    ) {
        parent::__construct(
            sprintf('Token replay attack detected for family %s. All tokens in family have been invalidated.', $familyId),
        );
    }
}
