<?php

declare(strict_types=1);

namespace App\Administration\Domain\Repository;

use App\Administration\Domain\Model\RefreshToken\RefreshToken;
use App\Administration\Domain\Model\RefreshToken\RefreshTokenId;
use App\Administration\Domain\Model\RefreshToken\TokenFamilyId;
use App\Administration\Domain\Model\User\UserId;

/**
 * Repository pour la gestion des refresh tokens.
 *
 * Implémentation attendue : Redis avec TTL automatique.
 */
interface RefreshTokenRepository
{
    /**
     * Sauvegarde un refresh token.
     */
    public function save(RefreshToken $token): void;

    /**
     * Récupère un refresh token par son ID.
     */
    public function find(RefreshTokenId $id): ?RefreshToken;

    /**
     * Récupère un refresh token par sa valeur (le token string).
     */
    public function findByToken(string $tokenValue): ?RefreshToken;

    /**
     * Supprime un refresh token.
     */
    public function delete(RefreshTokenId $id): void;

    /**
     * Invalide tous les tokens d'une famille (en cas de replay attack détectée).
     */
    public function invalidateFamily(TokenFamilyId $familyId): void;

    /**
     * Invalide tous les tokens d'un utilisateur (après changement de mot de passe).
     */
    public function invalidateAllForUser(UserId $userId): void;
}
