import axios from 'axios'
import { ElMessage } from 'element-plus'
import { useUserStore } from '../store/user.js'

// 创建axios实例
const api = axios.create({
  baseURL: '/user', // 直接使用后端服务地址
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json'
  },
  // 【关键配置】阻止浏览器弹出原生认证对话框
  withCredentials: false, // 不发送cookies，防止触发基本认证
  // 确保不使用HTTP基本认证
  auth: undefined
})

// 请求拦截器
api.interceptors.request.use(
  config => {
    // 从user-store或临时存储获取token
    try {
      let token = null
      
      // 首先尝试从localStorage获取token
      const userStoreData = localStorage.getItem('user-store')
      if (userStoreData) {
        const userStore = JSON.parse(userStoreData)
        token = userStore.token
      }
      
      // 如果localStorage没有token，尝试从sessionStorage获取临时token（用于绑定手机号场景）
      if (!token) {
        token = sessionStorage.getItem('tempAuthToken')
        if (token) {
          console.log('使用临时token进行API请求')
        }
      }
      
      if (token) {
        config.headers.Authorization = `Bearer ${token}`
        console.log('请求携带token:', token.substring(0, 20) + '...')
      }
      
      // 【防护措施】确保不会意外设置基本认证
      delete config.auth
      delete config.headers['WWW-Authenticate']
    } catch (error) {
      console.error('获取token失败:', error)
    }
    try {
      // 简要打印请求日志（方法、URL）以便定位异常来源
      const method = (config.method || 'get').toUpperCase()
      const url = `${config.baseURL || ''}${config.url || ''}`
      console.debug('[API REQUEST]', method, url)
    } catch (debugError) {
      console.error('请求日志打印失败:', debugError)
    }
    return config
  },
  error => {
    return Promise.reject(new Error(error.message || '请求失败'))
  }
)

// 响应拦截器
api.interceptors.response.use(
  response => {
    return response.data
  },
  error => {
    try {
      const status = error?.response?.status
      const url = `${error?.config?.baseURL || ''}${error?.config?.url || ''}`
      const data = error?.response?.data
      console.error('[API ERROR]', status, url, data || error?.message || error)
    } catch (logError) {
      console.error('API请求错误日志打印失败:', logError)
      console.error('原始API请求错误:', error)
    }

    // 处理认证相关错误
    if (error.response) {
      const { status } = error.response
      const reqUrl = error.config?.url || ''
      
      // 处理401未授权错误和403禁止访问错误
      if (status === 401 || status === 403) {
        console.error(`检测到${status}认证错误:`, reqUrl)
        
        // 清除全局状态并显示登录弹窗
        handleAuthErrorWithModal(status)
        
        // 【关键修复】返回一个自定义错误而不是原始错误
        // 这样可以阻止浏览器显示原生认证对话框
        const authError = new Error(status === 401 ? '认证已过期，请重新登录' : '无权限访问，请重新登录')
        authError.status = status
        authError.isAuthError = true
        authError.response = error.response
        authError.config = error.config
        return Promise.reject(authError)
      }
    }

    // 普通业务错误：优先使用后端返回的 message/msg，其次才是 Axios 的 error.message
    const backendMessage = error.response?.data?.message || error.response?.data?.msg
    const errorMessage = backendMessage || error.message || 'API请求失败'

    // 保留原始 error 对象上的 response / config，只覆盖 message 方便业务端使用
    error.message = errorMessage
    return Promise.reject(error)
  }
)

// 防止重复触发的标记（使用时间戳来防抖）
let lastAuthErrorTime = 0
const AUTH_ERROR_DEBOUNCE = 1000 // 1秒内只处理一次认证错误

// 统一处理认证错误的函数（使用登录弹窗）
const handleAuthErrorWithModal = (status) => {
  try {
    // 防抖处理：如果1秒内已经处理过认证错误，跳过
    const now = Date.now()
    if (now - lastAuthErrorTime < AUTH_ERROR_DEBOUNCE) {
      console.log(`[AUTH ERROR] 跳过重复的${status}认证错误处理（防抖）`)
      return
    }
    lastAuthErrorTime = now
    
    console.log(`[AUTH ERROR] 开始处理${status}认证错误，清空用户数据并显示登录弹窗`)
    
    // 清除用户数据
    try {
      // 直接操作 localStorage 清除用户数据
      localStorage.removeItem('user-store')
      
      // 清空其他可能存在的用户相关数据
      const keysToRemove = []
      for (let i = 0; i < localStorage.length; i++) {
        const key = localStorage.key(i)
        if (key && (key.includes('user') || key.includes('token') || key.includes('auth') || key.includes('temp'))) {
          keysToRemove.push(key)
        }
      }
      keysToRemove.forEach(key => {
        console.log('[AUTH ERROR] 清除localStorage key:', key)
        localStorage.removeItem(key)
      })
      
      // 清空sessionStorage
      sessionStorage.clear()
      console.log('[AUTH ERROR] 用户数据清空完成')
    } catch (storageError) {
      console.error('[AUTH ERROR] 清除存储数据失败:', storageError)
    }
    
    // 清除可能存在的定时器
    if (globalThis.userRefreshTimer !== undefined) {
      clearInterval(globalThis.userRefreshTimer)
      delete globalThis.userRefreshTimer
    }
    
    // 尝试通过 Pinia store 清除状态和显示登录弹窗
    try {
      const userStore = useUserStore()
      // 重置 store 状态（因为localStorage已清除，这里主要是更新响应式状态）
      userStore.userInfo = null
      userStore.token = null
      userStore.isLoggedIn = false
      
      console.log('[AUTH ERROR] Pinia store 状态已重置')
      
      // 显示提示信息
      const message = status === 401 ? '登录已过期，请重新登录' : '无权限访问，请重新登录'
      ElMessage({
        type: 'warning',
        message,
        duration: 2000,
        showClose: true
      })
      
      // 延迟显示登录弹窗，确保提示信息能被看到
      setTimeout(() => {
        console.log('[AUTH ERROR] 显示登录弹窗')
        userStore.setShowLoginModal(true)
        console.log('[AUTH ERROR] 登录弹窗状态已设置为 true')
      }, 500)
      
    } catch (storeError) {
      console.error('[AUTH ERROR] Pinia store 操作失败，使用备用方案:', storeError)
      
      // 备用方案：直接显示提示并通过自定义事件触发
      const message = status === 401 ? '登录已过期，请重新登录' : '无权限访问，请重新登录'
      ElMessage({
        type: 'warning',
        message,
        duration: 2000,
        showClose: true
      })
      
      // 发送自定义事件通知应用显示登录弹窗
      setTimeout(() => {
        const event = new CustomEvent('show-login-modal', { 
          detail: { reason: 'auth-error', status } 
        })
        globalThis.window?.dispatchEvent(event)
        console.log('[AUTH ERROR] 已发送自定义事件 show-login-modal')
      }, 500)
    }
    
  } catch (error) {
    console.error('[AUTH ERROR] 处理认证错误时发生异常:', error)
    console.error('[AUTH ERROR] 错误堆栈:', error.stack)
    
    // 最终兜底方案：至少清除数据并显示错误提示
    try {
      localStorage.removeItem('user-store')
      sessionStorage.clear()
    } catch (e) {
      // 忽略
    }
    
    ElMessage.error('认证失败，请刷新页面后重新登录')
  }
}

// 统一导出所有API模块
export * from './auth.js'
export * from './course.js'
export * from './workflow.js'
export * from './user.js'
export * from './promotion.js'
export * from './withdraw.js'
export * from './message.js'
export * from './files.js'
export * from './order.js'
export * from './progress.js'
export * from './review.js'
export * from './content.js'
export * from './banner.js'
export * from './package.js'
export * from './ai.js'
export * from './plaza.js'

export default api 