package com.openhis.web.document.util;

import com.openhis.common.enums.HisEnumInterface;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 枚举工具类
 */
public class EnumUtil {

    /**
     * 将枚举转换为包含 value、code、info 的 Map 列表
     *
     * @param enumClass 枚举类
     * @return 包含枚举属性的 Map 列表
     */
    public static List<Map<String, Object>> toMapList(Class<? extends HisEnumInterface> enumClass) {
        if (enumClass == null || !enumClass.isEnum()) {
            return Collections.emptyList();
        }

        return Arrays.stream(enumClass.getEnumConstants())
                .map(EnumUtil::convertEnumToMap)
                .collect(Collectors.toList());
    }
    /**
     * 将枚举转换为包含 value、code、info 的 Map 列表
     *
     * @param enumClass 枚举类
     * @param filterCodes 接收 code 集合（如 List<String>）
     * @return 包含枚举属性的 Map 列表
     */
    public static List<Map<String, Object>> toMapListFilter(
            Class<? extends HisEnumInterface> enumClass,
            Collection<String> filterCodes // 接收 code 集合（如 List<String>）
    ) {
        // 入参校验：enumClass 非法 或 filterCodes 为 null/空，直接返回空列表（或原枚举列表，按需调整）
        if (enumClass == null || !enumClass.isEnum()) {
            return Collections.emptyList();
        }
        // 若过滤集合为 null/空，返回所有枚举项（避免误过滤）
        if (filterCodes == null || filterCodes.isEmpty()) {
            return Arrays.stream(enumClass.getEnumConstants())
                    .map(EnumUtil::convertEnumToMap)
                    .collect(Collectors.toList());
        }

        // 核心逻辑：过滤掉 code 在 filterCodes 中的枚举项
        return Arrays.stream(enumClass.getEnumConstants())
                // 过滤条件：枚举的 code 不在过滤集合中
                .filter(item -> !filterCodes.contains(item.getCode()))
                // 转换为 Map
                .map(EnumUtil::convertEnumToMap)
                // 收集为 List
                .collect(Collectors.toList());
    }
    /**
     * 将枚举项转换为 Map
     *
     * @param enumItem 枚举项
     * @return 包含 value、code、info 的 Map
     */
    private static Map<String, Object> convertEnumToMap(HisEnumInterface enumItem) {
        Map<String, Object> map = new HashMap<>(3);
        map.put("value", enumItem.getValue());
        map.put("code", enumItem.getCode());
        map.put("info", enumItem.getInfo());
        return map;
    }

    /**
     * 获取枚举的所有 value 列表
     *
     * @param enumClass 枚举类
     * @return value 列表
     */
    public static List<Object> getValues(Class<? extends HisEnumInterface> enumClass) {
        if (enumClass == null || !enumClass.isEnum()) {
            return Collections.emptyList();
        }

        return Arrays.stream(enumClass.getEnumConstants())
                .map(HisEnumInterface::getValue)
                .collect(Collectors.toList());
    }

    /**
     * 获取枚举的所有 code 列表
     *
     * @param enumClass 枚举类
     * @return code 列表
     */
    public static List<String> getCodes(Class<? extends HisEnumInterface> enumClass) {
        if (enumClass == null || !enumClass.isEnum()) {
            return Collections.emptyList();
        }

        return Arrays.stream(enumClass.getEnumConstants())
                .map(HisEnumInterface::getCode)
                .collect(Collectors.toList());
    }

    /**
     * 获取枚举的所有 info 列表
     *
     * @param enumClass 枚举类
     * @return info 列表
     */
    public static List<String> getInfos(Class<? extends HisEnumInterface> enumClass) {
        if (enumClass == null || !enumClass.isEnum()) {
            return Collections.emptyList();
        }

        return Arrays.stream(enumClass.getEnumConstants())
                .map(HisEnumInterface::getInfo)
                .collect(Collectors.toList());
    }

    /**
     * 根据 value 获取枚举项
     *
     * @param enumClass 枚举类
     * @param value     枚举值
     * @return 枚举项，未找到返回 null
     */
    public static <T extends HisEnumInterface> T getByValue(Class<T> enumClass, Object value) {
        if (enumClass == null || !enumClass.isEnum() || value == null) {
            return null;
        }

        return Arrays.stream(enumClass.getEnumConstants())
                .filter(item -> value.equals(item.getValue()))
                .findFirst()
                .orElse(null);
    }

    /**
     * 根据 code 获取枚举项
     *
     * @param enumClass 枚举类
     * @param code      枚举编码
     * @return 枚举项，未找到返回 null
     */
    public static <T extends HisEnumInterface> T getByCode(Class<T> enumClass, String code) {
        if (enumClass == null || !enumClass.isEnum() || code == null) {
            return null;
        }

        return Arrays.stream(enumClass.getEnumConstants())
                .filter(item -> code.equals(item.getCode()))
                .findFirst()
                .orElse(null);
    }
}