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 Commission Settings
    
    /// <summary>
    /// امکان برداشت نقدی فعال باشد
    /// </summary>
    public const bool CommissionCashWithdrawalEnabled = true;
    
    /// <summary>
    /// حداقل مبلغ برداشت (ریال)
    /// </summary>
    public const long CommissionMinWithdrawalAmount = 1_000_000;
    
    /// <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 Magic Wallet Settings

    // Per-package magic wallet settings are now in Package entity:
    // Package.MagicWalletMultiplier, Package.MagicWalletMaxDeposit, Package.MagicWalletMaxCredit

    /// <summary>
    /// آستانه ورود/خروج کیف‌پول جادویی (ریال).
    /// وقتی موجودی کیف‌پول به این مقدار یا کمتر برسد، تریگر Entry/Exit اجرا می‌شود.
    /// مقدار ۱٬۰۰۰٬۰۰۰ ریال = ۱۰۰ هزار تومان
    /// (Q24: چون قیمت محصولات متفاوت است، موجودی دقیقاً صفر نمی‌شود)
    /// </summary>
    public const long MagicWalletEntryThreshold = 100_000;

    /// <summary>
    /// مقدار پیش‌فرض ضریب جادویی وقتی پکیج یافت نشود (بازگشت به پایه)
    /// </summary>
    public const double MagicWalletDefaultMultiplier = 2.5;

    /// <summary>
    /// مقدار پیش‌فرض حداکثر واریز جادویی وقتی پکیج یافت نشود (ریال)
    /// </summary>
    public const long MagicWalletDefaultMaxDeposit = 100_000_000;

    /// <summary>
    /// مقدار پیش‌فرض حداکثر اعتبار جادویی وقتی پکیج یافت نشود (ریال)
    /// </summary>
    public const long MagicWalletDefaultMaxCredit = 250_000_000;

    #endregion

    #region Wallet Validation Settings

    /// <summary>
    /// حداکثر مبلغ مجاز در ولیدیتور (حصار ایمنی — مقدار واقعی از پکیج خوانده می‌شود).
    /// ۱۰ میلیارد ریال = ۱ میلیارد تومان
    /// </summary>
    public const long WalletMaxSafeAmount = 10_000_000_000;

    /// <summary>
    /// حداقل مبلغ شارژ جادویی (ریال) — ۱۰۰٬۰۰۰ ریال = ۱۰ هزار تومان
    /// </summary>
    public const long MagicWalletMinCharge = 100_000;

    /// <summary>
    /// حداقل مبلغ شارژ تخفیفی (ریال) — ۱۰٬۰۰۰ ریال = ۱ هزار تومان
    /// </summary>
    public const long DiscountWalletMinCharge = 10_000;

    #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
    /// Note: Per-package values (Price, MaxBalancesPerLeg, etc.) are now read from Package entity
    /// via ConfigurationService — only static/global constants remain here.
    /// </summary>
    public static Dictionary<string, object> GetAllAsDict()
    {
        return new Dictionary<string, object>
        {
            // Network
            ["Network.AllowOrphanNodes"] = NetworkAllowOrphanNodes,
            ["Network.MaxChildrenPerLeg"] = NetworkMaxChildrenPerLeg,
            
            // Commission (global settings only — per-package limits are in Package entity)
            ["Commission.CashWithdrawalEnabled"] = CommissionCashWithdrawalEnabled,
            ["Commission.MinWithdrawalAmount"] = CommissionMinWithdrawalAmount,
            ["Commission.CalculationStrategy"] = CommissionCalculationStrategy,
            
            // System
            ["System.MaintenanceMode"] = SystemMaintenanceMode,
            ["System.EnableAuditLog"] = SystemEnableAuditLog,
            
            // Magic Wallet (global threshold)
            ["MagicWallet.EntryThreshold"] = MagicWalletEntryThreshold,
            
            // Shop
            ["Shop.VAT"] = ShopVAT,
            ["Shop.VATEnabled"] = ShopVATEnabled
        };
    }
    
    /// <summary>
    /// دریافت لیست تنظیمات با توضیحات
    /// Note: Per-package values are served from Package entity via ConfigurationService.
    /// </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, "حداکثر تعداد فرزند مستقیم در هر پا"),
            
            // Commission (global settings only)
            ("Commission.CashWithdrawalEnabled", CommissionCashWithdrawalEnabled, "امکان برداشت نقدی فعال باشد"),
            ("Commission.MinWithdrawalAmount", CommissionMinWithdrawalAmount, "حداقل مبلغ برداشت (ریال)"),
            ("Commission.CalculationStrategy", CommissionCalculationStrategy, "روش محاسبه (ORM/SP)"),
            
            // System
            ("System.MaintenanceMode", SystemMaintenanceMode, "حالت تعمیر و نگهداری سیستم"),
            ("System.EnableAuditLog", SystemEnableAuditLog, "فعال‌سازی لاگ تغییرات"),
            
            // Magic Wallet (global threshold)
            ("MagicWallet.EntryThreshold", MagicWalletEntryThreshold, "آستانه ورود/خروج کیف‌پول جادویی (ریال) — Q24"),
            
            // Shop
            ("Shop.VAT", ShopVAT, "مالیات بر ارزش افزوده"),
            ("Shop.VATEnabled", ShopVATEnabled, "مالیات فعال است؟")
        };
    }
    
    #endregion
}
