package vip.xiaonuo.core.config;

import lombok.SneakyThrows;
import org.springframework.web.bind.annotation.ModelAttribute;

import java.lang.reflect.Field;
import java.util.Collection;
import java.util.Map;

//@ControllerAdvice
//@Component
public class GlobalTrimAdvice {

    @SneakyThrows
    @ModelAttribute
    public void trimStrings(Object model) {
        // 如果model是null，直接返回
        if (model == null) {
            return;
        }
        // 处理模型中的所有字段
        trimFields(model);
        // 如果有嵌套对象或集合，递归处理
        handleNestedObjects(model);
    }

    // 递归遍历对象字段并去掉首尾空格
    @SneakyThrows
    private void trimFields(Object model) {
        Field[] fields = model.getClass().getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true); // 设置字段可访问
            if (field.getType().equals(String.class)) {
                String value = (String) field.get(model);
                if (value != null) {
                    field.set(model, value.trim());
                }
            }
        }
    }

    // 递归处理嵌套对象或集合
    private void handleNestedObjects(Object model) {
        if (model == null) {
            return;
        }
        // 如果对象是一个集合，递归遍历每个元素
        if (model instanceof Collection) {
            for (Object element : (Collection<?>) model) {
                handleNestedObjects(element);
            }
        }
        // 如果对象是一个Map，递归遍历每个键值对
        else if (model instanceof Map) {
            for (Map.Entry<?, ?> entry : ((Map<?, ?>) model).entrySet()) {
                handleNestedObjects(entry.getValue());
            }
        }
        // 如果对象是一个普通JavaBean，递归遍历它的字段
        else {
            trimFields(model);
        }
    }
}
