import axios from 'axios'
import { ElMessage } from 'element-plus'


axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded'
// 创建axios实例
const service = axios.create({
    // axios中请求配置有baseURL选项，表示请求URL公共部分
    baseURL: import.meta.env.VITE_APP_BASE_API,
    // 超时
    timeout: 10000
})

// request拦截器
service.interceptors.request.use(config => {
    console.log(config)
    // 过滤掉参数值为空的参数项
    if (config.params) {
        config.params = filterEmptyParams(config.params);
    }

    if (config.data && typeof config.data === 'object') {
        // 根据Content-Type处理不同格式的数据
        if (config.headers['Content-Type'] === 'application/x-www-form-urlencoded') {
            // 表单编码数据需要特殊处理
            config.data = filterFormData(config.data);
        } else {
            config.data = filterEmptyParams(config.data);
        }
    }

    return config
}, error => {
    console.log(error)
    Promise.reject(error)
})

/**
 * 过滤空值参数
 * @param {Object} params 参数对象
 * @returns {Object} 过滤后的参数对象
 */
function filterEmptyParams(params) {
    const filtered = {};
    for (const key in params) {
        const value = params[key];
        // 保留非空值：非null、非undefined、非空字符串、非空数组
        if (value !== null && value !== undefined && value !== '') {
            if (Array.isArray(value) && value.length === 0) {
                continue; // 跳过空数组
            }
            filtered[key] = value;
        }
    }
    return filtered;
}

/**
 * 过滤表单编码数据
 * @param {Object|string} data 表单数据
 * @returns {string} 过滤后的表单字符串
 */
function filterFormData(data) {
    if (typeof data === 'string') {
        // 如果是字符串，尝试解析为URLSearchParams
        const params = new URLSearchParams(data);
        for (const [key, value] of params.entries()) {
            if (value === '' || value === 'null' || value === 'undefined') {
                params.delete(key);
            }
        }
        return params.toString();
    } else if (typeof data === 'object') {
        // 如果是对象，先过滤空值再转换为URLSearchParams
        const filtered = filterEmptyParams(data);
        return new URLSearchParams(filtered).toString();
    }
    return data;
}

// 响应拦截器
service.interceptors.response.use(res => {
        const code = res.data.errorCode || 0
        const msg = res.data.errorMsg || ''
        if (code === 20000) {
            ElMessage({ message: msg, type: 'error' })
        } else {
            return  Promise.resolve(res.data)
        }
    },
    error => {
        console.log('err' + error)
        let { message } = error
        ElMessage({ message: message, type: 'error', duration: 5 * 1000 })
        return Promise.reject(error)
    }
)

export default service
