package com.red.circle.other.infra.database.mongo.entity.activity;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.red.circle.other.domain.ranking.RankingActivityType;
import com.red.circle.other.domain.ranking.RankingCycleType;
import com.red.circle.other.domain.ranking.RankingDimension;
import lombok.AccessLevel;
import lombok.Data;
import lombok.experimental.Accessors;
import lombok.experimental.FieldDefaults;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Transient;
import org.springframework.data.mongodb.core.index.CompoundIndex;
import org.springframework.data.mongodb.core.index.CompoundIndexes;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

import java.io.Serializable;
import java.sql.Timestamp;

/**
 * 通用排行榜活动记录
 * 
 * 设计说明：
 * 1. 支持多种活动类型（送礼榜/收礼榜等）
 * 2. 支持多种周期（日榜/周榜/月榜）
 * 3. 支持多种统计维度（消费金额/收入金额/时长等）
 * 4. 使用复合索引优化查询性能
 * 
 * 索引设计：
 * - sysOrigin + activityType + cycleType + cycleKey + userSex：快速查询指定活动的排行榜
 * - userId + activityType + cycleKey：快速查询用户在某活动的排名
 * - expiredTime：用于定时清理过期数据
 */
@Data
@Accessors(chain = true)
@Document("ranking_activity_record")
@FieldDefaults(level = AccessLevel.PRIVATE)
@CompoundIndexes({
    @CompoundIndex(name = "idx_ranking_query", 
                   def = "{'sysOrigin': 1, 'userId': 1, 'activityType': 1, 'cycleKey': 1, 'deleted': 1}"),
    @CompoundIndex(name = "idx_user_ranking", 
                   def = "{'userId': 1, 'activityType': 1, 'cycleKey': 1}"),
    @CompoundIndex(name = "idx_expired", 
                   def = "{'expiredTime': 1}")
})
public class RankingActivityRecord implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 记录ID
     */
    @Id
    @JsonSerialize(using = ToStringSerializer.class)
    String id;

    /**
     * 归属平台
     */
    @Indexed
    String sysOrigin;

    /**
     * 用户ID
     */
    @JsonSerialize(using = ToStringSerializer.class)
    Long userId;

    /**
     * 用户性别: 0-女, 1-男, 2-全部
     */
    Integer userSex;

    /**
     * 活动类型
     * 
     * @see RankingActivityType
     */
    @Indexed
    RankingActivityType activityType;

    /**
     * 周期类型
     * 
     * @see RankingCycleType
     */
    RankingCycleType cycleType;

    /**
     * 周期标识
     * 
     * 格式示例：
     * - 日榜: 20250101
     * - 周榜: 20250101 (周一日期)
     * - 月榜: 202501
     */
    @Indexed
    String cycleKey;

    /**
     * 统计维度
     * 
     * @see RankingDimension
     */
    RankingDimension dimension;

    /**
     * 统计数值（具体含义由 dimension 决定）
     * 
     * 示例：
     * - CONSUME_AMOUNT: 消费金币数量
     * - INCOME_AMOUNT: 收入钻石数量
     * - LIVE_DURATION: 直播时长（秒）
     */
    @JsonSerialize(using = ToStringSerializer.class)
    Long quantity;

    /**
     * 排名（瞬态字段，不存储到数据库）
     * 
     * 查询时动态计算
     */
    @Transient
    Integer rank;

    /**
     * 扩展数据（JSON 格式）
     * 
     * 用于存储活动特有的额外信息，例如：
     * - 国王/皇后活动: {"region": "asia", "level": 5}
     * - 礼物榜: {"giftIds": [1,2,3]}
     */
    String extData;

    /**
     * 创建时间
     */
    Timestamp createTime;

    /**
     * 更新时间
     */
    Timestamp updateTime;

    /**
     * 过期时间
     * 
     * 用于数据清理，建议设置为周期结束后 30 天
     */
    @Indexed
    Timestamp expiredTime;

    /**
     * 是否已删除: 0-否, 1-是
     */
    Integer deleted;
}