namespace CMSMicroservice.Domain.Entities.Network;

/// <summary>
/// تعادل‌های هفتگی شبکه باینری
/// </summary>
public class NetworkWeeklyBalance : 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 PackageId { get; set; }

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

    /// <summary>
    /// تعداد اعضای جدید شاخه چپ در این هفته
    /// </summary>
    public int LeftLegNewMembers { get; set; }

    /// <summary>
    /// تعداد اعضای جدید شاخه راست در این هفته
    /// </summary>
    public int RightLegNewMembers { get; set; }

    /// <summary>
    /// باقیمانده شاخه چپ از هفته قبل (Carryover)
    /// </summary>
    public int LeftLegCarryover { get; set; }

    /// <summary>
    /// باقیمانده شاخه راست از هفته قبل (Carryover)
    /// </summary>
    public int RightLegCarryover { get; set; }

    /// <summary>
    /// مجموع شاخه چپ: LeftLegNewMembers + LeftLegCarryover
    /// </summary>
    public int LeftLegTotal { get; set; }

    /// <summary>
    /// مجموع شاخه راست: RightLegNewMembers + RightLegCarryover
    /// </summary>
    public int RightLegTotal { get; set; }

    /// <summary>
    /// تعداد تعادل (امتیاز): MIN(LeftLegTotal, RightLegTotal)
    /// </summary>
    public int TotalBalances { get; set; }

    /// <summary>
    /// باقیمانده شاخه چپ برای هفته بعد
    /// </summary>
    public int LeftLegRemainder { get; set; }

    /// <summary>
    /// باقیمانده شاخه راست برای هفته بعد
    /// </summary>
    public int RightLegRemainder { get; set; }

    /// <summary>
    /// مقدار فلش هر طرف (بعد از اعمال Cap): TotalBalances - CappedBalances
    /// </summary>
    public int FlushedPerSide { get; set; }

    /// <summary>
    /// مجموع فلش از دو طرف: FlushedPerSide × 2
    /// این مقدار از دست می‌رود (نه به هفته بعد، نه به کمیسیون)
    /// </summary>
    public int TotalFlushed { get; set; }

    /// <summary>
    /// مجموع تعادل زیرمجموعه این کاربر (تا 15 لول پایین‌تر)
    /// این مقدار در CalculateWeeklyBalances محاسبه و ذخیره می‌شود
    /// </summary>
    public int SubordinateBalances { get; set; }

    /// <summary>
    /// [DEPRECATED] تعداد تعادل شاخه چپ - استفاده نشود
    /// </summary>
    [Obsolete("Use LeftLegTotal instead")]
    public int LeftLegBalances { get; set; }

    /// <summary>
    /// [DEPRECATED] تعداد تعادل شاخه راست - استفاده نشود
    /// </summary>
    [Obsolete("Use RightLegTotal instead")]
    public int RightLegBalances { get; set; }

    /// <summary>
    /// مبلغی که از این کاربر به استخر هفتگی اضافه شد (ریال)
    /// </summary>
    public long WeeklyPoolContribution { get; set; }

    /// <summary>
    /// زمان محاسبه توسط Worker
    /// </summary>
    public DateTime? CalculatedAt { get; set; }

    /// <summary>
    /// آیا منقضی شده (بعد از توزیع کمیسیون)
    /// </summary>
    public bool IsExpired { get; set; }
}
