namespace TakeoutSaaS.TenantApi.Contracts.Marketing;

/// <summary>
/// 秒杀活动列表查询请求。
/// </summary>
public sealed class SeckillListRequest
{
    /// <summary>
    /// 门店 ID（可空，空表示全部门店）。
    /// </summary>
    public string? StoreId { get; set; }

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

    /// <summary>
    /// 展示状态筛选（ongoing/upcoming/ended）。
    /// </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 SeckillDetailRequest
{
    /// <summary>
    /// 操作门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 活动 ID。
    /// </summary>
    public string ActivityId { get; set; } = string.Empty;
}

/// <summary>
/// 保存秒杀活动请求。
/// </summary>
public sealed class SaveSeckillRequest
{
    /// <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>
    /// 活动类型（timed/hourly）。
    /// </summary>
    public string ActivityType { get; set; } = "timed";

    /// <summary>
    /// 活动开始日期（yyyy-MM-dd）。
    /// </summary>
    public string? StartDate { get; set; }

    /// <summary>
    /// 活动结束日期（yyyy-MM-dd）。
    /// </summary>
    public string? EndDate { get; set; }

    /// <summary>
    /// 每日开始时间（HH:mm）。
    /// </summary>
    public string? TimeStart { get; set; }

    /// <summary>
    /// 每日结束时间（HH:mm）。
    /// </summary>
    public string? TimeEnd { get; set; }

    /// <summary>
    /// 整点秒杀场次。
    /// </summary>
    public List<SeckillSessionRequest>? Sessions { get; set; }

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

    /// <summary>
    /// 活动每人限购（空表示不限）。
    /// </summary>
    public int? PerUserLimit { get; set; }

    /// <summary>
    /// 是否开启预热。
    /// </summary>
    public bool PreheatEnabled { get; set; }

    /// <summary>
    /// 预热小时数（空表示不启用）。
    /// </summary>
    public int? PreheatHours { get; set; }

    /// <summary>
    /// 活动门店 ID。
    /// </summary>
    public List<string>? StoreIds { get; set; }

    /// <summary>
    /// 秒杀商品列表。
    /// </summary>
    public List<SeckillSaveProductRequest> Products { get; set; } = [];

    /// <summary>
    /// 活动指标。
    /// </summary>
    public SeckillMetricsRequest? Metrics { get; set; }
}

/// <summary>
/// 修改秒杀活动状态请求。
/// </summary>
public sealed class ChangeSeckillStatusRequest
{
    /// <summary>
    /// 操作门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 活动 ID。
    /// </summary>
    public string ActivityId { get; set; } = string.Empty;

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

/// <summary>
/// 删除秒杀活动请求。
/// </summary>
public sealed class DeleteSeckillRequest
{
    /// <summary>
    /// 操作门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 活动 ID。
    /// </summary>
    public string ActivityId { get; set; } = string.Empty;
}

/// <summary>
/// 秒杀活动列表响应。
/// </summary>
public sealed class SeckillListResultResponse
{
    /// <summary>
    /// 列表项。
    /// </summary>
    public List<SeckillListItemResponse> 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 SeckillStatsResponse Stats { get; set; } = new();
}

/// <summary>
/// 秒杀活动列表项响应。
/// </summary>
public sealed class SeckillListItemResponse
{
    /// <summary>
    /// 活动 ID。
    /// </summary>
    public string Id { get; set; } = string.Empty;

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

    /// <summary>
    /// 活动类型（timed/hourly）。
    /// </summary>
    public string ActivityType { get; set; } = "timed";

    /// <summary>
    /// 活动开始日期（yyyy-MM-dd）。
    /// </summary>
    public string? StartDate { get; set; }

    /// <summary>
    /// 活动结束日期（yyyy-MM-dd）。
    /// </summary>
    public string? EndDate { get; set; }

    /// <summary>
    /// 每日开始时间（HH:mm）。
    /// </summary>
    public string? TimeStart { get; set; }

    /// <summary>
    /// 每日结束时间（HH:mm）。
    /// </summary>
    public string? TimeEnd { get; set; }

    /// <summary>
    /// 整点秒杀场次。
    /// </summary>
    public List<SeckillSessionResponse> Sessions { get; set; } = [];

    /// <summary>
    /// 编辑状态（active/completed）。
    /// </summary>
    public string Status { get; set; } = "active";

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

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

    /// <summary>
    /// 适用渠道。
    /// </summary>
    public List<string> Channels { get; set; } = [];

    /// <summary>
    /// 活动每人限购（空表示不限）。
    /// </summary>
    public int? PerUserLimit { get; set; }

    /// <summary>
    /// 是否开启预热。
    /// </summary>
    public bool PreheatEnabled { get; set; }

    /// <summary>
    /// 预热小时数（空表示不启用）。
    /// </summary>
    public int? PreheatHours { get; set; }

    /// <summary>
    /// 活动门店。
    /// </summary>
    public List<string> StoreIds { get; set; } = [];

    /// <summary>
    /// 秒杀商品。
    /// </summary>
    public List<SeckillProductResponse> Products { get; set; } = [];

    /// <summary>
    /// 活动指标。
    /// </summary>
    public SeckillMetricsResponse Metrics { get; set; } = new();

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

/// <summary>
/// 秒杀活动详情响应。
/// </summary>
public sealed class SeckillDetailResponse
{
    /// <summary>
    /// 活动 ID。
    /// </summary>
    public string Id { get; set; } = string.Empty;

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

    /// <summary>
    /// 活动类型（timed/hourly）。
    /// </summary>
    public string ActivityType { get; set; } = "timed";

    /// <summary>
    /// 活动开始日期（yyyy-MM-dd）。
    /// </summary>
    public string? StartDate { get; set; }

    /// <summary>
    /// 活动结束日期（yyyy-MM-dd）。
    /// </summary>
    public string? EndDate { get; set; }

    /// <summary>
    /// 每日开始时间（HH:mm）。
    /// </summary>
    public string? TimeStart { get; set; }

    /// <summary>
    /// 每日结束时间（HH:mm）。
    /// </summary>
    public string? TimeEnd { get; set; }

    /// <summary>
    /// 整点秒杀场次。
    /// </summary>
    public List<SeckillSessionResponse> Sessions { get; set; } = [];

    /// <summary>
    /// 编辑状态（active/completed）。
    /// </summary>
    public string Status { get; set; } = "active";

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

    /// <summary>
    /// 适用渠道。
    /// </summary>
    public List<string> Channels { get; set; } = [];

    /// <summary>
    /// 活动每人限购（空表示不限）。
    /// </summary>
    public int? PerUserLimit { get; set; }

    /// <summary>
    /// 是否开启预热。
    /// </summary>
    public bool PreheatEnabled { get; set; }

    /// <summary>
    /// 预热小时数（空表示不启用）。
    /// </summary>
    public int? PreheatHours { get; set; }

    /// <summary>
    /// 活动门店。
    /// </summary>
    public List<string> StoreIds { get; set; } = [];

    /// <summary>
    /// 秒杀商品。
    /// </summary>
    public List<SeckillProductResponse> Products { get; set; } = [];

    /// <summary>
    /// 活动指标。
    /// </summary>
    public SeckillMetricsResponse Metrics { get; set; } = new();

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

/// <summary>
/// 秒杀活动统计响应。
/// </summary>
public sealed class SeckillStatsResponse
{
    /// <summary>
    /// 活动总数。
    /// </summary>
    public int TotalCount { get; set; }

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

    /// <summary>
    /// 本月秒杀销量。
    /// </summary>
    public int MonthlySeckillSalesCount { get; set; }

    /// <summary>
    /// 秒杀转化率。
    /// </summary>
    public decimal ConversionRate { get; set; }
}

/// <summary>
/// 秒杀场次请求。
/// </summary>
public sealed class SeckillSessionRequest
{
    /// <summary>
    /// 场次开始时间（HH:mm）。
    /// </summary>
    public string StartTime { get; set; } = string.Empty;

    /// <summary>
    /// 场次持续时长（分钟）。
    /// </summary>
    public int DurationMinutes { get; set; }
}

/// <summary>
/// 秒杀场次响应。
/// </summary>
public sealed class SeckillSessionResponse
{
    /// <summary>
    /// 场次开始时间（HH:mm）。
    /// </summary>
    public string StartTime { get; set; } = string.Empty;

    /// <summary>
    /// 场次持续时长（分钟）。
    /// </summary>
    public int DurationMinutes { get; set; }
}

/// <summary>
/// 秒杀商品请求。
/// </summary>
public sealed class SeckillSaveProductRequest
{
    /// <summary>
    /// 商品 ID。
    /// </summary>
    public string ProductId { get; set; } = string.Empty;

    /// <summary>
    /// 秒杀价。
    /// </summary>
    public decimal SeckillPrice { get; set; }

    /// <summary>
    /// 限量库存（份）。
    /// </summary>
    public int StockLimit { get; set; }

    /// <summary>
    /// 商品每人限购（空表示不限）。
    /// </summary>
    public int? PerUserLimit { get; set; }
}

/// <summary>
/// 秒杀商品响应。
/// </summary>
public sealed class SeckillProductResponse
{
    /// <summary>
    /// 商品 ID。
    /// </summary>
    public string ProductId { get; set; } = string.Empty;

    /// <summary>
    /// 分类 ID。
    /// </summary>
    public string CategoryId { get; set; } = string.Empty;

    /// <summary>
    /// 分类名称。
    /// </summary>
    public string CategoryName { get; set; } = string.Empty;

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

    /// <summary>
    /// SPU 编码。
    /// </summary>
    public string SpuCode { get; set; } = string.Empty;

    /// <summary>
    /// 商品状态（on_sale/off_shelf/sold_out）。
    /// </summary>
    public string Status { get; set; } = "off_shelf";

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

    /// <summary>
    /// 秒杀价。
    /// </summary>
    public decimal SeckillPrice { get; set; }

    /// <summary>
    /// 限量库存（份）。
    /// </summary>
    public int StockLimit { get; set; }

    /// <summary>
    /// 商品每人限购（空表示不限）。
    /// </summary>
    public int? PerUserLimit { get; set; }

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

/// <summary>
/// 秒杀指标请求。
/// </summary>
public sealed class SeckillMetricsRequest
{
    /// <summary>
    /// 参与人数。
    /// </summary>
    public int ParticipantCount { get; set; }

    /// <summary>
    /// 成交单数。
    /// </summary>
    public int DealCount { get; set; }

    /// <summary>
    /// 转化率（百分比）。
    /// </summary>
    public decimal ConversionRate { get; set; }

    /// <summary>
    /// 本月秒杀销量（单）。
    /// </summary>
    public int MonthlySeckillSalesCount { get; set; }
}

/// <summary>
/// 秒杀指标响应。
/// </summary>
public sealed class SeckillMetricsResponse
{
    /// <summary>
    /// 参与人数。
    /// </summary>
    public int ParticipantCount { get; set; }

    /// <summary>
    /// 成交单数。
    /// </summary>
    public int DealCount { get; set; }

    /// <summary>
    /// 转化率（百分比）。
    /// </summary>
    public decimal ConversionRate { get; set; }

    /// <summary>
    /// 本月秒杀销量（单）。
    /// </summary>
    public int MonthlySeckillSalesCount { get; set; }
}

/// <summary>
/// 秒杀商品分类选择器请求。
/// </summary>
public sealed class SeckillPickerCategoriesRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;
}

/// <summary>
/// 秒杀商品分类选择器响应项。
/// </summary>
public sealed class SeckillPickerCategoryItemResponse
{
    /// <summary>
    /// 分类 ID。
    /// </summary>
    public string Id { get; set; } = string.Empty;

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

    /// <summary>
    /// 商品数量。
    /// </summary>
    public int ProductCount { get; set; }
}

/// <summary>
/// 秒杀商品选择器请求。
/// </summary>
public sealed class SeckillPickerProductsRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 分类 ID（可空）。
    /// </summary>
    public string? CategoryId { get; set; }

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

    /// <summary>
    /// 数量上限。
    /// </summary>
    public int? Limit { get; set; }
}

/// <summary>
/// 秒杀商品选择器响应项。
/// </summary>
public sealed class SeckillPickerProductItemResponse
{
    /// <summary>
    /// 商品 ID。
    /// </summary>
    public string Id { get; set; } = string.Empty;

    /// <summary>
    /// 分类 ID。
    /// </summary>
    public string CategoryId { get; set; } = string.Empty;

    /// <summary>
    /// 分类名称。
    /// </summary>
    public string CategoryName { get; set; } = string.Empty;

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

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

    /// <summary>
    /// 库存。
    /// </summary>
    public int Stock { get; set; }

    /// <summary>
    /// SPU 编码。
    /// </summary>
    public string SpuCode { get; set; } = string.Empty;

    /// <summary>
    /// 状态（on_sale/off_shelf/sold_out）。
    /// </summary>
    public string Status { get; set; } = "off_shelf";
}
