package com.rongwei.sfcommon.utils;

import cn.afterturn.easypoi.excel.entity.result.ExcelVerifyHandlerResult;
import cn.afterturn.easypoi.handler.inter.IExcelVerifyHandler;
import cn.hutool.core.util.ObjectUtil;
import lombok.SneakyThrows;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;

/**
 * ClassExcelVerifyHandler class
 *
 * @author XH
 * @date 2024/06/19
 */
@Component
public class ClassExcelVerifyHandler implements IExcelVerifyHandler<Object> {
    @SneakyThrows
    @Override
    public ExcelVerifyHandlerResult verifyHandler(Object obj) {
        ExcelVerifyHandlerResult result = new ExcelVerifyHandlerResult(true);
        if (ObjectUtil.isNotNull(obj)) {
            //判断对象属性是否全部为空
            boolean b = areAllFieldsNull(obj);
            result.setSuccess(!b);
        }
        return result;
    }

    private boolean areAllFieldsNull(Object obj) {
        if (obj == null) {
            // 如果对象是null，我们返回true（尽管这可能不是你所期望的）
            // 或者你可以抛出一个异常，取决于你的用例
            return true;
        }

        Class<?> clazz = obj.getClass();
        Field[] fields = clazz.getDeclaredFields();

        for (Field field : fields) {
            field.setAccessible(true); // 允许访问私有字段
            try {
                if (field.get(obj) != null) {
                    // 如果找到任何非null的字段，返回false
                    return false;
                }
            } catch (IllegalAccessException e) {
                // 这通常不会发生，因为我们已经设置了setAccessible(true)
                // 但为了完整性，我们还是捕获了这个异常
                throw new RuntimeException(e);
            }
        }
        // 如果没有找到任何非null的字段，返回true
        return true;
    }
}
