package cn.fateverse.common.mybatisplus.enums;

import com.baomidou.mybatisplus.annotation.IEnum;

import java.util.Arrays;

public interface BaseEnum<T extends Enum<T>> extends IEnum<Integer> {

    /**
     * 获取编码
     *
     * @return {@link Integer}
     */
    Integer getCode();

    /**
     * 获取名称
     *
     * @return {@link String}
     */
    String getName();

    /**
     * 获取value值
     *
     * @return {@link Integer}
     */
    @Override
    default Integer getValue() {
        return getCode();
    }
    /**
     * 解析通过编码
     *
     * @param enumClass 枚举班
     * @param code      编码
     * @return {@link E}
     */
    static <E extends Enum<E> & BaseEnum<E>> E parseByCode(Class<E> enumClass, Integer code) {
        return Arrays.stream(enumClass.getEnumConstants())
                .filter(e -> e.getCode().equals(code))
                .findFirst()
                .orElse(null);
    }

    /**
     * 按名称解析
     *
     * @param enumClass 枚举班
     * @param name      名称
     * @return {@link E}
     */
    static <E extends Enum<E> & BaseEnum<E>> E parseByName(Class<E> enumClass, String name) {
        return Arrays.stream(enumClass.getEnumConstants())
                .filter(e -> e.getName().equals(name))
                .findFirst()
                .orElse(null);
    }
}
