package com.haha.entity.dto;

import lombok.Data;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import com.fasterxml.jackson.annotation.JsonFormat;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 统一活动创建DTO
 * 支持所有活动类型：1-首单立减 2-优惠折扣 3-商品满减 4-邀请有礼
 */
@Data
public class UnifiedActivityCreateDTO {

    // ===== 通用字段 (所有类型共用) =====

    /**
     * 活动名称
     */
    @NotBlank(message = "活动名称不能为空")
    private String activityName;

    /**
     * 活动类型：1-首单立减 2-优惠折扣 3-商品满减 4-邀请有礼
     */
    @NotNull(message = "活动类型不能为空")
    private Integer activityType;

    /**
     * 活动描述
     */
    private String activityDesc;

    /**
     * 开始时间
     */
    @NotNull(message = "开始时间不能为空")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startTime;

    /**
     * 结束时间
     */
    @NotNull(message = "结束时间不能为空")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime endTime;

    // ===== 适用范围字段 =====

    /**
     * 适用范围：0-全平台 1-指定设备/门店
     */
    private Integer applyScope;

    /**
     * 设备范围（applyScope=1时使用）
     */
    private Integer deviceScope;

    /**
     * 商品范围：0-全部商品 1-指定商品
     */
    private Integer productScope;

    // ===== 预算控制 =====

    /**
     * 总预算金额
     */
    private BigDecimal totalBudget;

    // ===== 优惠字段 (type 1,2,3 使用) =====

    /**
     * 优惠值（立减金额、折扣率、满减门槛等）
     */
    private BigDecimal discountValue;

    /**
     * 最低消费金额
     */
    private BigDecimal minAmount;

    /**
     * 最大优惠金额上限
     */
    private BigDecimal maxDiscount;

    // ===== 邀请特有字段 (type 4 使用) =====

    /**
     * 邀请人奖励优惠券模板ID（type=4时必填）
     */
    @NotNull(message = "邀请人优惠券模板ID不能为空", groups = InviteCheck.class)
    private Long inviterCouponTemplateId;

    /**
     * 被邀请人奖励优惠券模板ID（双向奖励时使用，可选）
     */
    private Long inviteeCouponTemplateId;

    /**
     * 每人每日最大邀请数，默认10
     */
    @NotNull(message = "每日邀请上限不能为空", groups = InviteCheck.class)
    private Integer dailyLimit;

    /**
     * 每人活动期间最大邀请总数（不填则不限制）
     */
    private Integer totalLimit;

    /**
     * 是否要求完成首单：0-否 1-是，默认1
     */
    private Integer requireFirstOrder;

    /**
     * 首单最低金额要求
     */
    private BigDecimal minOrderAmount;

    /**
     * 邀请码前缀（用于生成唯一邀请码）
     */
    private String inviteCodePrefix;

    // ===== 关联ID列表 =====

    /**
     * 指定门店ID列表（applyScope=1时使用）
     */
    private List<Long> shopIds;

    /**
     * 指定设备ID列表（deviceScope指定时使用）
     */
    private List<String> deviceIds;

    /**
     * 指定商品ID列表（productScope=1时使用）
     */
    private List<Long> productIds;

    /**
     * 校验分组接口 - 用于邀请有礼(type=4)的条件性校验
     * 当 activityType == 4 时，使用该分组进行校验
     */
    public interface InviteCheck {}
}
