namespace TakeoutSaaS.TenantApi.Contracts.Marketing;

/// <summary>
/// 限时折扣列表查询请求。
/// </summary>
public sealed class FlashSaleListRequest
{
    /// <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 FlashSaleDetailRequest
{
    /// <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 SaveFlashSaleRequest
{
    /// <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>
    /// 活动周期（once/recurring）。
    /// </summary>
    public string CycleType { get; set; } = "once";

    /// <summary>
    /// 周期日期模式（fixed/long_term）。
    /// </summary>
    public string RecurringDateMode { get; set; } = "fixed";

    /// <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>
    /// 循环星期（1-7，周一到周日）。
    /// </summary>
    public List<int>? WeekDays { get; set; }

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

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

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

    /// <summary>
    /// 折扣商品列表。
    /// </summary>
    public List<FlashSaleSaveProductRequest> Products { get; set; } = [];

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

/// <summary>
/// 修改限时折扣状态请求。
/// </summary>
public sealed class ChangeFlashSaleStatusRequest
{
    /// <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 DeleteFlashSaleRequest
{
    /// <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 FlashSaleListResultResponse
{
    /// <summary>
    /// 列表项。
    /// </summary>
    public List<FlashSaleListItemResponse> 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 FlashSaleStatsResponse Stats { get; set; } = new();
}

/// <summary>
/// 限时折扣列表项响应。
/// </summary>
public sealed class FlashSaleListItemResponse
{
    /// <summary>
    /// 活动 ID。
    /// </summary>
    public string Id { get; set; } = string.Empty;

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

    /// <summary>
    /// 活动周期（once/recurring）。
    /// </summary>
    public string CycleType { get; set; } = "once";

    /// <summary>
    /// 周期日期模式（fixed/long_term）。
    /// </summary>
    public string RecurringDateMode { get; set; } = "fixed";

    /// <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>
    /// 循环星期（1-7）。
    /// </summary>
    public List<int> WeekDays { 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 List<string> StoreIds { get; set; } = [];

    /// <summary>
    /// 折扣商品。
    /// </summary>
    public List<FlashSaleProductResponse> Products { get; set; } = [];

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

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

/// <summary>
/// 限时折扣详情响应。
/// </summary>
public sealed class FlashSaleDetailResponse
{
    /// <summary>
    /// 活动 ID。
    /// </summary>
    public string Id { get; set; } = string.Empty;

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

    /// <summary>
    /// 活动周期（once/recurring）。
    /// </summary>
    public string CycleType { get; set; } = "once";

    /// <summary>
    /// 周期日期模式（fixed/long_term）。
    /// </summary>
    public string RecurringDateMode { get; set; } = "fixed";

    /// <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>
    /// 循环星期（1-7）。
    /// </summary>
    public List<int> WeekDays { 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 List<string> StoreIds { get; set; } = [];

    /// <summary>
    /// 折扣商品。
    /// </summary>
    public List<FlashSaleProductResponse> Products { get; set; } = [];

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

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

/// <summary>
/// 限时折扣统计响应。
/// </summary>
public sealed class FlashSaleStatsResponse
{
    /// <summary>
    /// 活动总数。
    /// </summary>
    public int TotalCount { get; set; }

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

    /// <summary>
    /// 参与商品数。
    /// </summary>
    public int ParticipatingProductCount { get; set; }

    /// <summary>
    /// 本月折扣销量。
    /// </summary>
    public int MonthlyDiscountSalesCount { get; set; }
}

/// <summary>
/// 限时折扣商品请求。
/// </summary>
public sealed class FlashSaleSaveProductRequest
{
    /// <summary>
    /// 商品 ID。
    /// </summary>
    public string ProductId { get; set; } = string.Empty;

    /// <summary>
    /// 折扣价。
    /// </summary>
    public decimal DiscountPrice { get; set; }

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

/// <summary>
/// 限时折扣商品响应。
/// </summary>
public sealed class FlashSaleProductResponse
{
    /// <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 DiscountPrice { get; set; }

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

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

/// <summary>
/// 限时折扣指标请求。
/// </summary>
public sealed class FlashSaleMetricsRequest
{
    /// <summary>
    /// 活动销量（单）。
    /// </summary>
    public int ActivitySalesCount { get; set; }

    /// <summary>
    /// 折扣总额。
    /// </summary>
    public decimal DiscountTotalAmount { get; set; }

    /// <summary>
    /// 已循环周数。
    /// </summary>
    public int LoopedWeeks { get; set; }

    /// <summary>
    /// 本月折扣销量（单）。
    /// </summary>
    public int MonthlyDiscountSalesCount { get; set; }
}

/// <summary>
/// 限时折扣指标响应。
/// </summary>
public sealed class FlashSaleMetricsResponse
{
    /// <summary>
    /// 活动销量（单）。
    /// </summary>
    public int ActivitySalesCount { get; set; }

    /// <summary>
    /// 折扣总额。
    /// </summary>
    public decimal DiscountTotalAmount { get; set; }

    /// <summary>
    /// 已循环周数。
    /// </summary>
    public int LoopedWeeks { get; set; }

    /// <summary>
    /// 本月折扣销量（单）。
    /// </summary>
    public int MonthlyDiscountSalesCount { get; set; }
}

/// <summary>
/// 限时折扣商品分类选择器请求。
/// </summary>
public sealed class FlashSalePickerCategoriesRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;
}

/// <summary>
/// 限时折扣商品分类选择器响应项。
/// </summary>
public sealed class FlashSalePickerCategoryItemResponse
{
    /// <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 FlashSalePickerProductsRequest
{
    /// <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 FlashSalePickerProductItemResponse
{
    /// <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";
}
