import axios from 'axios'
import { getToken, removeToken } from '@/utils/auth'
import { Message } from 'element-ui'  // 修改为 Element UI 的引入方式

// 根据环境变量设置 baseURL
// 直接使用完整的服务器地址，避免代理配置问题
const baseURL = 'http://api.sg199.net'
const isDevelopment = process.env.NODE_ENV === 'development'

// 创建axios实例
const service = axios.create({
    baseURL: baseURL,
    timeout: 150000,
    headers: {
        'Content-Type': 'application/json;charset=UTF-8'
    }
})

// 请求拦截器
service.interceptors.request.use(
    config => {
        // 在发送请求之前做些什么
        const token = getToken()
        if (token) {
            // 添加 token 到请求头，支持多种格式
            // 方式1: 使用 token 字段（直接值）
            config.headers['token'] = token
            // 方式2: 使用 Authorization 字段（Bearer 格式）
            config.headers['Authorization'] = `Bearer ${token}`
            // 方式3: 使用 Authorization 字段（直接值，如果需要可以取消注释）
            // config.headers['Authorization'] = token
        }
        
        // 如果是 FormData（文件上传），删除 Content-Type，让浏览器自动设置 multipart/form-data
        if (config.data instanceof FormData) {
            delete config.headers['Content-Type']
        }
        
        // 添加请求时间戳，防止缓存（排除详情接口）
        if (config.method === 'get' && !config.skipTimestamp) {
            config.params = config.params || {}
            config.params._t = Date.now()
        }
        // 开发环境下打印请求信息，方便调试
        if (isDevelopment) {
            console.log('请求配置:', {
                url: config.url,
                method: config.method,
                baseURL: config.baseURL,
                fullURL: (config.baseURL || '') + config.url,
                hasToken: !!token,
                isFormData: config.data instanceof FormData,
                headers: {
                    token: token ? '已设置' : '未设置',
                    Authorization: token ? '已设置' : '未设置'
                }
            })
        }
        return config
    },
    error => {
        // 对请求错误做些什么
        console.log('Request Error:', error)
        return Promise.reject(error)
    }
)

// 响应拦截器
service.interceptors.response.use(
    response => {
        // 对响应数据做点什么
        const res = response.data

        // 自定义状态码验证（根据后端接口调整）
        // code: 1 表示成功，code: 200/0 也表示成功
        // 其他code值表示业务错误
        // 检查是否需要跳过自动提示（通过 config.skipMessage 配置）
        const skipMessage = response.config.skipMessage || false
        
        if (res.code !== 200 && res.code !== 0 && res.code !== 1) {
            // 特殊状态码处理（无论是否跳过提示都需要处理）
            if (res.code === 401 || res.code === 403) {
                // 重新登录
                removeToken()
                location.reload()
            }
            
            // 只有在不跳过提示时才显示错误消息
            if (!skipMessage) {
                Message({
                    message: res.msg || res.message || 'Error',
                    type: 'error',
                    duration: 5 * 1000
                })
            }
            
            // 创建错误对象并保留原始 config，以便 catch 拦截器也能检查 skipMessage
            const error = new Error(res.msg || res.message || 'Error')
            error.response = response
            error.config = response.config
            error.response.data = res
            return Promise.reject(error)
        } else {
            // 成功时返回整个响应对象，包含code、msg、data
            return res
        }
    },
    error => {
        // 对响应错误做点什么
        console.log('Response Error:', error)

        // 检查是否需要跳过自动提示（通过 config.skipMessage 配置）
        const skipMessage = error.config?.skipMessage || false

        // HTTP状态码处理
        let message = ''
        if (error.response) {
            switch (error.response.status) {
                case 400:
                    message = '请求错误(400)'
                    break
                case 401:
                    message = '未授权，请重新登录(401)'
                    removeToken()
                    location.reload()
                    break
                case 403:
                    message = '拒绝访问(403)'
                    break
                case 404:
                    message = '请求出错(404)'
                    break
                case 408:
                    message = '请求超时(408)'
                    break
                case 500:
                    message = '服务器错误(500)'
                    break
                case 501:
                    message = '服务未实现(501)'
                    break
                case 502:
                    message = '网络错误(502)'
                    break
                case 503:
                    message = '服务不可用(503)'
                    break
                case 504:
                    message = '网络超时(504)'
                    break
                case 505:
                    message = 'HTTP版本不受支持(505)'
                    break
                default:
                    message = `连接出错(${error.response.status})!`
            }
        } else {
            // Network Error 通常是跨域或服务器无法访问
            if (error.code === 'ERR_NETWORK' || error.message === 'Network Error') {
                message = '网络连接失败，请检查服务器地址或网络连接'
            } else if (error.message) {
                message = error.message
            } else {
                message = '连接服务器失败!'
            }
        }

        // 只有在不跳过提示时才显示错误消息
        if (!skipMessage) {
            Message({
                message,
                type: 'error',
                duration: 5 * 1000
            })
        }
        return Promise.reject(error)
    }
)

// 封装通用请求方法
export function request(config) {
    return service(config)
}

// 封装GET方法（带参数）
export function get(url, params, config = {}) {
    return service({
        url,
        method: 'get',
        params,
        ...config
    })
}

// 封装POST方法
export function post(url, data, config = {}) {
    return service({
        url,
        method: 'post',
        data,
        ...config
    })
}

// 封装PUT方法
export function put(url, data) {
    return service({
        url,
        method: 'put',
        data
    })
}

// 封装DELETE方法
export function del(url, params) {
    return service({
        url,
        method: 'delete',
        params
    })
}

export default service