package com.red.circle.other.app.dto.cmd.activity;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.red.circle.common.business.dto.cmd.AppExtCommand;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 排行榜数据更新命令
 * 
 * 用于实时更新用户在排行榜中的数据
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class RankingDataUpdateCmd extends AppExtCommand {

    /**
     * 用户ID
     */
    @NotNull(message = "用户ID不能为空")
    @JsonSerialize(using = ToStringSerializer.class)
    private Long userId;

    /**
     * 用户性别: 0-女, 1-男
     */
    @NotNull(message = "用户性别不能为空")
    private Integer userSex;

    /**
     * 活动类型
     * RankingActivityType
     */
    @NotNull(message = "活动类型不能为空")
    private Integer activityType;

    /**
     * 周期类型
     * 
     * RankingCycleType
     */
    @NotNull(message = "周期类型不能为空")
    private Integer cycleType;

    /**
     * 周期标识
     */
    @NotNull(message = "周期标识不能为空")
    private String cycleKey;

    /**
     * 统计维度
     * 
     * RankingDimension
     */
    @NotNull(message = "统计维度不能为空")
    private Integer dimension;

    /**
     * 增量数值（支持负数）
     * 
     * 正数：增加，负数：减少
     */
    @NotNull(message = "增量数值不能为空")
    @JsonSerialize(using = ToStringSerializer.class)
    private Long incrementQuantity;

    /**
     * 业务单号（幂等性保证）
     */
    @NotNull(message = "业务单号不能为空")
    private String bizNo;

    /**
     * 扩展数据（JSON 格式）
     */
    private String extData;
}