using CMSMicroservice.Protobuf.Protos;
using CMSMicroservice.Protobuf.Protos.Commission;
using Microsoft.AspNetCore.Components;
using MudBlazor;
using Google.Protobuf.WellKnownTypes;
using BackOffice.Pages.Commission.Components;
using BackOffice.Services;

namespace BackOffice.Pages.Commission;

public partial class UserPayouts
{
    [Inject] public CommissionContract.CommissionContractClient CommissionContract { get; set; }
    [Inject] public IPersianDateTimeService PersianDateTime { get; set; }

    private MudDataGrid<UserCommissionPayoutModel> _gridData;
    private long? _filterUserId;
    private long? _filterWeekDefinitionId;
    private int? _filterStatus;
    private long? _filterPackageId;
    private bool _isCreditingWallets;

    private async Task<GridData<UserCommissionPayoutModel>> ServerReload(GridState<UserCommissionPayoutModel> state)
    {
        try
        {
            // CMS proto uses flat fields instead of nested PaginationState/Filter
            var request = new GetUserCommissionPayoutsRequest
            {
                PageIndex = state.Page + 1,
                PageSize = state.PageSize
            };

            if (_filterUserId.HasValue && _filterUserId.Value > 0)
            {
                request.UserId = _filterUserId.Value;
            }

            if (_filterWeekDefinitionId.HasValue && _filterWeekDefinitionId.Value > 0)
            {
                request.WeekDefinitionId = _filterWeekDefinitionId.Value;
            }

            if (_filterStatus.HasValue)
            {
                request.Status = _filterStatus.Value;
            }

            if (_filterPackageId.HasValue && _filterPackageId.Value > 0)
            {
                request.PackageId = _filterPackageId.Value;
            }

            var result = await CommissionContract.GetUserCommissionPayoutsAsync(request);

            if (result?.Models != null && result.Models.Any())
            {
                return new GridData<UserCommissionPayoutModel>
                {
                    Items = result.Models.ToList(),
                    TotalItems = (int)result.MetaData.TotalCount
                };
            }

            return new GridData<UserCommissionPayoutModel>();
        }
        catch (Exception ex)
        {
            Snackbar.Add($"خطا در بارگذاری داده‌ها: {ex.Message}", Severity.Error);
            return new GridData<UserCommissionPayoutModel>();
        }
    }

    private async Task ApplyFilter()
    {
        if (_gridData != null)
        {
            await _gridData.ReloadServerData();
        }
    }

    private Color GetStatusColor(int status)
    {
        return status switch
        {
            0 => Color.Warning,   // Pending - در انتظار
            1 => Color.Success,   // Paid - پرداخت شده
            2 => Color.Info,      // WithdrawRequested - درخواست برداشت
            3 => Color.Primary,   // Withdrawn - برداشت شده
            4 => Color.Error,     // PaymentFailed - شکست خورده
            5 => Color.Dark,      // Cancelled - لغو شده
            _ => Color.Default
        };
    }

    private string GetStatusText(int status)
    {
        return status switch
        {
            0 => "در انتظار",
            1 => "پرداخت شده",
            2 => "درخواست برداشت",
            3 => "برداشت شده",
            4 => "شکست خورده",
            5 => "لغو شده",
            _ => "نامشخص"
        };
    }

    private async Task ViewDetails(UserCommissionPayoutModel payout)
    {
        var parameters = new DialogParameters
        {
            ["Payout"] = payout
        };

        await DialogService.ShowAsync<PayoutDetailsDialog>("جزئیات Payout", parameters, new DialogOptions
        {
            CloseButton = true,
            MaxWidth = MaxWidth.Medium,
            FullWidth = true
        });
    }

    private async Task ApproveWithdrawal(UserCommissionPayoutModel payout)
    {
        var confirmed = await DialogService.ShowMessageBox(
            "تایید برداشت",
            $"آیا از تایید برداشت برای کاربر {payout.UserName} (مبلغ: {payout.TotalAmount:N0} تومان) مطمئن هستید؟",
            yesText: "تایید", cancelText: "لغو");

        if (confirmed == true)
        {
            try
            {
                await CommissionContract.ProcessWithdrawalAsync(new ProcessWithdrawalRequest
                {
                    PayoutId = payout.Id,
                    IsApproved = true
                });
                Snackbar.Add("درخواست برداشت با موفقیت تایید شد", Severity.Success);
                await ApplyFilter();
            }
            catch (Exception ex)
            {
                Snackbar.Add($"خطا در تایید: {ex.Message}", Severity.Error);
            }
        }
    }

    private async Task BulkCreditWallets()
    {
        if (!_filterWeekDefinitionId.HasValue)
        {
            Snackbar.Add("لطفاً ابتدا یک هفته انتخاب کنید", Severity.Warning);
            return;
        }

        var confirmed = await DialogService.ShowMessageBox(
            "واریز دسته‌جمعی به کیف پول",
            $"آیا از واریز کمیسیون همه پرداخت‌های «در انتظار» هفته انتخاب‌شده به کیف پول کاربران مطمئن هستید؟ این عملیات برگشت‌پذیر نیست.",
            yesText: "بله، واریز کن", cancelText: "لغو");

        if (confirmed != true)
            return;

        _isCreditingWallets = true;
        StateHasChanged();

        try
        {
            var result = await CommissionContract.BulkCreditPayoutsAsync(new BulkCreditPayoutsRequest
            {
                WeekDefinitionId = _filterWeekDefinitionId.Value
            });

            if (result.CreditedCount == 0)
                Snackbar.Add("هیچ پرداخت در انتظاری برای این هفته یافت نشد", Severity.Info);
            else
                Snackbar.Add(result.Message, Severity.Success);

            await ApplyFilter();
        }
        catch (Exception ex)
        {
            Snackbar.Add($"خطا در واریز: {ex.Message}", Severity.Error);
        }
        finally
        {
            _isCreditingWallets = false;
            StateHasChanged();
        }
    }

    private async Task RejectWithdrawal(UserCommissionPayoutModel payout)
    {
        var reason = await DialogService.ShowMessageBox(
            "رد برداشت",
            $"آیا از رد برداشت برای کاربر {payout.UserName} مطمئن هستید؟",
            yesText: "رد کردن", cancelText: "لغو");

        if (reason == true)
        {
            try
            {
                await CommissionContract.ProcessWithdrawalAsync(new ProcessWithdrawalRequest
                {
                    PayoutId = payout.Id,
                    IsApproved = false,
                    Reason = "رد شده توسط ادمین"
                });
                Snackbar.Add("درخواست برداشت رد شد", Severity.Warning);
                await ApplyFilter();
            }
            catch (Exception ex)
            {
                Snackbar.Add($"خطا در رد: {ex.Message}", Severity.Error);
            }
        }
    }
}
