namespace TakeoutSaaS.Application.App.Coupons.Dto;

/// <summary>
/// 优惠券模板列表项 DTO。
/// </summary>
public sealed class CouponTemplateListItemDto
{
    /// <summary>
    /// 模板 ID。
    /// </summary>
    public long Id { get; init; }

    /// <summary>
    /// 券名称。
    /// </summary>
    public string Name { get; init; } = string.Empty;

    /// <summary>
    /// 券类型（amount_off/discount/free_delivery）。
    /// </summary>
    public string CouponType { get; init; } = "amount_off";

    /// <summary>
    /// 面值或折扣值。
    /// </summary>
    public decimal Value { get; init; }

    /// <summary>
    /// 使用门槛。
    /// </summary>
    public decimal? MinimumSpend { get; init; }

    /// <summary>
    /// 固定时间开始。
    /// </summary>
    public DateTime? ValidFrom { get; init; }

    /// <summary>
    /// 固定时间结束。
    /// </summary>
    public DateTime? ValidTo { get; init; }

    /// <summary>
    /// 领取后有效天数。
    /// </summary>
    public int? RelativeValidDays { get; init; }

    /// <summary>
    /// 发放总量。
    /// </summary>
    public int TotalQuantity { get; init; }

    /// <summary>
    /// 已领取数量。
    /// </summary>
    public int ClaimedQuantity { get; init; }

    /// <summary>
    /// 已核销数量。
    /// </summary>
    public int RedeemedQuantity { get; init; }

    /// <summary>
    /// 每人限领。
    /// </summary>
    public int? PerUserLimit { get; init; }

    /// <summary>
    /// 展示状态（ongoing/upcoming/ended/disabled）。
    /// </summary>
    public string DisplayStatus { get; init; } = "ongoing";

    /// <summary>
    /// 是否弱化展示。
    /// </summary>
    public bool IsDimmed { get; init; }

    /// <summary>
    /// 门店范围模式（all/stores）。
    /// </summary>
    public string StoreScopeMode { get; init; } = "stores";

    /// <summary>
    /// 门店范围 ID 列表。
    /// </summary>
    public IReadOnlyList<long> StoreIds { get; init; } = [];

    /// <summary>
    /// 渠道列表（delivery/pickup/dine_in）。
    /// </summary>
    public IReadOnlyList<string> Channels { get; init; } = [];

    /// <summary>
    /// 更新时间。
    /// </summary>
    public DateTime UpdatedAt { get; init; }
}
