using System.Text.Json.Serialization;
using TakeoutSaaS.Domain.Tenants.Enums;
using TakeoutSaaS.Shared.Abstractions.Serialization;

namespace TakeoutSaaS.Application.App.Subscriptions.Dto;

/// <summary>
/// 配额使用 DTO。
/// </summary>
public sealed record QuotaUsageDto
{
    /// <summary>
    /// 配额 ID。
    /// </summary>
    [JsonConverter(typeof(SnowflakeIdJsonConverter))]
    public long Id { get; init; }

    /// <summary>
    /// 配额类型。
    /// </summary>
    public TenantQuotaType QuotaType { get; init; }

    /// <summary>
    /// 配额上限。
    /// </summary>
    public decimal LimitValue { get; init; }

    /// <summary>
    /// 已使用量。
    /// </summary>
    public decimal UsedValue { get; init; }

    /// <summary>
    /// 使用率（百分比）。
    /// </summary>
    public decimal UsagePercentage => LimitValue > 0 ? Math.Round(UsedValue / LimitValue * 100, 2) : 0;

    /// <summary>
    /// 剩余额度。
    /// </summary>
    public decimal RemainingValue => Math.Max(0, LimitValue - UsedValue);

    /// <summary>
    /// 重置周期描述。
    /// </summary>
    public string? ResetCycle { get; init; }

    /// <summary>
    /// 最近一次重置时间。
    /// </summary>
    public DateTime? LastResetAt { get; init; }
}
