import axios from 'axios'
import { ElMessage } from 'element-plus'
import { useLangStore } from '@/pinia/langStore'
import { useAppStore } from '@/pinia/appStore'
// 创建 axios 实例
const request = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL,
  timeout: 30000,
  headers: {
    'Content-Type': 'application/json;charset=UTF-8'
  }
})

// 请求拦截器
request.interceptors.request.use(
  config => {
    // 获取 token（假设存储在 localStorage 中）
    const token = localStorage.getItem('token')
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    const langStore = useLangStore();
    config.headers['Accept-Language'] = langStore.currentLang==='en'?'en':'zh';
    
    // 处理请求参数
    if (config.method === 'get' && config.params) {
      // 过滤掉空值参数
      // const filteredParams = {}
      // Object.keys(config.params).forEach(key => {
      //   if (config.params[key] !== null && config.params[key] !== undefined && config.params[key] !== '') {
      //     filteredParams[key] = config.params[key]
      //   }
      // })
      // config.params = filteredParams
    }

    // 支持 formData
    if (config.data instanceof FormData) {
      // 如果是 FormData 类型，移除默认的 Content-Type，让浏览器自动设置
      delete config.headers['Content-Type']
    }
    
    return config
  },
  error => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
request.interceptors.response.use(
  response => {
    const appStore = useAppStore();
    // 根据后端约定的响应结构进行状态判断
    const { code, data, msg } = response.data
    
    // 假设 code 为 200 表示成功
    if (code === 200) {
      return response.data
    } else if ([410000, 410001, 410002, 401, 403].includes(code)){
      appStore.LOGOUT();
      localStorage.removeItem('token')
      //弹出登录框
      appStore.showLoginDialog = true;
      // window.location.href = '/login'
      
      return response.data
    }else {
      ElMessage.error(msg|| '请求失败')
      return response.data
    }
  },
  error => {
    console.error('响应错误:', error)
    
    // HTTP 状态码错误处理
    if (error.response) {
      const { status, data } = error.response
      switch (status) {
        case 401:
          // 未授权
          localStorage.removeItem('token')
          break
        case 403:
          // 禁止访问
          console.error('禁止访问:', data.message)
          break
        case 404:
          // 资源不存在
          console.error('请求资源不存在')
          break
        case 500:
          // 服务器内部错误
          console.error('服务器内部错误')
          break
        default:
          console.error(`连接错误:${status}`)
      }
    } else if (error.request) {
      // 请求发出但没有收到响应
      console.error('网络错误，请检查网络连接')
    } else {
      // 其他错误
      console.error('请求失败:', error.message)
    }
    
    return Promise.reject(error)
  }
)

/**
 * GET 请求
 * @param {string} url 请求地址
 * @param {object} params 请求参数
 * @param {object} config 其他配置
 */
export function get(url, params = {}, config = {}) {
  return request({
    method: 'get',
    url,
    params,
    ...config
  })
}

/**
 * POST 请求
 * @param {string} url 请求地址
 * @param {object} data 请求数据
 * @param {object} config 其他配置
 */
export function post(url, data = {}, config = {}) {
  return request({
    method: 'post',
    url,
    data,
    ...config
  })
}

/**
 * PUT 请求
 * @param {string} url 请求地址
 * @param {object} data 请求数据
 * @param {object} config 其他配置
 */
export function put(url, data = {}, config = {}) {
  return request({
    method: 'put',
    url,
    data,
    ...config
  })
}

/**
 * DELETE 请求
 * @param {string} url 请求地址
 * @param {object} params 请求参数
 * @param {object} config 其他配置
 */
export function del(url, params = {}, config = {}) {
  return request({
    method: 'delete',
    url,
    params,
    ...config
  })
}

export default {
  get,
  post,
  put,
  del
}
