namespace TakeoutSaaS.TenantApi.Contracts.Marketing;

/// <summary>
/// 满减活动列表请求。
/// </summary>
public sealed class FullReductionListRequest
{
    /// <summary>
    /// 门店 ID（可空；空表示全部门店）。
    /// </summary>
    public string? StoreId { get; set; }

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

    /// <summary>
    /// 活动类型筛选（reduce/gift/second_half）。
    /// </summary>
    public string? ActivityType { 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 FullReductionDetailRequest
{
    /// <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 SaveFullReductionRequest
{
    /// <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>
    /// 活动类型（reduce/gift/second_half）。
    /// </summary>
    public string ActivityType { get; set; } = "reduce";

    /// <summary>
    /// 满减阶梯规则。
    /// </summary>
    public List<FullReductionTierRuleRequest> ReduceTiers { get; set; } = [];

    /// <summary>
    /// 满赠规则。
    /// </summary>
    public FullReductionGiftRuleRequest? GiftRule { get; set; }

    /// <summary>
    /// 第二份半价规则。
    /// </summary>
    public FullReductionSecondHalfRuleRequest? SecondHalfRule { get; set; }

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

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

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

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

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

    /// <summary>
    /// 选品基准门店 ID。
    /// </summary>
    public string? ScopeStoreId { get; set; }

    /// <summary>
    /// 是否可叠加优惠券。
    /// </summary>
    public bool StackWithCoupon { get; set; }

    /// <summary>
    /// 活动说明。
    /// </summary>
    public string? Description { get; set; }

    /// <summary>
    /// 活动指标（用于列表展示）。
    /// </summary>
    public FullReductionMetricsRequest? Metrics { get; set; }
}

/// <summary>
/// 修改活动状态请求。
/// </summary>
public sealed class ChangeFullReductionStatusRequest
{
    /// <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 DeleteFullReductionRequest
{
    /// <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 FullReductionListResultResponse
{
    /// <summary>
    /// 列表。
    /// </summary>
    public List<FullReductionListItemResponse> 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 FullReductionStatsResponse Stats { get; set; } = new();
}

/// <summary>
/// 满减活动列表项。
/// </summary>
public sealed class FullReductionListItemResponse
{
    /// <summary>
    /// 活动 ID。
    /// </summary>
    public string Id { get; set; } = string.Empty;

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

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

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

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

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

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

    /// <summary>
    /// 满减阶梯规则。
    /// </summary>
    public List<FullReductionTierRuleResponse> ReduceTiers { get; set; } = [];

    /// <summary>
    /// 满赠规则。
    /// </summary>
    public FullReductionGiftRuleResponse? GiftRule { get; set; }

    /// <summary>
    /// 第二份半价规则。
    /// </summary>
    public FullReductionSecondHalfRuleResponse? SecondHalfRule { get; set; }

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

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

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

    /// <summary>
    /// 选品基准门店 ID。
    /// </summary>
    public string ScopeStoreId { get; set; } = string.Empty;

    /// <summary>
    /// 是否可叠加优惠券。
    /// </summary>
    public bool StackWithCoupon { get; set; }

    /// <summary>
    /// 活动说明。
    /// </summary>
    public string? Description { get; set; }

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

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

/// <summary>
/// 满减活动详情。
/// </summary>
public sealed class FullReductionDetailResponse
{
    /// <summary>
    /// 活动 ID。
    /// </summary>
    public string Id { get; set; } = string.Empty;

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

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

    /// <summary>
    /// 满减阶梯规则。
    /// </summary>
    public List<FullReductionTierRuleResponse> ReduceTiers { get; set; } = [];

    /// <summary>
    /// 满赠规则。
    /// </summary>
    public FullReductionGiftRuleResponse? GiftRule { get; set; }

    /// <summary>
    /// 第二份半价规则。
    /// </summary>
    public FullReductionSecondHalfRuleResponse? SecondHalfRule { get; set; }

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

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

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

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

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

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

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

    /// <summary>
    /// 选品基准门店 ID。
    /// </summary>
    public string ScopeStoreId { get; set; } = string.Empty;

    /// <summary>
    /// 是否可叠加优惠券。
    /// </summary>
    public bool StackWithCoupon { get; set; }

    /// <summary>
    /// 活动说明。
    /// </summary>
    public string? Description { get; set; }

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

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

/// <summary>
/// 满减活动统计。
/// </summary>
public sealed class FullReductionStatsResponse
{
    /// <summary>
    /// 活动总数。
    /// </summary>
    public int TotalCount { get; set; }

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

    /// <summary>
    /// 本月带动销售额。
    /// </summary>
    public decimal MonthlyDrivenSalesAmount { get; set; }

    /// <summary>
    /// 平均客单价提升。
    /// </summary>
    public decimal AverageTicketIncrease { get; set; }
}

/// <summary>
/// 满减阶梯规则请求。
/// </summary>
public sealed class FullReductionTierRuleRequest
{
    /// <summary>
    /// 满足金额。
    /// </summary>
    public decimal MeetAmount { get; set; }

    /// <summary>
    /// 减免金额。
    /// </summary>
    public decimal ReduceAmount { get; set; }
}

/// <summary>
/// 满减阶梯规则响应。
/// </summary>
public sealed class FullReductionTierRuleResponse
{
    /// <summary>
    /// 满足金额。
    /// </summary>
    public decimal MeetAmount { get; set; }

    /// <summary>
    /// 减免金额。
    /// </summary>
    public decimal ReduceAmount { get; set; }
}

/// <summary>
/// 满赠规则请求。
/// </summary>
public sealed class FullReductionGiftRuleRequest
{
    /// <summary>
    /// 购买数量门槛。
    /// </summary>
    public int BuyQuantity { get; set; }

    /// <summary>
    /// 赠送数量。
    /// </summary>
    public int GiftQuantity { get; set; }

    /// <summary>
    /// 赠品范围类型（same_lowest/specified）。
    /// </summary>
    public string GiftScopeType { get; set; } = "same_lowest";

    /// <summary>
    /// 适用商品范围。
    /// </summary>
    public FullReductionScopeRuleRequest ApplicableScope { get; set; } = new();

    /// <summary>
    /// 指定赠品范围。
    /// </summary>
    public FullReductionScopeRuleRequest GiftScope { get; set; } = new();
}

/// <summary>
/// 满赠规则响应。
/// </summary>
public sealed class FullReductionGiftRuleResponse
{
    /// <summary>
    /// 购买数量门槛。
    /// </summary>
    public int BuyQuantity { get; set; }

    /// <summary>
    /// 赠送数量。
    /// </summary>
    public int GiftQuantity { get; set; }

    /// <summary>
    /// 赠品范围类型（same_lowest/specified）。
    /// </summary>
    public string GiftScopeType { get; set; } = "same_lowest";

    /// <summary>
    /// 适用商品范围。
    /// </summary>
    public FullReductionScopeRuleResponse ApplicableScope { get; set; } = new();

    /// <summary>
    /// 指定赠品范围。
    /// </summary>
    public FullReductionScopeRuleResponse GiftScope { get; set; } = new();
}

/// <summary>
/// 第二份半价规则请求。
/// </summary>
public sealed class FullReductionSecondHalfRuleRequest
{
    /// <summary>
    /// 折扣类型（half/sixty/seventy/free）。
    /// </summary>
    public string DiscountType { get; set; } = "half";

    /// <summary>
    /// 适用商品范围。
    /// </summary>
    public FullReductionScopeRuleRequest ApplicableScope { get; set; } = new();
}

/// <summary>
/// 第二份半价规则响应。
/// </summary>
public sealed class FullReductionSecondHalfRuleResponse
{
    /// <summary>
    /// 折扣类型（half/sixty/seventy/free）。
    /// </summary>
    public string DiscountType { get; set; } = "half";

    /// <summary>
    /// 适用商品范围。
    /// </summary>
    public FullReductionScopeRuleResponse ApplicableScope { get; set; } = new();
}

/// <summary>
/// 商品范围请求。
/// </summary>
public sealed class FullReductionScopeRuleRequest
{
    /// <summary>
    /// 范围类型（all/category/product）。
    /// </summary>
    public string ScopeType { get; set; } = "all";

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

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

/// <summary>
/// 商品范围响应。
/// </summary>
public sealed class FullReductionScopeRuleResponse
{
    /// <summary>
    /// 范围类型（all/category/product）。
    /// </summary>
    public string ScopeType { get; set; } = "all";

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

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

/// <summary>
/// 指标请求。
/// </summary>
public sealed class FullReductionMetricsRequest
{
    /// <summary>
    /// 参与订单数。
    /// </summary>
    public int ParticipatingOrderCount { get; set; }

    /// <summary>
    /// 优惠总额。
    /// </summary>
    public decimal DiscountTotalAmount { get; set; }

    /// <summary>
    /// 客单价提升。
    /// </summary>
    public decimal TicketIncreaseAmount { get; set; }

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

    /// <summary>
    /// 带动销售额。
    /// </summary>
    public decimal DrivenSalesAmount { get; set; }

    /// <summary>
    /// 连带率提升百分比。
    /// </summary>
    public decimal AttachRateIncreasePercent { get; set; }

    /// <summary>
    /// 本月带动销售额。
    /// </summary>
    public decimal MonthlyDrivenSalesAmount { get; set; }

    /// <summary>
    /// 平均客单价提升。
    /// </summary>
    public decimal AverageTicketIncrease { get; set; }
}

/// <summary>
/// 指标响应。
/// </summary>
public sealed class FullReductionMetricsResponse
{
    /// <summary>
    /// 参与订单数。
    /// </summary>
    public int ParticipatingOrderCount { get; set; }

    /// <summary>
    /// 优惠总额。
    /// </summary>
    public decimal DiscountTotalAmount { get; set; }

    /// <summary>
    /// 客单价提升。
    /// </summary>
    public decimal TicketIncreaseAmount { get; set; }

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

    /// <summary>
    /// 带动销售额。
    /// </summary>
    public decimal DrivenSalesAmount { get; set; }

    /// <summary>
    /// 连带率提升百分比。
    /// </summary>
    public decimal AttachRateIncreasePercent { get; set; }

    /// <summary>
    /// 本月带动销售额。
    /// </summary>
    public decimal MonthlyDrivenSalesAmount { get; set; }

    /// <summary>
    /// 平均客单价提升。
    /// </summary>
    public decimal AverageTicketIncrease { get; set; }
}
