namespace CMSMicroservice.Domain.Common;

/// <summary>
/// تنظیمات ثابت سیستم - Static و در مموری
/// این مقادیر هرگز تغییر نمی‌کنند و نیازی به جدول ندارند
/// </summary>
public static class SystemConstants
{
    #region Network Settings
    
    /// <summary>
    /// اجازه حذف والدین که فرزند دارند
    /// </summary>
    public const bool NetworkAllowOrphanNodes = false;
    
    /// <summary>
    /// حداکثر تعداد فرزند مستقیم در هر پا
    /// </summary>
    public const int NetworkMaxChildrenPerLeg = 1;
    
    #endregion

    #region Club Settings
    
    /// <summary>
    /// مبلغ هدیه حق عضویت باشگاه (ریال) - این مبلغ از کیف پول کم نمی‌شود
    /// </summary>
    public const long ClubMembershipGiftValue = 25_200_000;
    
    /// <summary>
    /// هزینه فعال‌سازی عضویت باشگاه (ریال)
    /// </summary>
    public const long ClubActivationFee = 25_200_000;
    
    #endregion

    #region Package Settings
    
    /// <summary>
    /// مبلغ پکیج طلایی / پایه (ریال) - 56 میلیون تومان
    /// شامل: هدیه باشگاه + هزینه فعال‌سازی + مزایای دیگر
    /// </summary>
    public const long BasePackageAmount = 56_000_000;
    
    /// <summary>
    /// مبلغ وام دایا (ریال) - همان مبلغ پکیج طلایی
    /// </summary>
    public const long DayaLoanAmount = 56_000_000;
    
    #endregion

    #region Commission Settings
    
    /// <summary>
    /// امکان برداشت نقدی فعال باشد
    /// </summary>
    public const bool CommissionCashWithdrawalEnabled = true;
    
    /// <summary>
    /// حداقل مبلغ برداشت (ریال)
    /// </summary>
    public const long CommissionMinWithdrawalAmount = 1_000_000;
    
    /// <summary>
    /// سقف تعادل هفتگی برای هر دست (چپ یا راست) - حداکثر کل = 600
    /// </summary>
    public const int CommissionMaxWeeklyBalancesPerLeg = 300;
    
    /// <summary>
    /// حداکثر عمق شبکه برای محاسبه کمیسیون (تعداد لول زیرمجموعه)
    /// </summary>
    public const int CommissionMaxNetworkLevel = 15;
    
    /// <summary>
    /// روش محاسبه (ORM یا SP)
    /// </summary>
    public const string CommissionCalculationStrategy = "SP";
    
    #endregion

    #region System Settings
    
    /// <summary>
    /// حالت تعمیر و نگهداری سیستم
    /// </summary>
    public const bool SystemMaintenanceMode = false;
    
    /// <summary>
    /// فعال‌سازی لاگ تغییرات
    /// </summary>
    public const bool SystemEnableAuditLog = true;
    
    #endregion

    #region Shop Settings
    
    /// <summary>
    /// مالیات بر ارزش افزوده (10%)
    /// </summary>
    public const decimal ShopVAT = 0.1m;
    
    /// <summary>
    /// مالیات فعال است؟
    /// </summary>
    public const bool ShopVATEnabled = true;
    
    #endregion
    
    #region Helper Methods
    
    /// <summary>
    /// دریافت مقدار به صورت دیکشنری برای نمایش در Admin Panel
    /// </summary>
    public static Dictionary<string, object> GetAllAsDict()
    {
        return new Dictionary<string, object>
        {
            // Network
            ["Network.AllowOrphanNodes"] = NetworkAllowOrphanNodes,
            ["Network.MaxChildrenPerLeg"] = NetworkMaxChildrenPerLeg,
            
            // Club
            ["Club.MembershipGiftValue"] = ClubMembershipGiftValue,
            ["Club.ActivationFee"] = ClubActivationFee,
            
            // Commission
            ["Commission.CashWithdrawalEnabled"] = CommissionCashWithdrawalEnabled,
            ["Commission.MinWithdrawalAmount"] = CommissionMinWithdrawalAmount,
            ["Commission.MaxWeeklyBalancesPerLeg"] = CommissionMaxWeeklyBalancesPerLeg,
            ["Commission.MaxNetworkLevel"] = CommissionMaxNetworkLevel,
            ["Commission.CalculationStrategy"] = CommissionCalculationStrategy,
            
            // System
            ["System.MaintenanceMode"] = SystemMaintenanceMode,
            ["System.EnableAuditLog"] = SystemEnableAuditLog,
            
            // Shop
            ["Shop.VAT"] = ShopVAT,
            ["Shop.VATEnabled"] = ShopVATEnabled
        };
    }
    
    /// <summary>
    /// دریافت لیست تنظیمات با توضیحات
    /// </summary>
    public static List<(string Key, object Value, string Description)> GetAllWithDescriptions()
    {
        return new List<(string Key, object Value, string Description)>
        {
            // Network
            ("Network.AllowOrphanNodes", NetworkAllowOrphanNodes, "اجازه حذف والدین که فرزند دارند"),
            ("Network.MaxChildrenPerLeg", NetworkMaxChildrenPerLeg, "حداکثر تعداد فرزند مستقیم در هر پا"),
            
            // Club
            ("Club.MembershipGiftValue", ClubMembershipGiftValue, "مبلغ هدیه حق عضویت باشگاه (ریال)"),
            ("Club.ActivationFee", ClubActivationFee, "هزینه فعال‌سازی عضویت باشگاه (ریال)"),
            
            // Commission
            ("Commission.CashWithdrawalEnabled", CommissionCashWithdrawalEnabled, "امکان برداشت نقدی فعال باشد"),
            ("Commission.MinWithdrawalAmount", CommissionMinWithdrawalAmount, "حداقل مبلغ برداشت (ریال)"),
            ("Commission.MaxWeeklyBalancesPerLeg", CommissionMaxWeeklyBalancesPerLeg, "سقف تعادل هفتگی برای هر دست"),
            ("Commission.MaxNetworkLevel", CommissionMaxNetworkLevel, "حداکثر عمق شبکه برای محاسبه کمیسیون"),
            ("Commission.CalculationStrategy", CommissionCalculationStrategy, "روش محاسبه (ORM/SP)"),
            
            // System
            ("System.MaintenanceMode", SystemMaintenanceMode, "حالت تعمیر و نگهداری سیستم"),
            ("System.EnableAuditLog", SystemEnableAuditLog, "فعال‌سازی لاگ تغییرات"),
            
            // Shop
            ("Shop.VAT", ShopVAT, "مالیات بر ارزش افزوده"),
            ("Shop.VATEnabled", ShopVATEnabled, "مالیات فعال است؟")
        };
    }
    
    #endregion
}
