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

namespace TakeoutSaaS.Domain.Coupons.Entities;

/// <summary>
/// 次卡模板配置。
/// </summary>
public sealed class PunchCardTemplate : MultiTenantEntityBase
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public long StoreId { get; set; }

    /// <summary>
    /// 次卡名称。
    /// </summary>
    public string Name { get; set; } = string.Empty;

    /// <summary>
    /// 封面图片地址。
    /// </summary>
    public string? CoverImageUrl { get; set; }

    /// <summary>
    /// 售价。
    /// </summary>
    public decimal SalePrice { get; set; }

    /// <summary>
    /// 原价。
    /// </summary>
    public decimal? OriginalPrice { get; set; }

    /// <summary>
    /// 总次数。
    /// </summary>
    public int TotalTimes { get; set; }

    /// <summary>
    /// 有效期类型。
    /// </summary>
    public PunchCardValidityType ValidityType { get; set; } = PunchCardValidityType.Days;

    /// <summary>
    /// 固定天数（ValidityType=Days 时有效）。
    /// </summary>
    public int? ValidityDays { get; set; }

    /// <summary>
    /// 固定开始日期（UTC，ValidityType=DateRange 时有效）。
    /// </summary>
    public DateTime? ValidFrom { get; set; }

    /// <summary>
    /// 固定结束日期（UTC，ValidityType=DateRange 时有效）。
    /// </summary>
    public DateTime? ValidTo { get; set; }

    /// <summary>
    /// 适用范围类型。
    /// </summary>
    public PunchCardScopeType ScopeType { get; set; } = PunchCardScopeType.All;

    /// <summary>
    /// 指定分类 ID JSON。
    /// </summary>
    public string ScopeCategoryIdsJson { get; set; } = "[]";

    /// <summary>
    /// 指定标签 ID JSON。
    /// </summary>
    public string ScopeTagIdsJson { get; set; } = "[]";

    /// <summary>
    /// 指定商品 ID JSON。
    /// </summary>
    public string ScopeProductIdsJson { get; set; } = "[]";

    /// <summary>
    /// 使用模式。
    /// </summary>
    public PunchCardUsageMode UsageMode { get; set; } = PunchCardUsageMode.Free;

    /// <summary>
    /// 金额上限（UsageMode=Cap 时有效）。
    /// </summary>
    public decimal? UsageCapAmount { get; set; }

    /// <summary>
    /// 每日限用次数。
    /// </summary>
    public int? DailyLimit { get; set; }

    /// <summary>
    /// 每单限用次数。
    /// </summary>
    public int? PerOrderLimit { get; set; }

    /// <summary>
    /// 每人限购张数。
    /// </summary>
    public int? PerUserPurchaseLimit { get; set; }

    /// <summary>
    /// 是否允许转赠。
    /// </summary>
    public bool AllowTransfer { get; set; }

    /// <summary>
    /// 过期策略。
    /// </summary>
    public PunchCardExpireStrategy ExpireStrategy { get; set; } = PunchCardExpireStrategy.Invalidate;

    /// <summary>
    /// 次卡描述。
    /// </summary>
    public string? Description { get; set; }

    /// <summary>
    /// 购买通知渠道 JSON。
    /// </summary>
    public string NotifyChannelsJson { get; set; } = "[]";

    /// <summary>
    /// 次卡状态。
    /// </summary>
    public PunchCardStatus Status { get; set; } = PunchCardStatus.Enabled;
}
