namespace CMSMicroservice.Domain.Entities.Commission;

/// <summary>
/// پرداخت کمیسیون به کاربران
/// </summary>
public class UserCommissionPayout : BaseAuditableEntity
{
    /// <summary>
    /// شناسه کاربر
    /// </summary>
    public long UserId { get; set; }

    /// <summary>
    /// User Navigation Property
    /// </summary>
    public virtual User User { get; set; }


    /// <summary>
    /// شناسه تعریف هفته (کلید خارجی به WeekDefinition)
    /// </summary>
    public long WeekDefinitionId { get; set; }

    /// <summary>
    /// WeekDefinition Navigation Property
    /// </summary>
    public virtual WeekDefinition WeekDefinition { get; set; }

    /// <summary>
    /// شناسه استخر هفتگی
    /// </summary>
    public long WeeklyPoolId { get; set; }

    /// <summary>
    /// WeeklyCommissionPool Navigation Property
    /// </summary>
    public virtual WeeklyCommissionPool WeeklyPool { get; set; }

    /// <summary>
    /// شناسه پکیج (کمیسیون هر پکیج جداگانه)
    /// </summary>
    public long PackageId { get; set; }

    /// <summary>
    /// Package Navigation Property
    /// </summary>
    public virtual Package Package { get; set; }

    /// <summary>
    /// تعداد امتیازی که کاربر داشت
    /// </summary>
    public int BalancesEarned { get; set; }

    /// <summary>
    /// ارزش هر امتیاز (ریال)
    /// </summary>
    public long ValuePerBalance { get; set; }

    /// <summary>
    /// مبلغ کل: BalancesEarned × ValuePerBalance
    /// </summary>
    public long TotalAmount { get; set; }

    /// <summary>
    /// وضعیت پرداخت
    /// </summary>
    public CommissionPayoutStatus Status { get; set; }

    /// <summary>
    /// تاریخ واریز به کیف پول
    /// </summary>
    public DateTime? PaidAt { get; set; }

    /// <summary>
    /// روش برداشت (اگر کاربر درخواست برداشت داده)
    /// </summary>
    public WithdrawalMethod? WithdrawalMethod { get; set; }

    /// <summary>
    /// شماره شبای برداشت (اگر نقدی)
    /// </summary>
    public string? IbanNumber { get; set; }

    /// <summary>
    /// تاریخ برداشت نقدی/الماس
    /// </summary>
    public DateTime? WithdrawnAt { get; set; }

    /// <summary>
    /// شناسه ادمینی که درخواست را پردازش کرد
    /// </summary>
    public string? ProcessedBy { get; set; }

    /// <summary>
    /// تاریخ پردازش توسط ادمین
    /// </summary>
    public DateTime? ProcessedAt { get; set; }

    /// <summary>
    /// دلیل رد (در صورت رد شدن)
    /// </summary>
    public string? RejectionReason { get; set; }

    /// <summary>
    /// شماره مرجع بانک (بعد از واریز موفق)
    /// </summary>
    public string? BankReferenceId { get; set; }

    /// <summary>
    /// کد پیگیری بانکی
    /// </summary>
    public string? BankTrackingCode { get; set; }

    /// <summary>
    /// دلیل خطا در پرداخت (اگر ناموفق باشد)
    /// </summary>
    public string? PaymentFailureReason { get; set; }

    /// <summary>
    /// CommissionPayoutHistory Collection Navigation Reference
    /// </summary>
    public virtual ICollection<CommissionPayoutHistory>? CommissionPayoutHistories { get; set; }
}
