using OmsorgCore.Domain.Common;

namespace OmsorgCore.Domain.Entities;

/// <summary>
/// Einmal-PIN für den "Passwort vergessen"-Flow. Es wird nie der rohe 6-stellige PIN gespeichert,
/// nur sein SHA-256-Hash (analog RefreshToken.TokenHash). Nach erfolgreicher Verifikation wird ein
/// separater, ebenfalls nur gehashter Reset-Token ausgestellt (ResetTokenHash), der für den
/// abschließenden Passwort-Set-Aufruf gebraucht wird - der PIN selbst wird nie zweimal als
/// Credential verwendet (siehe RefreshToken-Rotationsmuster).
/// </summary>
public class PasswordResetCode : Entity
{
    public Guid UserId { get; set; }
    public User User { get; set; } = null!;

    public string CodeHash { get; set; } = string.Empty;
    public int AttemptCount { get; set; }

    public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
    public DateTime ExpiresAt { get; set; }
    public DateTime? ConsumedAt { get; set; }
    public DateTime? InvalidatedAt { get; set; }

    /// <summary>Nur gesetzt, nachdem der PIN erfolgreich verifiziert wurde (ConsumedAt != null).</summary>
    public string? ResetTokenHash { get; set; }
    public DateTime? ResetTokenExpiresAt { get; set; }
    public DateTime? ResetTokenUsedAt { get; set; }

    public bool IsActive => InvalidatedAt is null && ConsumedAt is null
        && DateTime.UtcNow < ExpiresAt;

    public bool IsResetTokenActive => ResetTokenHash is not null && ResetTokenUsedAt is null
        && ResetTokenExpiresAt is not null && DateTime.UtcNow < ResetTokenExpiresAt;
}
