import axios from 'axios'
import config from '@/config'
import { useUserStore } from '@/stores/modules/user'
import { message } from 'ant-design-vue'
import router from '@/router'

const request = axios.create({
	timeout: 30000,
	baseURL: config.API_URL,
})

// 请求拦截器
request.interceptors.request.use(
	(config) => {
		const userStore = useUserStore()
		const token = userStore.token

		// 如果有 token，添加到请求头
		if (token) {
			config.headers['Authorization'] = `Bearer ${token}`
		}

		return config
	},
	(error) => {
		return Promise.reject(error)
	},
)

// 响应拦截器
request.interceptors.response.use(
	(response) => {
		// 根据后端返回的数据结构进行处理
		// 后端返回格式为 { code, message, data }
		const { code, data, message: msg } = response.data

		// 请求成功
		if (code === 200 || code === 1) {
			return { code, data, message: msg }
		}

		// 其他错误码处理
		message.error(msg || '请求失败')
		return Promise.reject(new Error(msg || '请求失败'))
	},
	async (error) => {
		const userStore = useUserStore()
		const { response } = error

		// 无响应（网络错误、超时等）
		if (!response) {
			message.error('网络错误，请检查网络连接')
			return Promise.reject(error)
		}

		const { status, data } = response

		// 401 未授权 - token 过期或无效
		if (status === 401) {
			// 直接登出并跳转到登录页
			userStore.logout()
			router.push('/login')
			message.error('登录已过期，请重新登录')
			return Promise.reject(error)
		}

		// 403 禁止访问
		if (status === 403) {
			message.error('没有权限访问该资源')
			return Promise.reject(error)
		}

		// 404 资源不存在
		if (status === 404) {
			message.error('请求的资源不存在')
			return Promise.reject(error)
		}

		// 500 服务器错误
		if (status >= 500) {
			message.error('服务器错误，请稍后重试')
			return Promise.reject(error)
		}

		// 其他错误
		const errorMessage = data?.message || error.message || '请求失败'
		message.error(errorMessage)
		return Promise.reject(error)
	},
)

export default request
