import axios from 'axios'
import { ElMessage } from 'element-plus'
import router from '../router'

// 创建axios实例
const api = axios.create({
  baseURL: '/api', // 基础URL
  timeout: 10000 // 请求超时时间
})

// 请求拦截器
api.interceptors.request.use(
  config => {
    // 打印请求URL和方法
    console.log(`发送请求: ${config.method.toUpperCase()} ${config.url}`)

    // 从localStorage获取token相关信息
    const token = localStorage.getItem('token')
    const tokenName = localStorage.getItem('tokenName') || 'satoken'
    const tokenPrefix = localStorage.getItem('tokenPrefix') || ''

    if (token) {
      // 将token添加到请求头
      // Sa-Token默认从请求头的tokenName字段中读取token
      config.headers[tokenName] = tokenPrefix + token

      // 添加到Authorization头中，以防万一
      config.headers['Authorization'] = tokenPrefix + token

      // 打印请求头信息，便于调试
      console.log('请求头信息:', {
        url: config.url,
        method: config.method,
        tokenName,
        tokenValue: tokenPrefix + token,
        headers: config.headers
      })
    } else {
      console.warn('未找到token，请求可能会被拒绝')
    }
    return config
  },
  error => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
api.interceptors.response.use(
  response => {
    const res = response.data
    const url = response.config.url
    const method = response.config.method

    // 打印响应信息
    console.log(`收到响应: ${method.toUpperCase()} ${url}`, res)

    // 如果返回的状态码不是200，说明接口请求失败
    if (res.code !== 200) {
      // 根据不同的错误码进行不同的处理
      if (res.code === 401) {
        // 未登录或token过期
        console.warn('响应拦截器: 登录已过期，请重新登录', {
          url,
          method,
          response: res,
          headers: response.config.headers,
          token: localStorage.getItem('token'),
          tokenName: localStorage.getItem('tokenName'),
          tokenPrefix: localStorage.getItem('tokenPrefix')
        })

        ElMessage.error('登录已过期，请重新登录')

        // 清除本地存储的所有信息
        localStorage.removeItem('token')
        localStorage.removeItem('tokenName')
        localStorage.removeItem('tokenPrefix')
        localStorage.removeItem('user')
        localStorage.removeItem('isAdmin')

        // 跳转到登录页面
        router.push('/login?redirect=' + encodeURIComponent(window.location.pathname))
      } else if (res.code === 403) {
        // 无权限
        ElMessage.error('无权限访问')
      } else {
        // 其他错误
        ElMessage.error(res.message || '未知错误')
      }
      return Promise.reject(new Error(res.message || '未知错误'))
    } else {
      return res
    }
  },
  error => {
    console.error('响应错误:', error)

    // 尝试获取请求配置
    const config = error.config || {}
    console.error('错误请求配置:', {
      url: config.url,
      method: config.method,
      headers: config.headers,
      token: localStorage.getItem('token'),
      tokenName: localStorage.getItem('tokenName'),
      tokenPrefix: localStorage.getItem('tokenPrefix')
    })

    // 处理网络错误
    if (error.message && error.message.includes('timeout')) {
      ElMessage.error('请求超时，请稍后再试')
    } else if (error.message && error.message.includes('Network Error')) {
      ElMessage.error('网络错误，请检查网络连接')
    } else {
      ElMessage.error(error.message || '未知错误')
    }
    return Promise.reject(error)
  }
)

export default api
