using CMSMicroservice.Application.Common.Models;
using MediatR;

namespace CMSMicroservice.Application.DiscountShopCQ.Queries.GetDiscountSalesReport;

/// <summary>
/// کوئری گزارش فروش فروشگاه تخفیفی
/// </summary>
public class GetDiscountSalesReportQuery : IRequest<DiscountSalesReportDto>
{
    /// <summary>
    /// از تاریخ
    /// </summary>
    public DateTime? FromDate { get; set; }
    
    /// <summary>
    /// تا تاریخ
    /// </summary>
    public DateTime? ToDate { get; set; }
    
    /// <summary>
    /// نوع گزارش
    /// </summary>
    public SalesReportType ReportType { get; set; } = SalesReportType.Summary;
}

public enum SalesReportType
{
    /// <summary>
    /// خلاصه کلی
    /// </summary>
    Summary,
    
    /// <summary>
    /// روزانه
    /// </summary>
    Daily,
    
    /// <summary>
    /// هفتگی
    /// </summary>
    Weekly,
    
    /// <summary>
    /// ماهانه
    /// </summary>
    Monthly
}

public class DiscountSalesReportDto
{
    // خلاصه کلی
    public SalesSummary Summary { get; set; } = new();
    
    // جزئیات زمانی (برای گزارش‌های روزانه، هفتگی، ماهانه)
    public List<SalesPeriodDto> Periods { get; set; } = new();
    
    // پرفروش‌ترین محصولات
    public List<TopSellingProductDto> TopProducts { get; set; } = new();
}

public class SalesSummary
{
    /// <summary>
    /// تعداد کل سفارشات
    /// </summary>
    public int TotalOrders { get; set; }
    
    /// <summary>
    /// تعداد سفارشات موفق (پرداخت شده)
    /// </summary>
    public int CompletedOrders { get; set; }
    
    /// <summary>
    /// تعداد سفارشات در انتظار پرداخت
    /// </summary>
    public int PendingOrders { get; set; }
    
    /// <summary>
    /// تعداد سفارشات لغو شده
    /// </summary>
    public int CancelledOrders { get; set; }
    
    /// <summary>
    /// جمع کل فروش (TotalAmount)
    /// </summary>
    public long TotalSalesAmount { get; set; }
    
    /// <summary>
    /// جمع تخفیف استفاده شده (DiscountBalanceUsed)
    /// </summary>
    public long TotalDiscountUsed { get; set; }
    
    /// <summary>
    /// جمع پرداخت از درگاه (GatewayAmountPaid)
    /// </summary>
    public long TotalGatewayPaid { get; set; }
    
    /// <summary>
    /// جمع VAT
    /// </summary>
    public long TotalVatAmount { get; set; }
    
    /// <summary>
    /// میانگین ارزش سفارش
    /// </summary>
    public long AverageOrderValue { get; set; }
    
    /// <summary>
    /// تعداد کاربران یکتا
    /// </summary>
    public int UniqueCustomers { get; set; }
    
    /// <summary>
    /// تعداد کل محصولات فروخته شده
    /// </summary>
    public int TotalProductsSold { get; set; }
}

public class SalesPeriodDto
{
    /// <summary>
    /// نام دوره (مثل: 1403/10/11 یا هفته 41)
    /// </summary>
    public string PeriodLabel { get; set; } = string.Empty;
    
    /// <summary>
    /// تاریخ شروع دوره
    /// </summary>
    public DateTime PeriodStart { get; set; }
    
    /// <summary>
    /// تاریخ پایان دوره
    /// </summary>
    public DateTime PeriodEnd { get; set; }
    
    /// <summary>
    /// تعداد سفارشات
    /// </summary>
    public int OrdersCount { get; set; }
    
    /// <summary>
    /// جمع فروش
    /// </summary>
    public long TotalAmount { get; set; }
    
    /// <summary>
    /// جمع تخفیف
    /// </summary>
    public long DiscountUsed { get; set; }
    
    /// <summary>
    /// جمع پرداخت درگاه
    /// </summary>
    public long GatewayPaid { get; set; }
}

public class TopSellingProductDto
{
    public long ProductId { get; set; }
    public string ProductTitle { get; set; } = string.Empty;
    public string? ImagePath { get; set; }
    public int QuantitySold { get; set; }
    public long TotalRevenue { get; set; }
    public int OrdersCount { get; set; }
}
