namespace TakeoutSaaS.TenantApi.Contracts.Marketing;

/// <summary>
/// 次卡列表查询请求。
/// </summary>
public sealed class PunchCardListRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 名称关键字。
    /// </summary>
    public string? Keyword { get; set; }

    /// <summary>
    /// 状态筛选（enabled/disabled）。
    /// </summary>
    public string? Status { get; set; }

    /// <summary>
    /// 页码。
    /// </summary>
    public int Page { get; set; } = 1;

    /// <summary>
    /// 每页条数。
    /// </summary>
    public int PageSize { get; set; } = 4;
}

/// <summary>
/// 次卡详情请求。
/// </summary>
public sealed class PunchCardDetailRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 次卡 ID。
    /// </summary>
    public string PunchCardId { get; set; } = string.Empty;
}

/// <summary>
/// 保存次卡请求。
/// </summary>
public sealed class SavePunchCardRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 次卡 ID（编辑时传）。
    /// </summary>
    public string? Id { 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>
    /// 有效期类型（days/range）。
    /// </summary>
    public string ValidityType { get; set; } = "days";

    /// <summary>
    /// 固定天数。
    /// </summary>
    public int? ValidityDays { get; set; }

    /// <summary>
    /// 固定开始日期（yyyy-MM-dd）。
    /// </summary>
    public string? ValidFrom { get; set; }

    /// <summary>
    /// 固定结束日期（yyyy-MM-dd）。
    /// </summary>
    public string? ValidTo { get; set; }

    /// <summary>
    /// 范围类型（all/category/tag/product）。
    /// </summary>
    public string ScopeType { get; set; } = "all";

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

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

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

    /// <summary>
    /// 使用模式（free/cap）。
    /// </summary>
    public string UsageMode { get; set; } = "free";

    /// <summary>
    /// 单次上限金额。
    /// </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>
    /// 过期策略（invalidate/refund）。
    /// </summary>
    public string ExpireStrategy { get; set; } = "invalidate";

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

    /// <summary>
    /// 通知渠道（in_app/sms）。
    /// </summary>
    public List<string> NotifyChannels { get; set; } = [];
}

/// <summary>
/// 次卡状态修改请求。
/// </summary>
public sealed class ChangePunchCardStatusRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 次卡 ID。
    /// </summary>
    public string PunchCardId { get; set; } = string.Empty;

    /// <summary>
    /// 状态（enabled/disabled）。
    /// </summary>
    public string Status { get; set; } = "disabled";
}

/// <summary>
/// 次卡删除请求。
/// </summary>
public sealed class DeletePunchCardRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 次卡 ID。
    /// </summary>
    public string PunchCardId { get; set; } = string.Empty;
}

/// <summary>
/// 次卡使用记录查询请求。
/// </summary>
public sealed class PunchCardUsageRecordListRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 次卡模板 ID。
    /// </summary>
    public string? PunchCardId { get; set; }

    /// <summary>
    /// 状态筛选（normal/used_up/expired）。
    /// </summary>
    public string? Status { get; set; }

    /// <summary>
    /// 关键字（会员/商品）。
    /// </summary>
    public string? Keyword { get; set; }

    /// <summary>
    /// 页码。
    /// </summary>
    public int Page { get; set; } = 1;

    /// <summary>
    /// 每页条数。
    /// </summary>
    public int PageSize { get; set; } = 10;
}

/// <summary>
/// 次卡使用记录导出请求。
/// </summary>
public sealed class ExportPunchCardUsageRecordRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 次卡模板 ID。
    /// </summary>
    public string? PunchCardId { get; set; }

    /// <summary>
    /// 状态筛选（normal/used_up/expired）。
    /// </summary>
    public string? Status { get; set; }

    /// <summary>
    /// 关键字（会员/商品）。
    /// </summary>
    public string? Keyword { get; set; }
}

/// <summary>
/// 写入次卡使用记录请求。
/// </summary>
public sealed class WritePunchCardUsageRecordRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 次卡模板 ID。
    /// </summary>
    public string PunchCardId { get; set; } = string.Empty;

    /// <summary>
    /// 次卡实例 ID（可空）。
    /// </summary>
    public string? PunchCardInstanceId { get; set; }

    /// <summary>
    /// 次卡实例编号（可空）。
    /// </summary>
    public string? PunchCardInstanceNo { get; set; }

    /// <summary>
    /// 会员名称。
    /// </summary>
    public string? MemberName { get; set; }

    /// <summary>
    /// 会员手机号（脱敏）。
    /// </summary>
    public string? MemberPhoneMasked { get; set; }

    /// <summary>
    /// 兑换商品。
    /// </summary>
    public string ProductName { get; set; } = string.Empty;

    /// <summary>
    /// 使用时间。
    /// </summary>
    public DateTime? UsedAt { get; set; }

    /// <summary>
    /// 本次使用次数。
    /// </summary>
    public int UsedTimes { get; set; } = 1;

    /// <summary>
    /// 超额补差金额。
    /// </summary>
    public decimal? ExtraPayAmount { get; set; }
}

/// <summary>
/// 次卡模板统计。
/// </summary>
public sealed class PunchCardStatsResponse
{
    /// <summary>
    /// 在售次卡数量。
    /// </summary>
    public int OnSaleCount { get; set; }

    /// <summary>
    /// 累计售出数量。
    /// </summary>
    public int TotalSoldCount { get; set; }

    /// <summary>
    /// 累计收入。
    /// </summary>
    public decimal TotalRevenueAmount { get; set; }

    /// <summary>
    /// 使用中数量。
    /// </summary>
    public int ActiveInUseCount { get; set; }
}

/// <summary>
/// 次卡列表项。
/// </summary>
public sealed class PunchCardListItemResponse
{
    /// <summary>
    /// 次卡 ID。
    /// </summary>
    public string Id { get; set; } = string.Empty;

    /// <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 string ValiditySummary { get; set; } = string.Empty;

    /// <summary>
    /// 适用范围类型。
    /// </summary>
    public string ScopeType { get; set; } = "all";

    /// <summary>
    /// 使用模式。
    /// </summary>
    public string UsageMode { get; set; } = "free";

    /// <summary>
    /// 单次上限金额。
    /// </summary>
    public decimal? UsageCapAmount { get; set; }

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

    /// <summary>
    /// 状态（enabled/disabled）。
    /// </summary>
    public string Status { get; set; } = "enabled";

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

    /// <summary>
    /// 已售数量。
    /// </summary>
    public int SoldCount { get; set; }

    /// <summary>
    /// 使用中数量。
    /// </summary>
    public int ActiveCount { get; set; }

    /// <summary>
    /// 累计收入。
    /// </summary>
    public decimal RevenueAmount { get; set; }

    /// <summary>
    /// 更新时间（yyyy-MM-dd HH:mm:ss）。
    /// </summary>
    public string UpdatedAt { get; set; } = string.Empty;
}

/// <summary>
/// 次卡列表结果。
/// </summary>
public sealed class PunchCardListResultResponse
{
    /// <summary>
    /// 列表。
    /// </summary>
    public List<PunchCardListItemResponse> Items { get; set; } = [];

    /// <summary>
    /// 当前页。
    /// </summary>
    public int Page { get; set; }

    /// <summary>
    /// 每页条数。
    /// </summary>
    public int PageSize { get; set; }

    /// <summary>
    /// 总条数。
    /// </summary>
    public int TotalCount { get; set; }

    /// <summary>
    /// 统计。
    /// </summary>
    public PunchCardStatsResponse Stats { get; set; } = new();
}

/// <summary>
/// 次卡范围。
/// </summary>
public sealed class PunchCardScopeResponse
{
    /// <summary>
    /// 范围类型（all/category/tag/product）。
    /// </summary>
    public string ScopeType { get; set; } = "all";

    /// <summary>
    /// 分类 ID。
    /// </summary>
    public List<string> CategoryIds { get; set; } = [];

    /// <summary>
    /// 标签 ID。
    /// </summary>
    public List<string> TagIds { get; set; } = [];

    /// <summary>
    /// 商品 ID。
    /// </summary>
    public List<string> ProductIds { get; set; } = [];
}

/// <summary>
/// 次卡详情。
/// </summary>
public sealed class PunchCardDetailResponse
{
    /// <summary>
    /// 次卡 ID。
    /// </summary>
    public string Id { get; set; } = string.Empty;

    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <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>
    /// 有效期类型（days/range）。
    /// </summary>
    public string ValidityType { get; set; } = "days";

    /// <summary>
    /// 固定天数。
    /// </summary>
    public int? ValidityDays { get; set; }

    /// <summary>
    /// 固定开始日期（yyyy-MM-dd）。
    /// </summary>
    public string? ValidFrom { get; set; }

    /// <summary>
    /// 固定结束日期（yyyy-MM-dd）。
    /// </summary>
    public string? ValidTo { get; set; }

    /// <summary>
    /// 适用范围。
    /// </summary>
    public PunchCardScopeResponse Scope { get; set; } = new();

    /// <summary>
    /// 使用模式（free/cap）。
    /// </summary>
    public string UsageMode { get; set; } = "free";

    /// <summary>
    /// 单次上限金额。
    /// </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>
    /// 过期策略（invalidate/refund）。
    /// </summary>
    public string ExpireStrategy { get; set; } = "invalidate";

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

    /// <summary>
    /// 通知渠道。
    /// </summary>
    public List<string> NotifyChannels { get; set; } = [];

    /// <summary>
    /// 状态（enabled/disabled）。
    /// </summary>
    public string Status { get; set; } = "enabled";

    /// <summary>
    /// 已售数量。
    /// </summary>
    public int SoldCount { get; set; }

    /// <summary>
    /// 使用中数量。
    /// </summary>
    public int ActiveCount { get; set; }

    /// <summary>
    /// 累计收入。
    /// </summary>
    public decimal RevenueAmount { get; set; }

    /// <summary>
    /// 更新时间（yyyy-MM-dd HH:mm:ss）。
    /// </summary>
    public string UpdatedAt { get; set; } = string.Empty;
}

/// <summary>
/// 次卡下拉选项。
/// </summary>
public sealed class PunchCardTemplateOptionResponse
{
    /// <summary>
    /// 次卡 ID。
    /// </summary>
    public string TemplateId { get; set; } = string.Empty;

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

/// <summary>
/// 使用记录统计。
/// </summary>
public sealed class PunchCardUsageStatsResponse
{
    /// <summary>
    /// 今日使用次数。
    /// </summary>
    public int TodayUsedCount { get; set; }

    /// <summary>
    /// 本月使用次数。
    /// </summary>
    public int MonthUsedCount { get; set; }

    /// <summary>
    /// 7 天内即将过期数量。
    /// </summary>
    public int ExpiringSoonCount { get; set; }
}

/// <summary>
/// 次卡使用记录项。
/// </summary>
public sealed class PunchCardUsageRecordResponse
{
    /// <summary>
    /// 使用记录 ID。
    /// </summary>
    public string Id { get; set; } = string.Empty;

    /// <summary>
    /// 使用单号。
    /// </summary>
    public string RecordNo { get; set; } = string.Empty;

    /// <summary>
    /// 次卡模板 ID。
    /// </summary>
    public string PunchCardId { get; set; } = string.Empty;

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

    /// <summary>
    /// 次卡实例 ID。
    /// </summary>
    public string PunchCardInstanceId { get; set; } = string.Empty;

    /// <summary>
    /// 会员名称。
    /// </summary>
    public string MemberName { get; set; } = string.Empty;

    /// <summary>
    /// 会员手机号（脱敏）。
    /// </summary>
    public string MemberPhoneMasked { get; set; } = string.Empty;

    /// <summary>
    /// 兑换商品。
    /// </summary>
    public string ProductName { get; set; } = string.Empty;

    /// <summary>
    /// 使用时间（yyyy-MM-dd HH:mm:ss）。
    /// </summary>
    public string UsedAt { get; set; } = string.Empty;

    /// <summary>
    /// 本次使用次数。
    /// </summary>
    public int UsedTimes { get; set; }

    /// <summary>
    /// 剩余次数。
    /// </summary>
    public int RemainingTimesAfterUse { get; set; }

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

    /// <summary>
    /// 状态（normal/almost_used_up/used_up/expired）。
    /// </summary>
    public string DisplayStatus { get; set; } = "normal";

    /// <summary>
    /// 超额补差金额。
    /// </summary>
    public decimal? ExtraPayAmount { get; set; }
}

/// <summary>
/// 使用记录分页结果。
/// </summary>
public sealed class PunchCardUsageRecordListResultResponse
{
    /// <summary>
    /// 列表。
    /// </summary>
    public List<PunchCardUsageRecordResponse> Items { get; set; } = [];

    /// <summary>
    /// 页码。
    /// </summary>
    public int Page { get; set; }

    /// <summary>
    /// 每页条数。
    /// </summary>
    public int PageSize { get; set; }

    /// <summary>
    /// 总条数。
    /// </summary>
    public int TotalCount { get; set; }

    /// <summary>
    /// 统计。
    /// </summary>
    public PunchCardUsageStatsResponse Stats { get; set; } = new();

    /// <summary>
    /// 次卡筛选项。
    /// </summary>
    public List<PunchCardTemplateOptionResponse> TemplateOptions { get; set; } = [];
}

/// <summary>
/// 使用记录导出回执。
/// </summary>
public sealed class PunchCardUsageRecordExportResponse
{
    /// <summary>
    /// 文件名。
    /// </summary>
    public string FileName { get; set; } = string.Empty;

    /// <summary>
    /// Base64 文件内容。
    /// </summary>
    public string FileContentBase64 { get; set; } = string.Empty;

    /// <summary>
    /// 导出总条数。
    /// </summary>
    public int TotalCount { get; set; }
}
