using CMSMicroservice.Domain.Common;
using CMSMicroservice.Domain.Enums;

namespace CMSMicroservice.Domain.Entities.Club;

/// <summary>
/// دوره خرید پکیج — هر بار خرید پکیج ۵۶M یک Cycle جدید ایجاد می‌شود.
/// برای حل مشکل overwrite شدن ClubMembership.ActivatedAt در محاسبه کمیسیون.
/// </summary>
public class ClubMembershipCycle : BaseAuditableEntity
    // , IHasHistory<History.ClubMembershipCycleHistory>
{
    /// <summary>
    /// شناسه کاربر
    /// </summary>
    public long UserId { get; set; }

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

    /// <summary>
    /// شناسه عضویت باشگاه
    /// </summary>
    public long ClubMembershipId { get; set; }

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

    /// <summary>
    /// شماره دور (1, 2, 3, ...)
    /// </summary>
    public int CycleNumber { get; set; }

    /// <summary>
    /// تاریخ خرید پکیج — این فیلد برای محاسبه کمیسیون هفتگی استفاده می‌شود
    /// (به‌جای ClubMembership.ActivatedAt که overwrite می‌شد)
    /// </summary>
    public DateTime PackagePurchasedAt { get; set; }

    /// <summary>
    /// تاریخ شروع حالت جادویی (وقتی Balance=0 شد)
    /// </summary>
    public DateTime? MagicStartedAt { get; set; }

    /// <summary>
    /// تاریخ پایان حالت جادویی
    /// </summary>
    public DateTime? MagicCompletedAt { get; set; }

    /// <summary>
    /// نحوه خرید پکیج در این دور
    /// </summary>
    public PackagePurchaseMethod PurchaseMethod { get; set; }

    /// <summary>
    /// مبلغ پکیج (ریال)
    /// </summary>
    public long PackageAmount { get; set; }

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

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

    /// <summary>
    /// آیا این دور فعلی است؟ فقط یک رکورد true می‌باشد
    /// </summary>
    public bool IsCurrentCycle { get; set; }

    /// <summary>تاریخچه تغییرات دوره (Q27)</summary>
    public virtual ICollection<History.ClubMembershipCycleHistory>? CycleHistories { get; set; }

    /// <summary>
    /// ساخت snapshot تاریخچه از وضعیت فعلی چرخه.
    /// مقادیر New* از وضعیت فعلی پر می‌شوند.
    /// مقادیر Old* توسط HistoryTrackingSaveChangesInterceptor از OriginalValues پر می‌شوند.
    /// </summary>
    // public History.ClubMembershipCycleHistory CreateHistorySnapshot(string action, string? performedBy)
    // {
    //     return new History.ClubMembershipCycleHistory
    //     {
    //         ClubMembershipCycleId = Id,
    //         UserId = UserId,
    //         CycleNumber = CycleNumber,
    //         NewIsCurrentCycle = IsCurrentCycle,
    //         NewMagicStartedAt = MagicStartedAt,
    //         NewMagicCompletedAt = MagicCompletedAt,
    //         Action = Enum.TryParse<ClubMembershipCycleAction>(action, out var a)
    //             ? a
    //             : ClubMembershipCycleAction.ManualFix,
    //         PerformedBy = performedBy
    //     };
    // }
}
