/**
 * axios 封装
 */
import axios from 'axios'
import {ElMessage, ElMessageBox} from 'element-plus'
import {tansParams} from '@/utils/index'
import {getToken, removeToken, removeUserTenantInfo} from '@/utils/auth'

// 配置基础URL
const baseURL = window.config?.baseUrl || 'http://work.rangutech.cn:9131'

// 设置默认请求头
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'

// 创建axios实例
const service = axios.create({
  baseURL,
  timeout: 10000, // 添加合理的超时时间
})

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    // 是否需要设置 token
    const isToken = (config.headers || {}).isToken === false

    // 添加token到请求头
    if (getToken() && !isToken) {
      config.headers.Authorization = `Bearer ${getToken()}`
    }

    // GET请求参数处理
    if (config.method?.toLowerCase() === 'get' && config.params) {
      const urlParams = tansParams(config.params)
      config.url = `${config.url}?${urlParams}`
      config.params = {}
    }

    return config
  },
  (error) => {
    console.error('Request error:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  (response) => {
    const {data, config} = response

    // 处理二进制数据响应
    if (
      config.responseType === 'blob' ||
      config.responseType === 'arraybuffer'
    ) {
      return data
    }

    // 正常响应处理
    if (response.status === 200) {
      return data
    }

    // 异常响应处理
    return Promise.reject(response)
  },
  (error) => {
    const {config, response, message} = error

    console.error('Response error:', {config, response, message})

    // 处理认证错误
    if (response && [401, 471, 472].includes(response.status)) {
      handleAuthError(config, response)
      return Promise.reject(error)
    }

    // 处理网络错误
    handleNetworkError(message)

    return Promise.reject(error)
  }
)

/**
 * 处理认证错误
 */
function handleAuthError(config, response) {
  const excludeUrls = ['/Token/Logout', '/Token/Access']

  if (!excludeUrls.includes(config.url)) {
    ElMessageBox.confirm(
      '登录状态已过期，您可以继续留在该页面，或者重新登录',
      '系统提示',
      {
        confirmButtonText: '重新登录',
        cancelButtonText: '取消',
        type: 'warning',
      }
    )
      .then(() => {
        removeToken()
        removeUserTenantInfo()
        // 这里需要导入store
        // store.dispatch('LogOut').then(() => {});
        window.location.reload() // 简单重载页面
      })
      .catch(() => {
        // 用户取消操作
      })
  }
}

/**
 * 处理网络错误
 */
function handleNetworkError(message) {
  let errorMsg = message

  if (message === 'Network Error') {
    errorMsg = '网络连接异常，请检查网络设置'
  } else if (message.includes('timeout')) {
    errorMsg = '请求超时，请稍后重试'
  }

  ElMessage({
    message: errorMsg,
    type: 'error',
    duration: 5 * 1000,
  })
}

export default service
