import axios from 'axios'
import type { AxiosInstance, InternalAxiosRequestConfig, AxiosResponse } from 'axios'
import { useUserStore } from '@/stores/user'
import router from '@/router'
import { ElMessage } from 'element-plus'

// 创建 Axios 实例
const http: AxiosInstance = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || '',
  timeout: 60000,
  withCredentials: true,  // 关键：携带 Cookie（Flask Session）
  headers: {
    'Content-Type': 'application/json'
  }
})

// 请求拦截器
http.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    // Flask Session + Cookie 模式，无需手动添加 Authorization header
    // withCredentials: true 已确保 Cookie 自动携带
    return config
  },
  (error) => Promise.reject(error)
)

// 响应拦截器
http.interceptors.response.use(
  (response: AxiosResponse) => {
    return response
  },
  (error) => {
    if (error.response) {
      const { status, data } = error.response

      switch (status) {
        case 401:
          // 未登录 / Session 过期
          const userStore = useUserStore()
          userStore.clearUser()
          // 避免在登录页重复跳转
          if (router.currentRoute.value.name !== 'Login') {
            router.push({
              name: 'Login',
              query: { next: router.currentRoute.value.fullPath }
            })
          }
          ElMessage.warning('登录已过期，请重新登录')
          break

        case 403:
          ElMessage.error('权限不足，仅管理员可访问')
          break

        case 409:
          // 巡检冲突（已有巡检运行中）
          ElMessage.warning(data?.error?.message || data?.message || '操作冲突')
          break

        default:
          // 统一错误提示（兼容两种格式）
          const errMsg = data?.error?.message || data?.error || data?.message || `请求失败 (${status})`
          ElMessage.error(errMsg)
      }
    } else if (error.code === 'ECONNABORTED') {
      ElMessage.error('请求超时，请稍后重试')
    } else {
      ElMessage.error('网络错误，请检查网络连接')
    }

    return Promise.reject(error)
  }
)

export default http
