package com.ruoyi.aspect;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.cache.DictCache;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.bean.BeanValidators;
import lombok.RequiredArgsConstructor;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import javax.validation.Validator;
import java.lang.reflect.Field;
import java.util.List;

@Aspect
@Component
@RequiredArgsConstructor
public class ImportAspect {
    protected final Validator validator;

    @Around("execution(* com.ruoyi.database.service.*.*import*(..))")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        // 获取方法的入参
        Object[] args = joinPoint.getArgs();
        List<?> importList = (List<?>) args[0];


        if (CollUtil.isEmpty(importList)) {
            throw new ServiceException("导入数据为空");
        }

        // 获取list表中类的类型
        Class<?> clazz = importList.get(0).getClass();

        // 错误标记，判断是否有错误信息
        boolean errorFlag = false;
        // 遍历list表中的数据，回填字典值
        for (Object obj : importList) {

            // 记录属性中存在区域编码相关的属性的个数，判断如何回填区域编码
            int codeCount = 0;
            // 获取类中的所有属性
            for (Field field : clazz.getDeclaredFields()) {
                // 判断属性中是否有Cn结尾的属性
                String fieldName = field.getName();
                if (StrUtil.endWithIgnoreCase(fieldName, "Cn") && !field.getName().equals("structuredCameraTypeCn")) {
                    field.setAccessible(true);
                    // 获取非Cn属性名
                    String fieldName1 = StrUtil.subBefore(fieldName, "Cn", true);
                    String dictType = StrUtil.toUnderlineCase(fieldName1);
                    // 获取字典标签
                    Object dictLabel = field.get(obj);
                    int dictValue;
                    try {
                        // 获取字典值
                        dictValue = Integer.parseInt(DictCache.getDictValue(StrUtil.format("{}-{}", dictType, dictLabel)));
                    } catch (Exception e) {
                        // 字典值不存在，跳过
                        continue;
                    }
                    // 回填字典值
                    ReflectUtil.setFieldValue(obj, fieldName1, dictValue);
                }


//                // 判断属性中是否存在区域编码相关的属性
//                if (StrUtil.equalsAny(fieldName, "placeCode", "gridCode", "buildingCode", "unitCode", "homeCode")) {
//                    codeCount++;
//                }


            }

            // 校验数据，校验不通过则记录错误信息
            try {
                BeanValidators.validateWithException(validator, obj);
            } catch (Exception e) {
                ReflectUtil.setFieldValue(obj, "remark", e.getMessage());
                errorFlag = true;
                continue;
            }

        }

        if (errorFlag) {
            return importList;
        }

        // 执行目标方法
        return joinPoint.proceed();
    }
}
