package com.red.circle.other.domain.ranking;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;
import java.util.List;
import java.util.Set;

/**
 * 排行榜活动类型枚举
 * 
 * 扩展方式：新增活动类型只需在此添加枚举值即可
 */
@Getter
@AllArgsConstructor
public enum RankingActivityType {

    /**
     * 革命日
     */
    REVOLUTION_DAY(1, "革命日", "统计送礼物消费排行"),

    /**
     * 英雄日
     */
    HEROES_DAY(2, "英雄日", "统计送礼物消费排行"),

    /**
     * 巴勒斯坦独立日
     */
    PALESTIAN_DAY(3, "巴勒斯坦独立日", "统计送礼物消费排行"),

    /**
     * 阿曼国庆日
     */
    OMAN_DAY(4, "阿曼国庆日", "统计送礼物消费排行"),

    LIBANEN_DAY(5, "黎巴嫩独立日", "统计送礼物消费排行"),

    YEMEN_DAY(6, "也门独立日", "统计送礼物消费排行"),

    ALIANQIU_DAY(7, "阿联酋国庆日", "统计送礼物消费排行"),

    GREEDY_GAME(1068, "GreedyLion", "游戏中奖排行"),

    LUCK_GIFT(9999, "LuckGift", "统计送幸运礼物排行"),

    KING_GAMES(10, "游戏王活动", "统计游戏数据排行"),

    FRUIT_PARTY(11, "FruitParty", "统计游戏数据排行"),

    CHRISTMAS(12, "圣诞节活动", "统计送礼物消费排行"),

    RAMADAN(13, "'斋月活动'", "'统计送礼物消费排行'"),

    INVITE(14, "'邀请活动'", "'邀请用户奖励金币排行'"),

    KING_GAMES_DAILY(15, "游戏王日榜活动", "统计游戏数据排行"),

    OPEN_RAMADAN(16, "开斋节活动", "统计送礼物消费排行"),
    ;

    /**
     * 无效活动类型列表
     */
    private static final List<RankingActivityType> INVALID_TYPES = Arrays.asList(LUCK_GIFT, GREEDY_GAME);

    /**
     * 赛季榜活动（使用活动自身的 startTime-endTime 作为固定周期，而非默认周榜）
     */
    private static final Set<RankingActivityType> SEASON_TYPES = Set.of(OPEN_RAMADAN);

    /**
     * 类型编码
     */
    private final Integer code;

    /**
     * 类型名称
     */
    private final String name;

    /**
     * 类型描述
     */
    private final String description;

    /**
     * 根据编码获取枚举
     */
    public static RankingActivityType getByCode(Integer code) {
        if (code == null) {
            return null;
        }
        for (RankingActivityType type : values()) {
            if (type.getCode().equals(code)) {
                return type;
            }
        }
        return null;
    }

    /**
     * 根据枚举常量名获取枚举
     */
    public static RankingActivityType getByConstantName(String constantName) {
        if (constantName == null || constantName.isEmpty()) {
            return null;
        }
        try {
            return RankingActivityType.valueOf(constantName);
        } catch (IllegalArgumentException e) {
            return null;
        }
    }

    /**
     * 判断是否是有效的活动类型
     */
    public boolean isValid() {
        return !INVALID_TYPES.contains(this);
    }

    /**
     * 是否为赛季榜活动（固定周期，cycleKey 格式：yyyyMMdd-yyyyMMdd）
     */
    public boolean isSeasonCycle() {
        return SEASON_TYPES.contains(this);
    }
}