using System;

namespace Database.Database;

/// <summary>
/// Entity cho bảng EXCHANGE_OTP - Lưu mã OTP cho xác thực rút thưởng
/// </summary>
public partial class ExchangeOtp
{
    /// <summary>
    /// Primary Key - ID OTP
    /// </summary>
    public decimal Id { get; set; }

    /// <summary>
    /// Số điện thoại nhận OTP
    /// </summary>
    public string Msisdn { get; set; } = null!;

    /// <summary>
    /// Mã OTP 6 số
    /// </summary>
    public string OtpCode { get; set; } = null!;

    /// <summary>
    /// ID gói đổi thưởng (tham chiếu EXCHANGE_CONFIG.ID)
    /// </summary>
    public decimal? ConfigId { get; set; }

    /// <summary>
    /// Số Coin yêu cầu đổi (snapshot lúc tạo OTP)
    /// </summary>
    public decimal? CoinAmount { get; set; }

    /// <summary>
    /// Số tiền HTG sẽ nhận (snapshot)
    /// </summary>
    public decimal? MoneyAmount { get; set; }

    /// <summary>
    /// Thời điểm tạo mã OTP
    /// </summary>
    public DateTime CreatedTime { get; set; }

    /// <summary>
    /// Thời điểm hết hạn OTP (default +5 phút)
    /// </summary>
    public DateTime? ExpiredTime { get; set; }

    /// <summary>
    /// Thời điểm OTP được verify thành công
    /// </summary>
    public DateTime? VerifiedTime { get; set; }

    /// <summary>
    /// Trạng thái: 0-Pending, 1-Verified, 2-Expired, 3-Failed (sai quá nhiều)
    /// </summary>
    public byte? Status { get; set; }

    /// <summary>
    /// Số lần nhập sai OTP (max 3 lần)
    /// </summary>
    public byte? AttemptCount { get; set; }

    /// <summary>
    /// IP address để audit/chống fraud
    /// </summary>
    public string? IpAddress { get; set; }
}

/// <summary>
/// Enum trạng thái OTP
/// </summary>
public static class ExchangeOtpStatus
{
    public const byte Pending = 0;      // Đang chờ xác thực
    public const byte Verified = 1;     // Đã xác thực thành công
    public const byte Expired = 2;      // Đã hết hạn
    public const byte Failed = 3;       // Bị khóa do sai quá nhiều
}
