using Blazored.LocalStorage;
using CMSMicroservice.Protobuf.Protos.UserOrder;
using Microsoft.Extensions.DependencyInjection;

namespace FrontOffice.Main.Utilities;

/// <summary>
/// سرویس مدیریت مالیات بر ارزش افزوده
/// نرخ VAT یک بار در روز از سرور گرفته و در LocalStorage ذخیره می‌شود
/// </summary>
public class VATService
{
    private readonly IServiceProvider _serviceProvider;
    private readonly ILocalStorageService _localStorageService;
    
    private const string VAT_RATE_KEY = "vat_rate";
    private const string VAT_PERCENTAGE_KEY = "vat_percentage";
    private const string VAT_DATE_KEY = "vat_date";
    
    // مقادیر پیش‌فرض (10%)
    private double _vatRate = 0.10;
    private int _vatPercentage = 10;
    private bool _isEnabled = true;
    private bool _isLoaded = false;

    public VATService(IServiceProvider serviceProvider, ILocalStorageService localStorageService)
    {
        _serviceProvider = serviceProvider;
        _localStorageService = localStorageService;
    }

    /// <summary>
    /// نرخ مالیات (مثلاً 0.09)
    /// </summary>
    public double VatRate => _vatRate;
    
    /// <summary>
    /// درصد مالیات (مثلاً 9)
    /// </summary>
    public int VatPercentage => _vatPercentage;
    
    /// <summary>
    /// آیا مالیات فعال است
    /// </summary>
    public bool IsEnabled => _isEnabled;

    /// <summary>
    /// بارگذاری نرخ VAT - اگر امروز گرفته شده از cache، وگرنه از سرور
    /// </summary>
    public async Task LoadAsync()
    {
        if (_isLoaded) return;

        try
        {
            // using var scope = _serviceProvider.CreateScope();
            // var localStorage = scope.ServiceProvider.GetRequiredService<ILocalStorageService>();
            //
            // چک کن آیا امروز قبلاً گرفته شده
            var savedDate = await _localStorageService.GetItemAsStringAsync(VAT_DATE_KEY);
            var today = DateTime.Today.ToString("yyyy-MM-dd");

            if (savedDate == today)
            {
                // از cache بخوان
                var savedRate = await _localStorageService.GetItemAsync<double>(VAT_RATE_KEY);
                var savedPercentage = await _localStorageService.GetItemAsync<int>(VAT_PERCENTAGE_KEY);
                if (savedRate > 0 && savedPercentage > 0)
                {
                    _vatRate = savedRate;
                    _vatPercentage = savedPercentage;
                    _isLoaded = true;
                    return;
                }
            }

            // از سرور بگیر
            await RefreshFromServerAsync();
        }
        catch
        {
            // در صورت خطا از مقادیر پیش‌فرض استفاده شود
            _isLoaded = true;
        }
    }

    /// <summary>
    /// بروزرسانی از سرور و ذخیره در cache
    /// </summary>
    public async Task RefreshFromServerAsync()
    {
        try
        {
            // ایجاد scope برای دریافت client و localStorage
            using var scope = _serviceProvider.CreateScope();
            var client = scope.ServiceProvider.GetRequiredService<CMSMicroservice.Protobuf.Protos.UserOrder.UserOrderContract.UserOrderContractClient>();
            // var localStorage = scope.ServiceProvider.GetRequiredService<ILocalStorageService>();
            
            var response = await client.GetVATRateAsync(new Google.Protobuf.WellKnownTypes.Empty());
            
            _vatRate = response.VatRate;
            _vatPercentage = response.VatPercentage;
            _isEnabled = response.IsEnabled;

            // ذخیره در LocalStorage
            await _localStorageService.SetItemAsync(VAT_RATE_KEY, _vatRate);
            await _localStorageService.SetItemAsync(VAT_PERCENTAGE_KEY, _vatPercentage);
            await _localStorageService.SetItemAsStringAsync(VAT_DATE_KEY, DateTime.Today.ToString("yyyy-MM-dd"));
            
            _isLoaded = true;
        }
        catch
        {
            // مقادیر پیش‌فرض
            _isLoaded = true;
        }
    }

    /// <summary>
    /// محاسبه مبلغ مالیات
    /// </summary>
    public long CalculateVAT(long amount) => _isEnabled ? (long)(amount * _vatRate) : 0;

    /// <summary>
    /// محاسبه قیمت با احتساب مالیات
    /// </summary>
    public long AddVAT(long amount) => _isEnabled ? amount + CalculateVAT(amount) : amount;

    /// <summary>
    /// فرمت قیمت با نمایش مالیات
    /// </summary>
    public string FormatPriceWithVAT(long price)
    {
        var priceWithVat = AddVAT(price);
        return $"{priceWithVat:N0} تومان";
    }
    
    /// <summary>
    /// فرمت قیمت با جزئیات مالیات
    /// </summary>
    public (long BasePrice, long VatAmount, long TotalPrice) GetPriceBreakdown(long basePrice)
    {
        var vatAmount = CalculateVAT(basePrice);
        return (basePrice, vatAmount, basePrice + vatAmount);
    }
}
