import axios from 'axios'
import type { AxiosResponse } from 'axios'
import store from '@/stores'
import router from '@/router'

/**
 * 自定义 JSON 解析：将超出安全整数范围的数字转为字符串，防止精度丢失
 * 匹配 JSON 中独立的纯数字（超过 15 位的整数），加上引号变成字符串
 */
function safeParseLargeNumbers(data: string) {
  const processed = data.replace(/:\s*(\d{16,})/g, ':"$1"')
  return JSON.parse(processed)
}

/**
 * 创建 axios 实例
 * withCredentials: true — 浏览器自动携带 Cookie（包括 HttpOnly 的 Token）
 */
const service = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL,
  timeout: 15000,
  withCredentials: true,
  // 自定义响应解析，防止大整数 ID 精度丢失
  transformResponse: [(data: string) => {
    try {
      return safeParseLargeNumbers(data)
    } catch {
      return data
    }
  }],
})

/**
 * 响应拦截器 — 统一处理错误
 */
service.interceptors.response.use(
  (response: AxiosResponse) => {
    return response.data
  },
  (error) => {
    const status = error.response?.status
    if (status === 401) {
      // 同步重置前端登录状态，弹出登录弹窗（白名单页面不弹）
      store.commit('SET_AUTHENTICATED', false)
      const publicPages = ['Home', 'HomeMobile', 'Login', 'SuperRjtfoewjksfewjLogin', 'Jobs', 'JobDetail', 'Announcement', 'AnnouncementDetail', 'MentorDetail', 'PrivacyPolicy']
      const currentRouteName = router.currentRoute.value.name as string
      if (!publicPages.includes(currentRouteName)) {
        store.dispatch('openLogin', window.location.pathname)
        ElMessage.error('登录已过期，请重新登录')
      }
    } else {
      ElMessage.error(error.response?.data?.msg || '请求失败')
    }
    return Promise.reject(error)
  },
)

export default service
