@page "/payment/manual-payments"
@using CMSMicroservice.Protobuf.Protos.ManualPayment
@using BackOffice.Pages.Payment.Components
@using BackOffice.Common.BaseComponents
@using BackOffice.Pages.AutoComplete

<BasePageComponent @ref="_basePage" OnSubmitClick="OnFilterSubmit" OnClearFilterClick="OnFilterCleared">
    <Filters>
        <MudItem xs="12" sm="6" md="3">
            <UserAutoComplete Label="جستجوی کاربر" @bind-SelectedUserId="_userIdFilter" />
        </MudItem>
        <MudItem xs="12" sm="6" md="3">
            <MudTextField T="string" Label="شماره مرجع" Variant="Variant.Outlined"
                          Margin="Margin.Dense" @bind-Value="_referenceFilter" />
        </MudItem>
        <MudItem xs="12" sm="6" md="3">
            <MudSelect T="int?" Clearable="true" Label="وضعیت" Variant="Variant.Outlined"
                       Margin="Margin.Dense" @bind-Value="_statusFilter">
                <MudSelectItem T="int?" Value="@(0)">در انتظار</MudSelectItem>
                <MudSelectItem T="int?" Value="@(1)">تایید شده</MudSelectItem>
                <MudSelectItem T="int?" Value="@(2)">رد شده</MudSelectItem>
                <MudSelectItem T="int?" Value="@(3)">لغو شده</MudSelectItem>
            </MudSelect>
        </MudItem>
        <MudItem xs="12" sm="6" md="3">
            <MudSelect T="int?" Clearable="true" Label="نوع" Variant="Variant.Outlined"
                       Margin="Margin.Dense" @bind-Value="_typeFilter">
                <MudSelectItem T="int?" Value="@(1)">واریز نقدی</MudSelectItem>
                <MudSelectItem T="int?" Value="@(2)">شارژ کیف پول اعتباری</MudSelectItem>
                <MudSelectItem T="int?" Value="@(3)">شارژ پاداش تیمی</MudSelectItem>
                <MudSelectItem T="int?" Value="@(4)">تسویه حساب</MudSelectItem>
                <MudSelectItem T="int?" Value="@(5)">اصلاح خطا</MudSelectItem>
                <MudSelectItem T="int?" Value="@(6)">بازگشت وجه</MudSelectItem>
                <MudSelectItem T="int?" Value="@(99)">سایر</MudSelectItem>
            </MudSelect>
        </MudItem>
    </Filters>
    <Content>
        <MudDataGrid @ref="_dataGrid" T="ManualPaymentModel"
                     ServerData="LoadData"
                     Hover="true" Dense="true"
                     Height="calc(100vh - 240px)">
            <ToolBarContent>
                <MudText Typo="Typo.subtitle1">فعالسازی (پرداخت) دستی</MudText>
                <MudSpacer />
                <MudButton Variant="Variant.Outlined" Color="Color.Info" Size="Size.Small"
                           StartIcon="@Icons.Material.Filled.FileDownload" OnClick="ExportToExcel" Class="mr-2">
                    خروجی Excel
                </MudButton>
                <MudButton Variant="Variant.Filled" Color="Color.Primary" Size="Size.Small"
                           StartIcon="@Icons.Material.Filled.Add" OnClick="OpenCreateDialog">
                    ثبت جدید
                </MudButton>
            </ToolBarContent>
            <Columns>
                <PropertyColumn Property="x => x.Id" Title="شناسه" />
                <PropertyColumn Property="x => x.UserId" Title="شناسه کاربر" />
                <PropertyColumn Property="x => x.UserFullName" Title="نام کاربر" />
                <PropertyColumn Property="x => x.Amount" Title="مبلغ">
                    <CellTemplate>
                        @context.Item.Amount.ToString("N0")
                    </CellTemplate>
                </PropertyColumn>
                <TemplateColumn Title="نوع">
                    <CellTemplate>
                        @GetTypeText((int)context.Item.Type)
                    </CellTemplate>
                </TemplateColumn>
                <TemplateColumn Title="وضعیت">
                    <CellTemplate>
                        <MudChip T="string"
                                 Size="Size.Small"
                                 Color="@GetStatusColor((int)context.Item.Status)">
                            @GetStatusText((int)context.Item.Status)
                        </MudChip>
                    </CellTemplate>
                </TemplateColumn>
                <TemplateColumn Title="تاریخ ایجاد">
                    <CellTemplate>
                        @(context.Item.Created?.ToDateTime().ToLocalTime().MiladiToJalaliWithTime() ?? "-")
                    </CellTemplate>
                </TemplateColumn>
                <TemplateColumn Title="عملیات">
                    <CellTemplate>
                        <MudStack Row="true" AlignItems="AlignItems.Center" Spacing="1">
                            <MudTooltip Text="جزئیات">
                                <MudIconButton Icon="@Icons.Material.Filled.Info"
                                               Size="Size.Small"
                                               OnClick="@(() => OpenDetails(context.Item))" />
                            </MudTooltip>
                            @if ((int)context.Item.Status == 0)
                            {
                                <MudTooltip Text="تایید">
                                    <MudIconButton Icon="@Icons.Material.Filled.CheckCircle"
                                                   Size="Size.Small" Color="Color.Success"
                                                   OnClick="@(() => ApprovePayment(context.Item))" />
                                </MudTooltip>
                                <MudTooltip Text="رد">
                                    <MudIconButton Icon="@Icons.Material.Filled.Cancel"
                                                   Size="Size.Small" Color="Color.Error"
                                                   OnClick="@(() => RejectPayment(context.Item))" />
                                </MudTooltip>
                            }
                        </MudStack>
                    </CellTemplate>
                </TemplateColumn>
            </Columns>
            <NoRecordsContent>
                <MudAlert Severity="Severity.Info" Dense="true" Variant="Variant.Text" Class="my-4">موردی یافت نشد.</MudAlert>
            </NoRecordsContent>
            <PagerContent>
                <MudDataGridPager T="ManualPaymentModel" PageSizeOptions="@(new int[] { 20, 50, 100 })"
                                  InfoFormat="سطر {first_item} تا {last_item} از {all_items}"
                                  RowsPerPageString="تعداد در صفحه" />
            </PagerContent>
        </MudDataGrid>
    </Content>
</BasePageComponent>

@code {
    [Inject] public CMSMicroservice.Protobuf.Protos.ManualPayment.ManualPaymentContract.ManualPaymentContractClient ManualPaymentClient { get; set; } = default!;
    // DialogService is injected via _Imports.razor

    private BasePageComponent? _basePage;
    private MudDataGrid<ManualPaymentModel>? _dataGrid;
    private long? _userIdFilter;
    private string? _referenceFilter;
    private int? _statusFilter;
    private int? _typeFilter;

    private async Task<GridData<ManualPaymentModel>> LoadData(GridState<ManualPaymentModel> state)
    {
        var pageNumber = state.Page + 1;
        var pageSize = state.PageSize;

        var request = new GetAllManualPaymentsRequest
        {
            PageNumber = pageNumber,
            PageSize = pageSize
        };

        if (_userIdFilter.HasValue)
        {
            request.UserId = _userIdFilter.Value;
        }

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

        if (_typeFilter.HasValue)
        {
            request.Type = _typeFilter.Value;
        }

        var response = await ManualPaymentClient.GetAllManualPaymentsAsync(request);

        return new GridData<ManualPaymentModel>
        {
            Items = response.Models.ToList(),
            TotalItems = (int)response.MetaData.TotalCount
        };
    }

    private async Task OnFilterSubmit()
    {
        if (_dataGrid != null)
            await _dataGrid.ReloadServerData();
    }

    private async Task OnFilterCleared()
    {
        _userIdFilter = null;
        _referenceFilter = null;
        _statusFilter = null;
        _typeFilter = null;
        if (_dataGrid != null)
            await _dataGrid.ReloadServerData();
    }

    private async Task OpenCreateDialog()
    {
        var parameters = new DialogParameters
        {
            { nameof(ManualPaymentDialog.Mode), ManualPaymentDialogMode.Create }
        };

        var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Medium, FullWidth = true };

        var dialog = DialogService.Show<ManualPaymentDialog>("ثبت پرداخت دستی", parameters, options);
        var result = await dialog.Result;
        if (result is { Canceled: false } && _dataGrid != null)
        {
            await _dataGrid.ReloadServerData();
        }
    }

    private async Task OpenDetails(ManualPaymentModel model)
    {
        var parameters = new DialogParameters
        {
            { nameof(ManualPaymentDialog.Mode), ManualPaymentDialogMode.Details },
            { nameof(ManualPaymentDialog.Model), model }
        };

        var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small, FullWidth = true };

        var dialog = DialogService.Show<ManualPaymentDialog>($"جزئیات پرداخت دستی #{model.Id}", parameters, options);
        var result = await dialog.Result;
        if (result is { Canceled: false } && _dataGrid != null)
        {
            await _dataGrid.ReloadServerData();
        }
    }

    private static string GetTypeText(int type)
    {
        return type switch
        {
            1 => "واریز نقدی",
            2 => "شارژ کیف پول اعتباری",
            3 => "شارژ پاداش تیمی",
            4 => "تسویه حساب",
            5 => "اصلاح خطا",
            6 => "بازگشت وجه",
            99 => "سایر",
            _ => "نامشخص"
        };
    }

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

    private static Color GetStatusColor(int status)
    {
        return status switch
        {
            0 => Color.Warning,
            1 => Color.Success,
            2 => Color.Error,
            3 => Color.Default,
            _ => Color.Default
        };
    }

    private async Task ApprovePayment(ManualPaymentModel model)
    {
        bool? confirm = await DialogService.ShowMessageBox(
            "تایید پرداخت",
            $"آیا از تایید پرداخت دستی #{model.Id} به مبلغ {model.Amount:N0} تومان مطمئن هستید؟",
            yesText: "تایید", cancelText: "لغو");
        if (confirm == true)
        {
            try
            {
                await ManualPaymentClient.ApproveManualPaymentAsync(new ApproveManualPaymentRequest { ManualPaymentId = model.Id });
                Snackbar.Add("پرداخت با موفقیت تایید شد", Severity.Success);
                if (_dataGrid != null) await _dataGrid.ReloadServerData();
            }
            catch (Exception ex)
            {
                Snackbar.Add($"خطا: {ex.Message}", Severity.Error);
            }
        }
    }

    private async Task RejectPayment(ManualPaymentModel model)
    {
        bool? confirm = await DialogService.ShowMessageBox(
            "رد پرداخت",
            $"آیا از رد پرداخت دستی #{model.Id} مطمئن هستید؟",
            yesText: "رد کردن", cancelText: "لغو");
        if (confirm == true)
        {
            try
            {
                await ManualPaymentClient.RejectManualPaymentAsync(new RejectManualPaymentRequest { ManualPaymentId = model.Id });
                Snackbar.Add("پرداخت رد شد", Severity.Warning);
                if (_dataGrid != null) await _dataGrid.ReloadServerData();
            }
            catch (Exception ex)
            {
                Snackbar.Add($"خطا: {ex.Message}", Severity.Error);
            }
        }
    }
}
