package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base;

import cn.estsh.i3plus.ext.mes.pcn.api.base.IEnumPcnDataService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.EnumExtUtil;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author: Wynne.Lu
 * @CreateDate: 2019/8/30 1:39 PM
 * @Description:
 **/
@Slf4j
@Service
@ApiOperation(value = "获取MesPcnExtEnumUtil")
public class EnumPcnDataService implements IEnumPcnDataService {

    @Override
    public List<Map<String, Object>> getAllMesEnums() throws NoSuchMethodException, ClassNotFoundException, InvocationTargetException, IllegalAccessException {
        Class innerClazz[] = MesPcnExtEnumUtil.class.getDeclaredClasses();// 获取常量类中的所有内部类
//        Class<Enum> clazz;
//        Enum[] enumConstants;

        List<Map<String, Object>> enumList = new ArrayList<>();// 所有枚举
        Map<String, Object> enumMap;// 枚举类
//        List<Map<String, Object>> values;// 枚举实例【enumName：{“”：}，{“”：}，{“”：}】
//        Map<String, Object> value;// 枚举实例属性
//
//        Method getValue;
//        Method getCode;
//        Method getDescription;

        // 遍历内部类
        for (Class class1 : innerClazz) {
            // 判断类是不是枚举类
//            clazz = (Class<Enum>) Class.forName("cn.estsh.i3plus.ext.mes.pojo.util.MesPcnExtEnumUtil$" + class1.getSimpleName());
//
////             枚举类方法初始化
//            getCode = null;
//            try {
//                getCode = clazz.getMethod("getCode");
//            } catch (NoSuchMethodException e) {
//            }
//            getValue = null;
//            try {
//                getValue = clazz.getMethod("getValue");
//            } catch (NoSuchMethodException e) {
//                e.printStackTrace();
//            } catch (SecurityException e) {
//                e.printStackTrace();
//            }
//            getDescription = clazz.getMethod("getDescription");
//
//            // 获取所有枚举实例
//            enumConstants = clazz.getEnumConstants();
//            enumMap = new HashMap<>();
//            values = new ArrayList<>();
//            for (Enum enum1 : enumConstants) {
//                value = new HashMap<>();
//                if (getValue != null) {
//                    value.put("value", getValue.invoke(enum1));
//                }
//                if (getCode != null) {
//                    value.put("code", getCode.invoke(enum1));
//                }
//                value.put("description", getDescription.invoke(enum1));
//                values.add(value);
//            }
//            enumMap.put("enumName", clazz.getSimpleName());
//            enumMap.put("valuesList", values);
            enumMap = getEnumByClazzEnum(class1.getSimpleName(), MesPcnExtEnumUtil.class);
            enumList.add(enumMap);
        }
        return enumList;
    }

    @Override
    public Map<String, Object> doGetMesEnumByEnumName(String enumName) {
        return getEnumByClazzEnum(enumName, MesPcnExtEnumUtil.class);
    }

    @Override
    public Map<String, Object> getEnumByClazzEnum(String enumName, Class clz) {
        return EnumExtUtil.getEnumByName(clz, enumName);
//        Class innerClazz[] = clz.getDeclaredClasses();// 获取常量类中的所有内部类
//        Class<Enum> clazz = null;
//        Enum[] enumConstants;
//        for (Class aClass : innerClazz) {
//            if (aClass.getSimpleName().equals(enumName)) {
//                clazz = aClass;
//                break;
//            }
//        }
//        if (clazz == null) {
//            return null;
//        }
//        Map<String, Object> enumMap = new HashMap<>();
//        List<Map<String, Object>> values = new ArrayList<>();
//        Map<String, Object> value;
//
//        Method getValue;
//        Method getCode;
//        Method getDescription;
////        // 判断类是不是枚举类
////        clazz = (Class<Enum>) Class.forName("cn.estsh.i3plus.ext.mes.pojo.util.MesPcnExtEnumUtil$" + clazz.getSimpleName());
//        // 枚举类方法初始化
//        getCode = null;
//        try {
//            getCode = clazz.getMethod("getCode");
//        } catch (NoSuchMethodException e) {
//        }
//        getValue = clazz.getMethod("getValue");
//        getDescription = clazz.getMethod("getDescription");
//
//        // 获取所有枚举实例
//        enumConstants = clazz.getEnumConstants();
//
//        for (Enum enum1 : enumConstants) {
//            value = new HashMap<>();
//            value.put("value", getValue.invoke(enum1));
//            if (getCode != null) {
//                value.put("code", getCode.invoke(enum1));
//            }
//            value.put("description", getDescription.invoke(enum1));
//            values.add(value);
//        }
//        enumMap.put("enumName", clazz.getSimpleName());
//        enumMap.put("valuesList", values);
//
//        return enumMap;
    }

    @Override
    public List<Map<String, Object>> getEnumValuesByClazzEnum(String enumName, Class clazz){
        return (List<Map<String, Object>>) getEnumByClazzEnum(enumName,clazz).get("valuesList");
    }


    @Override
    public Map<String, String> getEnumLangeuageKeyByClazzEnum(Class clazz)  {

        try {
            Map<String, String> value = null;
            Method getValue;
            getValue = clazz.getMethod("getValue");

            // 获取所有枚举实例
            Enum[] enumConstants = (Enum[]) clazz.getEnumConstants();
            value = new HashMap<>();
            for (Enum enum1 : enumConstants) {
                String key = clazz.getSimpleName() + ":" + enum1.name();
                value.put(getValue.invoke(enum1).toString(), key);
            }
            return value;
        } catch (Exception e) {
            log.error("获取枚举的资源键失败。。");
            return null;
        }
    }

}
