using MediatR;
using TakeoutSaaS.Application.App.Coupons.FullReduction.Dto;

namespace TakeoutSaaS.Application.App.Coupons.FullReduction.Commands;

/// <summary>
/// 保存满减活动命令。
/// </summary>
public sealed class SaveFullReductionCampaignCommand : IRequest<FullReductionDetailDto>
{
    /// <summary>
    /// 操作门店 ID。
    /// </summary>
    public long OperationStoreId { get; init; }

    /// <summary>
    /// 活动 ID（编辑时传）。
    /// </summary>
    public long? CampaignId { get; init; }

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

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

    /// <summary>
    /// 满减阶梯。
    /// </summary>
    public IReadOnlyCollection<FullReductionTierRuleDto> ReduceTiers { get; init; } = [];

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

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

    /// <summary>
    /// 活动开始时间。
    /// </summary>
    public DateTime StartAt { get; init; }

    /// <summary>
    /// 活动结束时间。
    /// </summary>
    public DateTime EndAt { get; init; }

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

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

    /// <summary>
    /// 门店范围 ID。
    /// </summary>
    public IReadOnlyCollection<long> StoreScopeStoreIds { get; init; } = [];

    /// <summary>
    /// 选品基准门店 ID。
    /// </summary>
    public long ScopeStoreId { get; init; }

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

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

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