import axios from 'axios'
import { ElMessage } from 'element-plus'
import router from '@/router'
//test
const request = axios.create({
  // 关键：不要设置baseURL，或者设置为空字符串
  // 这样请求会发送到当前域名（8080），然后被代理转发到8081
  baseURL: process.env.VUE_APP_BASE_API || '/api',
  timeout: 10000,
  headers: {
    // 'Content-Type': 'application/json'
  }
})

request.interceptors.request.use(
  config => {
    const token = localStorage.getItem('token')
    console.log('📤 添加 token 到请求头:', token)
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    
    console.log('🚀 发送请求:', config.method?.toUpperCase(), config.url)
    console.log('📤 请求数据:', config.data)
    console.log('🔍 VUE_APP_BASE_API:', process.env.VUE_APP_BASE_API)
    console.log('🔍 VUE_APP_BACKEND:', process.env.VUE_APP_BACKEND)
    
    return config
  },
  error => {
    console.error('❌ 请求错误:', error)
    return Promise.reject(error)
  }
)

request.interceptors.response.use(
  response => {
    console.log('✅ 响应成功:', response.status, response.data)
    return response.data
  },
  error => {
    console.error('❌ 响应错误:', error)
    
    if (error.response) {
      const { status, data } = error.response
      
      switch (status) {
        case 401:
          localStorage.removeItem('token')
          localStorage.removeItem('isLoggedIn') 
          localStorage.removeItem('userInfo')
          ElMessage.error('登录已过期，请重新登录')
          router.push('/login')
          break
        case 403:
          ElMessage.error('权限不足')
          break
        case 404:
          ElMessage.error('API接口不存在')
          console.error('❌ 请求的URL:', error.config.url)
          break
        case 500:
          ElMessage.error('服务器内部错误')
          break
        default:
          const errorMessage = data?.message || `请求失败 (${status})`
          ElMessage.error(errorMessage)
      }
    } else if (error.request) {
      ElMessage.error('无法连接到服务器，请检查网络')
    } else {
      ElMessage.error('请求配置错误')
    }
    
    return Promise.reject(error)
  }
)

export default request