namespace OmsorgCore.Application.Abstractions;

public interface IPasswordResetCodeGenerator
{
    /// <summary>Mindestabstand zwischen zwei Code-Anfragen desselben Users (minimaler Spam-Schutz).</summary>
    TimeSpan RequestCooldown { get; }

    /// <summary>Maximale Anzahl Fehlversuche bei der PIN-Eingabe, bevor der Code invalidiert wird.</summary>
    int MaxAttempts { get; }

    /// <summary>Erzeugt einen neuen 6-stelligen PIN, dessen Hash zur Speicherung und sein Ablaufdatum.</summary>
    (string RawPin, string PinHash, DateTime ExpiresAt) GeneratePin();

    /// <summary>Wie <see cref="GeneratePin()"/>, aber mit explizit vorgegebener Gültigkeitsdauer statt der konfigurierten (z. B. für Account-Einladungen mit mehrtägiger Gültigkeit).</summary>
    (string RawPin, string PinHash, DateTime ExpiresAt) GeneratePin(TimeSpan validity);

    /// <summary>Erzeugt einen neuen Reset-Token, dessen Hash zur Speicherung und sein Ablaufdatum.</summary>
    (string RawResetToken, string ResetTokenHash, DateTime ExpiresAt) GenerateResetToken();

    string HashPin(string rawPin);

    string HashResetToken(string rawResetToken);
}
