import { authRefreshUsingPost } from '@/service'
import { useUserStore } from '@/store'

// 防重入的刷新Promise
let refreshPromise: Promise<any> | null = null

/**
 * 检查token是否即将过期（过期前1小时）
 */
export function isTokenNearExpiry(): boolean {
  const userStore = useUserStore()

  if (!userStore.tokenExpireTime || !userStore.accessToken) {
    return false
  }

  const now = Date.now()
  const oneHourInMs = 60 * 60 * 1000 // 1小时的毫秒数

  // 如果当前时间 + 1小时 >= 过期时间，则认为即将过期
  return now + oneHourInMs >= userStore.tokenExpireTime
}

/**
 * 刷新token（防重入）
 */
export async function refreshToken(): Promise<void> {
  const userStore = useUserStore()

  // 如果已经有刷新请求在进行，直接返回该Promise
  if (refreshPromise) {
    return refreshPromise
  }

  refreshPromise = (async () => {
    try {
      console.log('🔄 开始刷新token...')

      const refreshData = await authRefreshUsingPost({
        body: { refresh_token: userStore.refreshToken },
      })

      if (refreshData) {
        const { access_token, refresh_token, expire_time } = refreshData

        if (!access_token) {
          throw new Error('刷新token失败：未获取到新的访问令牌')
        }

        // 更新store中的token
        userStore.setToken(access_token, refresh_token, expire_time)

        console.log('✅ token刷新成功')
      }
      else {
        throw new Error('刷新token失败：响应数据为空')
      }
    }
    catch (error) {
      console.error('❌ token刷新失败:', error)
      // 刷新失败，退出登录
      userStore.logOut()
      throw error
    }
  })()

  try {
    await refreshPromise
  }
  finally {
    // 无论成功还是失败，都清空刷新Promise
    refreshPromise = null
  }
}

/**
 * 检查并刷新token（如果需要的话）
 */
export async function checkAndRefreshToken(): Promise<void> {
  if (isTokenNearExpiry()) {
    await refreshToken()
  }
}
