import axios from 'axios'
import { message } from 'ant-design-vue'
import router from '@/router'
import { getApiBaseURL } from '@/utils/apiHelper'

// 创建axios实例
// 自动检测：如果通过 Nginx 访问（包含 ngrok），使用相对路径；否则使用完整 URL
const api = axios.create({
  baseURL: getApiBaseURL(),
  timeout: 900000, // 增加到15分钟，适应视频生成时间
  withCredentials: true,
  maxRedirects: 0, // 不自动跟随重定向，手动处理302
  headers: {
    'Content-Type': 'application/json'
  },
  validateStatus: function (status) {
    // 允许所有状态码，包括302，让拦截器处理
    return status >= 200 && status < 600
  }
})

// 请求拦截器
api.interceptors.request.use(
  (config) => {
    // 登录相关的接口不需要添加token
    const loginUrls = [
      '/auth/login',
      '/auth/login/email',
      '/auth/register',
      '/verification/email/send',
      '/verification/email/verify',
      '/verification/email/dev-set',
      '/public/'
    ]

    // 检查当前请求是否是登录相关接口
    const isLoginRequest = loginUrls.some(url => config.url.includes(url))

    if (!isLoginRequest) {
      // 非登录请求才添加Authorization头
      const token = localStorage.getItem('token')
      if (token && token !== 'null' && token.trim() !== '') {
        config.headers.Authorization = `Bearer ${token}`
        // 打印token前30字符用于调试
        console.log('请求拦截器：添加Authorization头，token前30字符:', token.substring(0, 30), '请求URL:', config.url)
      } else {
        console.warn('请求拦截器：未找到有效的token，请求URL:', config.url)
      }
    } else {
      console.log('请求拦截器：登录相关请求，不添加token:', config.url)
    }

    return config
  },
  (error) => {
    console.error('请求拦截器错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
api.interceptors.response.use(
  (response) => {
    // 检查是否是HTML响应（可能是302重定向的结果）
    if (response.data && typeof response.data === 'string' && response.data.trim().startsWith('<!DOCTYPE')) {
      console.error('收到HTML响应，可能是认证失败:', response.config.url)

      // 只有非登录请求才清除token并跳转
      const loginUrls = ['/auth/login', '/auth/login/email', '/auth/register', '/verification/', '/public/']
      const isLoginRequest = loginUrls.some(url => response.config.url.includes(url))

      if (!isLoginRequest) {
        // 清除无效的token并跳转到欢迎页
        localStorage.removeItem('token')
        localStorage.removeItem('user')
        // 避免重复跳转
        if (router.currentRoute.value.path !== '/' && router.currentRoute.value.path !== '/login') {
          message.warning('登录已过期，请重新登录')
          router.push('/')
        }
      }
      // 返回错误，让调用方知道这是认证失败
      return Promise.reject(new Error('认证失败：收到HTML响应'))
    }

    // 检查401未授权（Token过期）
    if (response.status === 401) {
      console.error('收到401，Token已过期:', response.config.url)
      // #region agent log
      fetch('http://127.0.0.1:7243/ingest/7d01a34a-7181-4a5e-9962-62bb50420571',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'request.js:401interceptor',message:'401 response intercepted',data:{url:response.config.url,currentPath:router.currentRoute?.value?.path},timestamp:Date.now(),sessionId:'debug-session',hypothesisId:'H-C'})}).catch(()=>{});
      // #endregion

      const loginUrls = ['/auth/login', '/auth/login/email', '/auth/register', '/verification/', '/public/']
      const isLoginRequest = loginUrls.some(url => response.config.url.includes(url))
      
      // /auth/me 请求的401不跳转，只静默清除token（用于初始化时检查token有效性）
      const isAuthMeRequest = response.config.url.includes('/auth/me')

      if (!isLoginRequest) {
        localStorage.removeItem('token')
        localStorage.removeItem('user')
        // /auth/me 请求不显示提示也不跳转
        if (!isAuthMeRequest) {
          message.warning('登录已过期，请重新登录')
          router.push('/')
        }
      }
      return Promise.reject(new Error('认证失败：Token已过期'))
    }

    // 检查302重定向
    if (response.status === 302) {
      console.error('收到302重定向，可能是认证失败:', response.config.url)

      const loginUrls = ['/auth/login', '/auth/login/email', '/auth/register', '/verification/', '/public/']
      const isLoginRequest = loginUrls.some(url => response.config.url.includes(url))

      if (!isLoginRequest) {
        localStorage.removeItem('token')
        localStorage.removeItem('user')
        message.warning('登录已过期，请重新登录')
        router.push('/')
      }
      return Promise.reject(new Error('认证失败：302重定向'))
    }

    // 直接返回response，让调用方处理data
    return response
  },
  (error) => {
    if (error.response) {
      const { status, data } = error.response

      // 检查响应数据是否是HTML（302重定向的结果）
      if (data && typeof data === 'string' && data.trim().startsWith('<!DOCTYPE')) {
        console.error('收到HTML响应（可能是302重定向）:', error.config.url)

        // 只有非登录请求才清除token并跳转
        const loginUrls = ['/auth/login', '/auth/login/email', '/auth/register', '/verification/', '/public/']
        const isLoginRequest = loginUrls.some(url => error.config.url.includes(url))

        if (!isLoginRequest) {
          localStorage.removeItem('token')
          localStorage.removeItem('user')
          if (router.currentRoute.value.path !== '/' && router.currentRoute.value.path !== '/login') {
            message.warning('登录已过期，请重新登录')
            router.push('/')
          }
        }
        return Promise.reject(error)
      }

      switch (status) {
        case 401:
        case 302:
          // 只有非登录请求才清除token并跳转
          const loginUrls = ['/auth/login', '/auth/login/email', '/auth/register', '/verification/', '/public/']
          const isLoginRequest = loginUrls.some(url => error.config.url.includes(url))
          
          // /auth/me 请求的401不跳转，只静默清除token
          const isAuthMeRequest = error.config.url.includes('/auth/me')

          if (!isLoginRequest) {
            // 302也可能是认证失败导致的
            localStorage.removeItem('token')
            localStorage.removeItem('user')
            // /auth/me 请求不显示提示也不跳转
            if (!isAuthMeRequest && router.currentRoute.value.path !== '/' && router.currentRoute.value.path !== '/login') {
              message.warning('登录已过期，请重新登录')
              router.push('/')
            }
          }
          break
        case 403:
          // 403可能是权限不足或CORS问题
          // 如果是登录请求的403，不要显示"权限不足"，而是显示具体错误信息
          const loginUrls403 = ['/auth/login', '/auth/login/email', '/auth/register', '/verification/', '/public/']
          const isLoginRequest403 = loginUrls403.some(url => error.config.url.includes(url))

          if (!isLoginRequest403) {
            message.error('权限不足')
          } else {
            // 登录请求的403，显示具体错误或网络问题
            message.error(data?.message || '请求失败，请检查网络连接')
          }
          break
        case 404:
          message.error('请求的资源不存在')
          break
        case 500:
          message.error('服务器内部错误')
          break
        default:
          message.error(data?.message || '请求失败')
      }
    } else if (error.request) {
      message.error('网络错误，请检查网络连接')
    } else {
      message.error('请求配置错误')
    }

    return Promise.reject(error)
  }
)

export default api
