using System.Text.Json.Serialization;
using TakeoutSaaS.Shared.Abstractions.Serialization;

namespace TakeoutSaaS.Application.App.Billings.Dto;

/// <summary>
/// 账单统计数据 DTO。
/// </summary>
public sealed record BillingStatisticsDto
{
    /// <summary>
    /// 租户 ID（当前租户）。
    /// </summary>
    [JsonConverter(typeof(NullableSnowflakeIdJsonConverter))]
    public long? TenantId { get; init; }

    /// <summary>
    /// 统计开始时间（UTC）。
    /// </summary>
    public DateTime StartDate { get; init; }

    /// <summary>
    /// 统计结束时间（UTC）。
    /// </summary>
    public DateTime EndDate { get; init; }

    /// <summary>
    /// 分组方式（Day/Week/Month）。
    /// </summary>
    public string GroupBy { get; init; } = "Day";

    /// <summary>
    /// 总账单数量。
    /// </summary>
    public int TotalCount { get; init; }

    /// <summary>
    /// 待支付账单数量。
    /// </summary>
    public int PendingCount { get; init; }

    /// <summary>
    /// 已支付账单数量。
    /// </summary>
    public int PaidCount { get; init; }

    /// <summary>
    /// 逾期账单数量。
    /// </summary>
    public int OverdueCount { get; init; }

    /// <summary>
    /// 已取消账单数量。
    /// </summary>
    public int CancelledCount { get; init; }

    /// <summary>
    /// 总应收金额。
    /// </summary>
    public decimal TotalAmountDue { get; init; }

    /// <summary>
    /// 已收金额。
    /// </summary>
    public decimal TotalAmountPaid { get; init; }

    /// <summary>
    /// 未收金额。
    /// </summary>
    public decimal TotalAmountUnpaid { get; init; }

    /// <summary>
    /// 逾期金额。
    /// </summary>
    public decimal TotalOverdueAmount { get; init; }

    /// <summary>
    /// 应收金额趋势（Key 为日期桶字符串）。
    /// </summary>
    public IReadOnlyDictionary<string, decimal> AmountDueTrend { get; init; } = new Dictionary<string, decimal>();

    /// <summary>
    /// 实收金额趋势（Key 为日期桶字符串）。
    /// </summary>
    public IReadOnlyDictionary<string, decimal> AmountPaidTrend { get; init; } = new Dictionary<string, decimal>();

    /// <summary>
    /// 数量趋势（Key 为日期桶字符串）。
    /// </summary>
    public IReadOnlyDictionary<string, int> CountTrend { get; init; } = new Dictionary<string, int>();
}
