<?php

declare(strict_types=1);

namespace App\Shared\Infrastructure\RateLimit;

use Symfony\Component\HttpFoundation\Request;

/**
 * Interface pour le rate limiting des tentatives de login.
 *
 * Stratégie de protection multi-niveaux :
 * - Délai progressif Fibonacci par email (1s, 1s, 2s, 3s, 5s, 8s...)
 * - CAPTCHA requis après 5 échecs
 * - Blocage IP après trop de tentatives globales ou échec CAPTCHA
 */
interface LoginRateLimiterInterface
{
    public const int CAPTCHA_THRESHOLD = 5;
    public const int IP_BLOCK_DURATION = 900; // 15 minutes

    /**
     * Vérifie l'état du rate limit pour une tentative de login.
     *
     * Retourne le nombre de tentatives, le délai à appliquer, et si CAPTCHA est requis.
     */
    public function check(Request $request, string $email): LoginRateLimitResult;

    /**
     * Enregistre un échec de login (incrémente le compteur, calcule le nouveau délai).
     */
    public function recordFailure(Request $request, string $email): LoginRateLimitResult;

    /**
     * Réinitialise le compteur pour un email (après login réussi).
     */
    public function reset(string $email): void;

    /**
     * Bloque une IP (après échec CAPTCHA répété).
     */
    public function blockIp(string $ip): void;

    /**
     * Vérifie si une IP est bloquée.
     */
    public function isIpBlocked(string $ip): bool;
}
