@* Merged into /discount-shop *@
@attribute [Authorize(Roles = "Administrator")]

@using MudBlazor
@using BackOffice.Services.DiscountOrder
@using Microsoft.JSInterop
@using System.Text

@inject IDiscountOrderService DiscountOrderService
@inject ISnackbar Snackbar
@inject IJSRuntime JsRuntime

<div>
    <MudText Typo="Typo.h4" GutterBottom="true">
        <MudIcon Icon="@Icons.Material.Filled.BarChart" Class="ml-2" />
        گزارش فروش فروشگاه
    </MudText>
    <MudText Typo="Typo.body2" Color="Color.Secondary" Class="mb-4">
        آمار فروش و وضعیت سفارش‌ها بر اساس بازه تاریخ و وضعیت سفارش
    </MudText>

    <MudPaper Class="pa-4 mb-4">
        <MudGrid>
            <MudItem xs="12" sm="6" md="3">
                <MudDatePicker @bind-Date="_fromDate"
                               Label="از تاریخ"
                               DateFormat="yyyy/MM/dd"
                               Variant="Variant.Outlined"
                               Margin="Margin.Dense" />
            </MudItem>
            <MudItem xs="12" sm="6" md="3">
                <MudDatePicker @bind-Date="_toDate"
                               Label="تا تاریخ"
                               DateFormat="yyyy/MM/dd"
                               Variant="Variant.Outlined"
                               Margin="Margin.Dense" />
            </MudItem>
            <MudItem xs="12" sm="6" md="3">
                <MudSelect @bind-Value="_statusFilter"
                           T="OrderStatus?"
                           Label="وضعیت سفارش"
                           Clearable="true"
                           Variant="Variant.Outlined"
                           Margin="Margin.Dense">
                    <MudSelectItem T="OrderStatus?" Value="@(null as OrderStatus?)">همه وضعیت‌ها</MudSelectItem>
                    <MudSelectItem T="OrderStatus?" Value="OrderStatus.Pending">در انتظار</MudSelectItem>
                    <MudSelectItem T="OrderStatus?" Value="OrderStatus.Paid">پرداخت شده</MudSelectItem>
                    <MudSelectItem T="OrderStatus?" Value="OrderStatus.Processing">در حال پردازش</MudSelectItem>
                    <MudSelectItem T="OrderStatus?" Value="OrderStatus.Shipped">ارسال شده</MudSelectItem>
                    <MudSelectItem T="OrderStatus?" Value="OrderStatus.Delivered">تحویل شده</MudSelectItem>
                    <MudSelectItem T="OrderStatus?" Value="OrderStatus.Cancelled">لغو شده</MudSelectItem>
                    <MudSelectItem T="OrderStatus?" Value="OrderStatus.Returned">مرجوع شده</MudSelectItem>
                </MudSelect>
            </MudItem>
            <MudItem xs="12" sm="6" md="3">
                <MudTextField @bind-Value="_searchQuery"
                              Label="جستجو (شناسه/نام کاربر)"
                              Variant="Variant.Outlined"
                              Margin="Margin.Dense"
                              Adornment="Adornment.Start"
                              AdornmentIcon="@Icons.Material.Filled.Search" />
            </MudItem>
        </MudGrid>

        <MudGrid Class="mt-2">
            <MudItem xs="12" sm="6" md="3" Class="d-flex align-end">
                <MudButton Variant="Variant.Filled"
                           Color="Color.Primary"
                           OnClick="LoadReports"
                           StartIcon="@Icons.Material.Filled.Search">
                    بارگذاری گزارش
                </MudButton>
            </MudItem>
            <MudItem xs="12" sm="6" md="3" Class="d-flex align-end justify-end">
                <MudButton Variant="Variant.Outlined"
                           Color="Color.Success"
                           OnClick="ExportToExcel"
                           StartIcon="@Icons.Material.Filled.Download"
                           Class="ml-2">
                    خروجی Excel
                </MudButton>
                <MudButton Variant="Variant.Outlined"
                           Color="Color.Default"
                           OnClick="ExportToPdf"
                           StartIcon="@Icons.Material.Filled.PictureAsPdf">
                    خروجی PDF
                </MudButton>
            </MudItem>
        </MudGrid>
    </MudPaper>

    @if (_loading)
    {
        <MudPaper Class="pa-4">
            <MudProgressCircular Color="Color.Primary" Indeterminate="true" />
        </MudPaper>
    }
    else if (_orders.Count == 0)
    {
        <MudAlert Severity="Severity.Info">
            هیچ سفارشی برای بازه و فیلترهای انتخاب‌شده یافت نشد.
        </MudAlert>
    }
    else
    {
        <MudGrid Class="mb-4">
            <MudItem xs="12" md="3">
                <MudPaper Elevation="1" Class="pa-4 text-center">
                    <MudText Typo="Typo.subtitle2" Color="Color.Primary">تعداد سفارش‌ها</MudText>
                    <MudText Typo="Typo.h5">@_totalOrders.ToString("N0")</MudText>
                </MudPaper>
            </MudItem>
            <MudItem xs="12" md="3">
                <MudPaper Elevation="1" Class="pa-4 text-center">
                    <MudText Typo="Typo.subtitle2" Color="Color.Success">مجموع فروش (مبلغ نهایی)</MudText>
                    <MudText Typo="Typo.h5">@_totalSales.ToString("N0") تومان</MudText>
                </MudPaper>
            </MudItem>
            <MudItem xs="12" md="3">
                <MudPaper Elevation="1" Class="pa-4 text-center">
                    <MudText Typo="Typo.subtitle2" Color="Color.Warning">مجموع تخفیف</MudText>
                    <MudText Typo="Typo.h5">@_totalDiscount.ToString("N0") تومان</MudText>
                </MudPaper>
            </MudItem>
            <MudItem xs="12" md="3">
                <MudPaper Elevation="1" Class="pa-4 text-center">
                    <MudText Typo="Typo.subtitle2" Color="Color.Info">میانگین مبلغ سفارش</MudText>
                    <MudText Typo="Typo.h5">@_averageOrder.ToString("N0") تومان</MudText>
                </MudPaper>
            </MudItem>
        </MudGrid>

        <MudGrid Class="mb-4">
            <MudItem xs="12" md="6">
                <MudCard>
                    <MudCardHeader>
                        <MudText Typo="Typo.h6">روند فروش</MudText>
                    </MudCardHeader>
                    <MudCardContent>
                        @if (_salesLabels.Length == 0)
                        {
                            <MudText Typo="Typo.body2" Color="Color.Secondary">
                                داده کافی برای نمایش نمودار وجود ندارد.
                            </MudText>
                        }
                        else
                        {
                            <MudChart ChartType="ChartType.Line"
                                      ChartSeries="@_salesSeries"
                                      XAxisLabels="@_salesLabels"
                                      Width="100%"
                                      Height="300px" />
                        }
                    </MudCardContent>
                </MudCard>
            </MudItem>
            <MudItem xs="12" md="6">
                <MudCard>
                    <MudCardHeader>
                        <MudText Typo="Typo.h6">وضعیت سفارش‌ها</MudText>
                    </MudCardHeader>
                    <MudCardContent>
                        @if (_statusChartLabels.Length == 0)
                        {
                            <MudText Typo="Typo.body2" Color="Color.Secondary">
                                داده کافی برای نمایش نمودار وجود ندارد.
                            </MudText>
                        }
                        else
                        {
                            <MudChart ChartType="ChartType.Bar"
                                      ChartSeries="@_statusChartSeries"
                                      XAxisLabels="@_statusChartLabels"
                                      Width="100%"
                                      Height="300px" />
                        }
                    </MudCardContent>
                </MudCard>
            </MudItem>
        </MudGrid>

        <MudGrid Class="mb-4">
            <MudItem xs="12" md="6">
                <MudCard>
                    <MudCardHeader>
                        <MudText Typo="Typo.h6">محصولات پرفروش (بر اساس مبلغ)</MudText>
                    </MudCardHeader>
                    <MudCardContent>
                        @if (_topProductLabels.Length == 0)
                        {
                            <MudText Typo="Typo.body2" Color="Color.Secondary">
                                برای محاسبه محصولات پرفروش، تعداد سفارش‌ها کافی نیست یا خطایی رخ داده است.
                            </MudText>
                        }
                        else
                        {
                            <MudChart ChartType="ChartType.Bar"
                                      ChartSeries="@_topProductSeries"
                                      XAxisLabels="@_topProductLabels"
                                      Width="100%"
                                      Height="300px" />
                        }
                    </MudCardContent>
                </MudCard>
            </MudItem>
        </MudGrid>

        <MudCard>
            <MudCardHeader>
                <MudText Typo="Typo.h6">لیست سفارش‌ها</MudText>
            </MudCardHeader>
            <MudCardContent>
                <MudDataGrid T="DiscountOrderDto"
                             Items="@_orders"
                             Hover="true"
                             Dense="true">
                    <Columns>
                        <PropertyColumn Property="x => x.Id" Title="شناسه" />
                        <TemplateColumn Title="نام کاربر">
                            <CellTemplate>
                                @if (context.Item.UserId > 0)
                                {
                                    <MudLink Href="@($"/network/user-info/{context.Item.UserId}")" Underline="Underline.Hover" Color="Color.Primary">
                                        @context.Item.UserFullName
                                    </MudLink>
                                }
                                else
                                {
                                    <MudText>@context.Item.UserFullName</MudText>
                                }
                            </CellTemplate>
                        </TemplateColumn>
                        <TemplateColumn Title="تاریخ ثبت">
                            <CellTemplate>
                                @(context.Item.Created?.MiladiToJalaliWithTime() ?? "-")
                            </CellTemplate>
                        </TemplateColumn>
                        <TemplateColumn Title="تعداد آیتم">
                            <CellTemplate>
                                @context.Item.ItemsCount
                            </CellTemplate>
                        </TemplateColumn>
                        <TemplateColumn Title="مبلغ نهایی">
                            <CellTemplate>
                                @context.Item.GatewayAmount.ToString("N0") تومان
                            </CellTemplate>
                        </TemplateColumn>
                        <TemplateColumn Title="تخفیف">
                            <CellTemplate>
                                @context.Item.DiscountBalanceUsed.ToString("N0") تومان
                            </CellTemplate>
                        </TemplateColumn>
                        <TemplateColumn Title="وضعیت">
                            <CellTemplate>
                                <MudChip T="string"
                                         Size="Size.Small"
                                         Color="@GetStatusColor(context.Item.Status)">
                                    @GetStatusText(context.Item.Status)
                                </MudChip>
                            </CellTemplate>
                        </TemplateColumn>
                    </Columns>
            <NoRecordsContent>
                <MudAlert Severity="Severity.Info" Dense="true" Variant="Variant.Text" Class="my-4">موردی یافت نشد.</MudAlert>
            </NoRecordsContent>
                </MudDataGrid>
            </MudCardContent>
        </MudCard>
    }
</div>

@code {
    private readonly List<DiscountOrderDto> _orders = new();
    private bool _loading;

    private DateTime? _fromDate = DateTime.Today.AddDays(-30);
    private DateTime? _toDate = DateTime.Today;
    private OrderStatus? _statusFilter;
    private string? _searchQuery;

    private int _totalOrders;
    private long _totalSales;
    private long _totalDiscount;
    private long _averageOrder;
    private int _uniqueCustomers;
    private int _totalProductsSold;

    private string[] _salesLabels = Array.Empty<string>();
    private List<ChartSeries> _salesSeries = new();

    private string[] _topProductLabels = Array.Empty<string>();
    private List<ChartSeries> _topProductSeries = new();

    private string[] _statusChartLabels = Array.Empty<string>();
    private List<ChartSeries> _statusChartSeries = new();

    protected override async Task OnInitializedAsync()
    {
        await LoadReports();
    }

    private async Task LoadReports()
    {
        if (_fromDate.HasValue && _toDate.HasValue && _fromDate.Value.Date > _toDate.Value.Date)
        {
            Snackbar.Add("تاریخ شروع نباید بعد از تاریخ پایان باشد.", Severity.Warning);
            return;
        }

        _loading = true;
        _orders.Clear();

        try
        {
            // ۱) گزارش سرور-ساید (خلاصه + نمودار روزانه + محصولات پرفروش)
            DiscountSalesReportDto? report = null;
            if (_fromDate.HasValue && _toDate.HasValue)
            {
                try
                {
                    report = await DiscountOrderService.GetSalesReportAsync(_fromDate.Value, _toDate.Value);
                }
                catch
                {
                    // اگر RPC سرور ساید پیاده‌سازی نشده بود، fallback به کلاینت‌ساید
                }
            }

            // ۲) لیست سفارشات برای جدول و نمودار وضعیت
            var filter = new OrderFilterDto
            {
                Status = _statusFilter,
                FromDate = _fromDate,
                ToDate = _toDate,
                PageNumber = 1,
                PageSize = 200
            };
            var (orders, _, _) = await DiscountOrderService.GetOrdersAsync(filter);
            _orders.AddRange(orders);

            if (report?.Summary != null && report.Summary.TotalOrders > 0)
            {
                // استفاده از گزارش سرور-ساید
                _totalOrders = report.Summary.TotalOrders;
                _totalSales = report.Summary.TotalGatewayPaid;
                _totalDiscount = report.Summary.TotalDiscountUsed;
                _averageOrder = report.Summary.AverageOrderValue;
                _uniqueCustomers = report.Summary.UniqueCustomers;
                _totalProductsSold = report.Summary.TotalProductsSold;

                // نمودار روند فروش از periods
                if (report.Periods.Count > 0)
                {
                    _salesLabels = report.Periods.Select(p => p.PeriodLabel).ToArray();
                    _salesSeries = new List<ChartSeries>
                    {
                        new ChartSeries { Name = "مبلغ نهایی", Data = report.Periods.Select(p => (double)p.GatewayPaid).ToArray() },
                        new ChartSeries { Name = "تخفیف", Data = report.Periods.Select(p => (double)p.DiscountUsed).ToArray() }
                    };
                }

                // نمودار محصولات پرفروش
                if (report.TopProducts.Count > 0)
                {
                    _topProductLabels = report.TopProducts.Take(5).Select(x => x.ProductTitle).ToArray();
                    _topProductSeries = new List<ChartSeries>
                    {
                        new ChartSeries
                        {
                            Name = "مبلغ فروش",
                            Data = report.TopProducts.Take(5).Select(x => (double)x.TotalRevenue).ToArray()
                        }
                    };
                }
            }
            else
            {
                // Fallback: محاسبه کلاینت‌ساید
                BuildSummary();
                BuildSalesChart();
                BuildTopProductsChartFromOrders();
            }

            // نمودار وضعیت همیشه از لیست سفارشات
            BuildStatusChart();
        }
        catch (Exception ex)
        {
            Snackbar.Add($"خطا در بارگذاری گزارش فروش: {ex.Message}", Severity.Error);
            ClearData();
        }
        finally
        {
            _loading = false;
        }
    }

    private void ClearData()
    {
        _orders.Clear();
        _totalOrders = 0;
        _totalSales = 0;
        _totalDiscount = 0;
        _averageOrder = 0;
        _uniqueCustomers = 0;
        _totalProductsSold = 0;
        _salesLabels = Array.Empty<string>();
        _salesSeries = new List<ChartSeries>();
        _topProductLabels = Array.Empty<string>();
        _topProductSeries = new List<ChartSeries>();
        _statusChartLabels = Array.Empty<string>();
        _statusChartSeries = new List<ChartSeries>();
    }

    private void BuildSummary()
    {
        _totalOrders = _orders.Count;
        _totalSales = _orders.Sum(o => o.GatewayAmount);
        _totalDiscount = _orders.Sum(o => o.DiscountBalanceUsed);
        _averageOrder = _totalOrders > 0 ? _totalSales / _totalOrders : 0;
    }

    private void BuildSalesChart()
    {
        if (_orders.Count == 0)
        {
            _salesLabels = Array.Empty<string>();
            _salesSeries = new List<ChartSeries>();
            return;
        }

        var grouped = _orders
            .Where(o => o.Created.HasValue)
            .GroupBy(o => o.Created!.Value.Date)
            .OrderBy(g => g.Key)
            .ToList();

        _salesLabels = grouped
            .Select(g => g.Key.MiladiToJalali())
            .ToArray();

        var totalSeries = grouped
            .Select(g => (double)g.Sum(o => o.GatewayAmount))
            .ToArray();

        var discountSeries = grouped
            .Select(g => (double)g.Sum(o => o.DiscountBalanceUsed))
            .ToArray();

        _salesSeries = new List<ChartSeries>
        {
            new ChartSeries { Name = "مبلغ نهایی", Data = totalSeries },
            new ChartSeries { Name = "تخفیف", Data = discountSeries }
        };
    }

    private void BuildStatusChart()
    {
        if (_orders.Count == 0)
        {
            _statusChartLabels = Array.Empty<string>();
            _statusChartSeries = new List<ChartSeries>();
            return;
        }

        var groups = _orders
            .GroupBy(x => x.Status)
            .OrderBy(g => (int)g.Key)
            .ToList();

        _statusChartLabels = groups
            .Select(g => GetStatusText(g.Key))
            .ToArray();

        _statusChartSeries = new List<ChartSeries>
        {
            new ChartSeries
            {
                Name = "تعداد سفارش‌ها",
                Data = groups.Select(g => (double)g.Count()).ToArray()
            }
        };
    }

    private void BuildTopProductsChartFromOrders()
    {
        // Fallback ساده بدون N+1 — فقط از اطلاعات لیست سفارشات
        _topProductLabels = Array.Empty<string>();
        _topProductSeries = new List<ChartSeries>();
    }

    private Color GetStatusColor(OrderStatus status)
    {
        return status switch
        {
            OrderStatus.Pending => Color.Warning,
            OrderStatus.Paid => Color.Success,
            OrderStatus.Processing => Color.Info,
            OrderStatus.Shipped => Color.Info,
            OrderStatus.Delivered => Color.Success,
            OrderStatus.Cancelled => Color.Error,
            OrderStatus.Returned => Color.Error,
            _ => Color.Default
        };
    }

    private string GetStatusText(OrderStatus status)
    {
        return status switch
        {
            OrderStatus.Pending => "در انتظار",
            OrderStatus.Paid => "پرداخت شده",
            OrderStatus.Processing => "در حال پردازش",
            OrderStatus.Shipped => "ارسال شده",
            OrderStatus.Delivered => "تحویل شده",
            OrderStatus.Cancelled => "لغو شده",
            OrderStatus.Returned => "مرجوع شده",
            _ => "نامشخص"
        };
    }

    private async Task ExportToExcel()
    {
        if (_orders.Count == 0)
        {
            Snackbar.Add("داده‌ای برای خروجی وجود ندارد.", Severity.Info);
            return;
        }

        var sb = new StringBuilder();
        sb.AppendLine("شناسه,نام کاربر,موبایل,تاریخ ثبت,تعداد آیتم,مبلغ نهایی,تخفیف,وضعیت");

        foreach (var o in _orders.Where(o => o.Created.HasValue).OrderBy(o => o.Created))
        {
            sb.AppendLine(string.Join(",",
                o.Id,
                EscapeCsv(o.UserFullName),
                EscapeCsv(o.UserMobile),
                o.Created?.MiladiToJalaliWithTime() ?? "-",
                o.ItemsCount,
                o.GatewayAmount,
                o.DiscountBalanceUsed,
                GetStatusText(o.Status)));
        }

        var bytes = Encoding.UTF8.GetPreamble().Concat(Encoding.UTF8.GetBytes(sb.ToString())).ToArray();
        var base64 = Convert.ToBase64String(bytes);
        var filename = $"discount-sales-{DateTime.Now:yyyyMMddHHmmss}.csv";

        await JsRuntime.InvokeVoidAsync("jsSaveAsFile", filename, base64);
        Snackbar.Add("خروجی Excel (CSV) آماده شد.", Severity.Success);
    }

    private async Task ExportToPdf()
    {
        if (_orders.Count == 0)
        {
            Snackbar.Add("داده‌ای برای خروجی وجود ندارد.", Severity.Info);
            return;
        }

        var sb = new StringBuilder();
        sb.AppendLine("گزارش فروش فروشگاه تخفیفی");
        sb.AppendLine($"بازه: از {_fromDate?.MiladiToJalali() ?? "-"} تا {_toDate?.MiladiToJalali() ?? "-"}");
        sb.AppendLine();

        sb.AppendLine("خلاصه:");
        sb.AppendLine($"تعداد سفارش‌ها: {_totalOrders}");
        sb.AppendLine($"مجموع فروش (مبلغ نهایی): {_totalSales:N0} تومان");
        sb.AppendLine($"مجموع تخفیف: {_totalDiscount:N0} تومان");
        sb.AppendLine($"میانگین مبلغ سفارش: {_averageOrder:N0} تومان");
        sb.AppendLine();

        sb.AppendLine("جزئیات سفارش‌ها:");
        sb.AppendLine("شناسه | نام کاربر | تاریخ | تعداد آیتم | مبلغ نهایی | تخفیف | وضعیت");

        foreach (var o in _orders.Where(o => o.Created.HasValue).OrderBy(o => o.Created))
        {
            sb.AppendLine(
                $"{o.Id} | {o.UserFullName} | {o.Created?.MiladiToJalaliWithTime() ?? "-"} | {o.ItemsCount} | {o.GatewayAmount:N0} | {o.DiscountBalanceUsed:N0} | {GetStatusText(o.Status)}");
        }

        var bytes = Encoding.UTF8.GetPreamble().Concat(Encoding.UTF8.GetBytes(sb.ToString())).ToArray();
        var base64 = Convert.ToBase64String(bytes);
        var filename = $"discount-sales-{DateTime.Now:yyyyMMddHHmmss}.txt";

        await JsRuntime.InvokeVoidAsync("jsSaveAsFile", filename, base64);
        Snackbar.Add("خروجی PDF (نسخه متنی) آماده شد.", Severity.Success);
    }

    private static string EscapeCsv(string value)
    {
        if (string.IsNullOrEmpty(value))
            return "";

        var needsQuotes = value.Contains(',') || value.Contains('"') || value.Contains('\n');
        var escaped = value.Replace("\"", "\"\"");
        return needsQuotes ? $"\"{escaped}\"" : escaped;
    }
}
