namespace TakeoutSaaS.TenantApi.Contracts.Marketing;

/// <summary>
/// 优惠券列表请求。
/// </summary>
public sealed class CouponListRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

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

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

    /// <summary>
    /// 券类型筛选（amount_off/discount/free_delivery）。
    /// </summary>
    public string? CouponType { get; set; }

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

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

/// <summary>
/// 优惠券详情请求。
/// </summary>
public sealed class CouponDetailRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 优惠券 ID。
    /// </summary>
    public string CouponId { get; set; } = string.Empty;
}

/// <summary>
/// 保存优惠券请求。
/// </summary>
public sealed class SaveCouponRequest
{
    /// <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>
    /// 券类型（amount_off/discount/free_delivery）。
    /// </summary>
    public string CouponType { get; set; } = "amount_off";

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

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

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

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

    /// <summary>
    /// 有效期类型（fixed/days）。
    /// </summary>
    public string ValidityType { get; set; } = "fixed";

    /// <summary>
    /// 固定有效期开始。
    /// </summary>
    public DateTime? ValidFrom { get; set; }

    /// <summary>
    /// 固定有效期结束。
    /// </summary>
    public DateTime? ValidTo { get; set; }

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

    /// <summary>
    /// 适用渠道（delivery/pickup/dine_in）。
    /// </summary>
    public List<string>? Channels { get; set; }

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

    /// <summary>
    /// 门店范围 ID 集合（stores 模式必传）。
    /// </summary>
    public List<string>? StoreIds { get; set; }

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

/// <summary>
/// 修改优惠券状态请求。
/// </summary>
public sealed class ChangeCouponStatusRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 优惠券 ID。
    /// </summary>
    public string CouponId { get; set; } = string.Empty;

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

/// <summary>
/// 删除优惠券请求。
/// </summary>
public sealed class DeleteCouponRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 优惠券 ID。
    /// </summary>
    public string CouponId { get; set; } = string.Empty;
}

/// <summary>
/// 优惠券列表结果。
/// </summary>
public sealed class CouponListResultResponse
{
    /// <summary>
    /// 列表数据。
    /// </summary>
    public List<CouponListItemResponse> Items { get; set; } = [];

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

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

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

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

/// <summary>
/// 优惠券列表项。
/// </summary>
public sealed class CouponListItemResponse
{
    /// <summary>
    /// 优惠券 ID。
    /// </summary>
    public string Id { get; set; } = string.Empty;

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

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

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

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

    /// <summary>
    /// 固定有效期开始。
    /// </summary>
    public string? ValidFrom { get; set; }

    /// <summary>
    /// 固定有效期结束。
    /// </summary>
    public string? ValidTo { get; set; }

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

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

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

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

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

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

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

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

    /// <summary>
    /// 门店 ID 列表。
    /// </summary>
    public List<string> StoreIds { get; set; } = [];

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

    /// <summary>
    /// 更新时间。
    /// </summary>
    public string UpdatedAt { get; set; } = string.Empty;
}

/// <summary>
/// 优惠券详情。
/// </summary>
public sealed class CouponDetailResponse
{
    /// <summary>
    /// 优惠券 ID。
    /// </summary>
    public string Id { get; set; } = string.Empty;

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

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

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

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

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

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

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

    /// <summary>
    /// 有效期类型（fixed/days）。
    /// </summary>
    public string ValidityType { get; set; } = "fixed";

    /// <summary>
    /// 固定有效期开始。
    /// </summary>
    public string? ValidFrom { get; set; }

    /// <summary>
    /// 固定有效期结束。
    /// </summary>
    public string? ValidTo { get; set; }

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

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

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

    /// <summary>
    /// 门店 ID 列表。
    /// </summary>
    public List<string> StoreIds { get; set; } = [];

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

    /// <summary>
    /// 更新时间。
    /// </summary>
    public string UpdatedAt { get; set; } = string.Empty;
}

/// <summary>
/// 优惠券统计响应。
/// </summary>
public sealed class CouponStatsResponse
{
    /// <summary>
    /// 优惠券总数。
    /// </summary>
    public int TotalCount { get; set; }

    /// <summary>
    /// 进行中数量。
    /// </summary>
    public int OngoingCount { get; set; }

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

    /// <summary>
    /// 已核销总数。
    /// </summary>
    public int RedeemedCount { get; set; }

    /// <summary>
    /// 核销率（百分比）。
    /// </summary>
    public decimal RedeemRate { get; set; }
}
