using TakeoutSaaS.Domain.Coupons.Enums;
using TakeoutSaaS.Shared.Abstractions.Entities;

namespace TakeoutSaaS.Domain.Coupons.Entities;

/// <summary>
/// 优惠券模板。
/// </summary>
public sealed class CouponTemplate : MultiTenantEntityBase
{
    /// <summary>
    /// 模板名称。
    /// </summary>
    public string Name { get; set; } = string.Empty;

    /// <summary>
    /// 券类型。
    /// </summary>
    public CouponType CouponType { get; set; } = CouponType.AmountOff;

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

    /// <summary>
    /// 折扣上限（针对折扣券）。
    /// </summary>
    public decimal? DiscountCap { get; set; }

    /// <summary>
    /// 最低消费门槛。
    /// </summary>
    public decimal? MinimumSpend { get; set; }

    /// <summary>
    /// 可用开始时间。
    /// </summary>
    public DateTime? ValidFrom { get; set; }

    /// <summary>
    /// 可用结束时间。
    /// </summary>
    public DateTime? ValidTo { get; set; }

    /// <summary>
    /// 有效天数（相对发放时间）。
    /// </summary>
    public int? RelativeValidDays { get; set; }

    /// <summary>
    /// 总发放数量上限。
    /// </summary>
    public int? TotalQuantity { get; set; }

    /// <summary>
    /// 每位用户可领取上限。
    /// </summary>
    public int? PerUserLimit { get; set; }

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

    /// <summary>
    /// 适用门店 ID 集合（JSON）。
    /// </summary>
    public string? StoreScopeJson { get; set; }

    /// <summary>
    /// 适用品类或商品范围（JSON）。
    /// </summary>
    public string? ProductScopeJson { get; set; }

    /// <summary>
    /// 发放渠道（JSON）。
    /// </summary>
    public string? ChannelsJson { get; set; }

    /// <summary>
    /// 是否允许叠加其他优惠。
    /// </summary>
    public bool AllowStack { get; set; }

    /// <summary>
    /// 状态。
    /// </summary>
    public CouponTemplateStatus Status { get; set; } = CouponTemplateStatus.Draft;

    /// <summary>
    /// 备注。
    /// </summary>
    public string? Description { get; set; }
}
