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

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 火箭等级枚举
 *
 * @author system
 * @date 2025-01-15
 */
@Getter
@AllArgsConstructor
public enum RocketLevel {

    /**
     * 1级火箭：15万能量
     */
    LEVEL_1(1, 150000L, "一级火箭"),

    /**
     * 2级火箭：50万能量
     */
    LEVEL_2(2, 500000L, "二级火箭"),

    /**
     * 3级火箭：100万能量
     */
    LEVEL_3(3, 1000000L, "三级火箭");

    /**
     * 等级值
     */
    private final Integer level;

    /**
     * 最大能量值
     */
    private final Long maxEnergy;

    /**
     * 等级名称
     */
    private final String name;

    /**
     * 根据等级获取枚举
     */
    public static RocketLevel of(Integer level) {
        for (RocketLevel rocketLevel : values()) {
            if (rocketLevel.getLevel().equals(level)) {
                return rocketLevel;
            }
        }
        throw new IllegalArgumentException("不支持的火箭等级: " + level);
    }

    /**
     * 获取下一级火箭
     * @return 下一级火箭，如果已是最高级则返回null
     */
    public RocketLevel getNextLevel() {
        return switch (this) {
            case LEVEL_1 -> LEVEL_2;
            case LEVEL_2 -> LEVEL_3;
            case LEVEL_3 -> null; // 三级是最高级，返回null表示需要重置
        };
    }

    /**
     * 是否是最高级
     */
    public boolean isMaxLevel() {
        return this == LEVEL_3;
    }

    /**
     * 根据能量值判断等级
     */
    public static RocketLevel determineLevel(Long energy) {
        if (energy >= LEVEL_3.getMaxEnergy()) {
            return LEVEL_3;
        } else if (energy >= LEVEL_2.getMaxEnergy()) {
            return LEVEL_2;
        } else if (energy >= LEVEL_1.getMaxEnergy()) {
            return LEVEL_1;
        }
        return LEVEL_1;
    }

    /**
     * 检查能量是否达到当前等级阈值
     */
    public boolean isReached(Long energy) {
        return energy >= this.maxEnergy;
    }
}
