package org.example.Utils;

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

public class FormParamUtil {

    /**
     * 临时禁用 ZipedPms 和 requestPms 字典（注释掉自定义参数缓存）
     * 原因：避免干扰前端传递的原始参数
     */
    // private static final Map<String, Object> ZipedPms = new HashMap<>();
    // private static final Map<String, Object> requestPms = new HashMap<>();

    /**
     * 将表单参数转换为 MyBatis 可用的 Map
     */
    public static Map<String, Object> convertToMyBatisParamMap(HttpServletRequest request) {
        Map<String, Object> paramMap = new HashMap<>();
        Enumeration<String> paramNames = request.getParameterNames();

        while (paramNames.hasMoreElements()) {
            String paramName = paramNames.nextElement();
            String[] values = request.getParameterValues(paramName);

            if (values != null && values.length > 0) {
                paramMap.put(paramName, values.length == 1 ? values[0] : values);
            }
        }

        return paramMap;
    }

    /**
     * 从 HttpServletRequest 获取参数（保持原始大小写）
     */
    @SuppressWarnings("unchecked")
    public static <T> T getParamValue(String key, T defaultValue, HttpServletRequest request) {
        if (key == null || request == null) {
            return defaultValue;
        }

        // 直接使用原始参数名（不转小写）
        String[] values = request.getParameterValues(key);

        // 2. 如果未找到且需要忽略大小写，再次尝试
        if ((values == null || values.length == 0) && !key.isEmpty()) {
            Enumeration<String> paramNames = request.getParameterNames();
            while (paramNames.hasMoreElements()) {
                String paramName = paramNames.nextElement();
                if (paramName.equalsIgnoreCase(key)) {
                    values = request.getParameterValues(paramName);
                    break;
                }
            }
        }

        if (values != null && values.length > 0) {
            // 取第一个非空值
            for (String val : values) {
                if (val != null && !val.trim().isEmpty()) {
                    return (T) convertValue(val, defaultValue);
                }
            }
            // 所有值都为空时，取第一个值
            return (T) convertValue(values[0], defaultValue);
        }

        return defaultValue;
    }

    /**
     * 安全获取可空布尔值参数（解决defaultValue为null时的类型转换问题）
     */
    public static Boolean getNullableBoolean(String key, HttpServletRequest request) {
        String value = getParamValue(key, (String) null, request);
        if (value == null) {
            return null; // 未传参数时返回null
        }

        value = value.trim().toLowerCase();
        if ("true".equals(value) || "1".equals(value) || "on".equals(value)) {
            return true;
        } else if ("false".equals(value) || "0".equals(value) || "off".equals(value)) {
            return false;
        }

        return null; // 无效值时返回null（可根据需求改为抛出异常）
    }

    /**
     * 类型转换逻辑
     */
    private static Object convertValue(Object value, Object targetType) {
        if (value == null) {
            return null;
        }

        String strValue = value.toString().trim();

        try {
            if (targetType instanceof Boolean) {
                String lowerVal = strValue.toLowerCase();
                return "true".equals(lowerVal) || "on".equals(lowerVal) || "1".equals(lowerVal);
            } else if (targetType instanceof Integer) {
                return Integer.valueOf(strValue);
            } else if (targetType instanceof String) {
                return strValue;
            }
        } catch (Exception e) {
            return null;
        }

        return value;
    }

    public static String GetParamString(String key, String defaultValue) {
        HttpServletRequest request = RequestContextHolder.getRequestAttributes() != null
                ? ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()
                : null;
        return FormParamUtil.getParamValue(key, defaultValue, request);
    }

    /**
     * 临时禁用自定义参数设置方法（与字典一起注释）
     */
    // public static void setZipedParam(String key, Object value) {
    //     ZipedPms.put(key.toLowerCase(), value);
    // }
    //
    // public static void setRequestParam(String key, Object value) {
    //     requestPms.put(key.toLowerCase(), value);
    // }
}