package com.gyee.runeconomy.dto.FiveLoss;

import com.gyee.runeconomy.dto.speed.Desc;

import java.lang.reflect.Field;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

/**
 * 注解工具类，提供解析注解的方法
 */
public class AnnotationTool {

    /**
     * 获取打了Desc注解的字典属性列表
     * 该方法用于从给定的Class<T>对象中获取所有带有Desc注解的字段，并将这些字段的信息封装到FixedVo对象中，然后返回一个包含这些FixedVo对象的列表
     * @return 字典属性列表
     */
    public static <T> List<FixedVo> getFixedVoList(Class<T> c) {
        if (c == null) {
            return Collections.emptyList();
        }
        try {
            T cls = c.newInstance();
            Field[] fields = c.getDeclaredFields();
            List<FixedVo> fixedVoList = new LinkedList<>();
            for (Field field : fields) {
                //使私有对象可以访问
                field.setAccessible(true);
                //检查字段是否有Desc注解
                Desc desc = field.getAnnotation(Desc.class);
                if (desc != null) {
                    FixedVo vo = new FixedVo();
                    vo.setKey(String.valueOf(field.get(cls)));
                    vo.setName(field.getName());
                    vo.setDes(desc.des());
                    vo.setUniformCode(desc.uniformCode());
                    vo.setRemark(desc.remark());
                    fixedVoList.add(vo);
                }
            }
            return fixedVoList;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return Collections.emptyList();
    }

    /**
     * 通过反射获取值
     * @param object
     * @return
     */
    public static List<FixedVo> getValueList(Object object) {
        if (object == null) {
            return Collections.emptyList();
        }
        try {
            Field[] fields = object.getClass().getDeclaredFields();
            List<FixedVo> fixedVoList = new LinkedList<>();
            for (Field field : fields) {
                //使私有对象可以访问
                field.setAccessible(true);
                Desc desc = field.getAnnotation(Desc.class);
                if (desc != null) {
                    FixedVo vo = new FixedVo();
                    Object o = field.get(object);
                    vo.setKey(String.valueOf(o));
                    vo.setRemark(desc.remark());
                    fixedVoList.add(vo);
                }
            }
            return fixedVoList;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return Collections.emptyList();
    }
}
