package com.yeejoin.amos.boot.module.jg.biz.utils;

import cn.hutool.extra.spring.SpringUtil;
import com.yeejoin.amos.boot.biz.common.typeHandler.DictTypeHandler;
import com.yeejoin.amos.boot.biz.common.typeHandler.TypeHandler;
import com.yeejoin.amos.boot.module.jg.api.annotation.DictCode2DictName;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Field;
import java.util.List;
import java.util.Objects;

@Slf4j
public class DictUtil {

    /**
     * 配合注解@DictCode2DictName(code="",type="")使用
     * 将字段从dictCode转化为dictName
     *
     * @param data 需要转化的数据
     */
    public static void dictCode2DictName(Object data) {
        if (data == null) {
            return;
        }

        // 处理 List 类型
        if (data instanceof List<?>) {
            List<?> list = (List<?>) data;
            for (Object item : list) {
                dictCode2DictName(item); // 递归处理每个元素
            }
        } else {
            // 处理单个对象
            Field[] fields = data.getClass().getDeclaredFields();
            for (Field field : fields) {
                field.setAccessible(true);

                if (field.isAnnotationPresent(DictCode2DictName.class)) {
                    try {
                        DictCode2DictName annotation = field.getAnnotation(DictCode2DictName.class);
                        String code = Objects.toString(field.get(data));
                        String type = annotation.type();
                        String typeHandler = annotation.typeHandler();
                        String name = "";

                        Object handler = SpringUtil.getBean(typeHandler);

                        if (handler instanceof DictTypeHandler) {
                            name = ((DictTypeHandler) handler).handle(type, code);
                        } else if (handler instanceof TypeHandler) {
                            name = Objects.toString(((TypeHandler) handler).handle(code));
                        } else {
                            log.warn("未识别的 handler 类型：{}", handler.getClass().getName());
                        }

                        field.set(data, name);
                    } catch (IllegalAccessException | IllegalArgumentException e) {
                        log.error("字段赋值失败: {}, 类型: {}", field.getName(), data.getClass().getName(), e);
                    }
                }
            }
        }
    }
}
