<script setup>
import { onLaunch } from '@dcloudio/uni-app'
import { wxminiLogin } from '@/api/user'
import { useUserStore } from '@/stores/userStore'
import { useAgentStore } from '@/stores/agentStore'
import useApiFetch from '@/composables/useApiFetch'

const userStore = useUserStore()
const agentStore = useAgentStore()

// 防止重复登录的标志
let isLoggingIn = false
let loginRetryCount = 0
const MAX_LOGIN_RETRY = 3

onLaunch(() => {
  login()
  refreshTokenIfNeeded()
  getUser()
  getAgentInformation()
})

// 微信登录
const login = () => {
  const token = uni.getStorageSync('token')
  if (token) {
    return
  }
  
  // 如果正在登录中，直接返回
  if (isLoggingIn) {
    console.warn('登录正在进行中，跳过重复调用')
    return
  }
  
  // 内部函数：执行登录逻辑
  const doLogin = () => {
    // 检查重试次数
    if (loginRetryCount >= MAX_LOGIN_RETRY) {
      console.error('登录重试次数已达上限，停止重试')
      isLoggingIn = false
      loginRetryCount = 0
      return
    }
    
    isLoggingIn = true
    loginRetryCount++
    
    uni.login({
      provider: 'weixin',
      success: (res) => {
        const code = res.code
        if (!code) {
          console.error('获取微信登录code为空')
          isLoggingIn = false
          return
        }
        
        console.log(`[登录] 获取code成功，第${loginRetryCount}次尝试`)
        
        wxminiLogin({ code }).then((result) => {
          if (result.data.value?.code === 200) {
            const data = result.data.value.data
            uni.setStorageSync('token', data.accessToken)
            uni.setStorageSync('refreshAfter', data.refreshAfter)
            uni.setStorageSync('accessExpire', data.accessExpire)
            console.log('[登录] 登录成功')
            isLoggingIn = false
            loginRetryCount = 0
            getUser()
            getAgentInformation()
          } else {
            // 检查是否是 code 无效错误
            const errorMsg = result.data.value?.msg || ''
            console.error(`[登录] 登录失败:`, result.data.value)
            
            if (errorMsg.includes('授权码无效') || errorMsg.includes('已过期') || errorMsg.includes('invalid code')) {
              console.warn(`[登录] 微信code无效，准备重试 (${loginRetryCount}/${MAX_LOGIN_RETRY}):`, errorMsg)
              isLoggingIn = false
              // 延迟后重试（避免频繁请求，code 无效时需要重新获取）
              setTimeout(() => {
                doLogin()
              }, 2000) // 增加延迟时间，确保获取新的 code
            } else {
              // 其他错误，不重试
              console.error('[登录] 登录失败，不再重试:', errorMsg)
              isLoggingIn = false
              loginRetryCount = 0
            }
          }
        }).catch((err) => {
          console.error('[登录] 登录请求异常:', err)
          isLoggingIn = false
          // 网络错误可以重试
          if (err?.errMsg?.includes('network') || err?.errMsg?.includes('timeout')) {
            setTimeout(() => {
              doLogin()
            }, 3000)
          } else {
            loginRetryCount = 0
          }
        })
      },
      fail: (err) => {
        console.error('[登录] 获取微信登录code失败:', err)
        isLoggingIn = false
        // 如果是用户取消，不重试；其他错误可以重试
        if (!err.errMsg?.includes('cancel')) {
          setTimeout(() => {
            doLogin()
          }, 2000)
        } else {
          loginRetryCount = 0
        }
      }
    })
  }
  
  // 开始登录
  doLogin()
}

// 刷新 token
const refreshTokenIfNeeded = async () => {
  const token = uni.getStorageSync('token')
  const refreshAfter = uni.getStorageSync('refreshAfter')
  const accessExpire = uni.getStorageSync('accessExpire')
  const currentTime = new Date().getTime()

  // 如果 token 已过期，直接返回
  if (accessExpire) {
    const accessExpireInMilliseconds = parseInt(accessExpire) * 1000 // 转换为毫秒级
    if (currentTime > accessExpireInMilliseconds) {
      return
    }
  }

  // 如果没有 token，直接返回
  if (!token) {
    return
  }

  // 如果有 refreshAfter，检查当前时间是否超过 refreshAfter
  if (refreshAfter) {
    const refreshAfterInMilliseconds = parseInt(refreshAfter) * 1000 // 转换为毫秒级
    if (currentTime < refreshAfterInMilliseconds) {
      return
    }
  }

  // 如果没有 refreshAfter 或者时间超过 refreshAfter，执行刷新 token 的请求
  try {
    const { data } = await useApiFetch('/user/getToken').post().json()
    if (data.value?.code === 200) {
      uni.setStorageSync('token', data.value.data.accessToken)
      uni.setStorageSync('refreshAfter', data.value.data.refreshAfter)
      uni.setStorageSync('accessExpire', data.value.data.accessExpire)
    }
  } catch (error) {
    console.error('刷新token失败', error)
  }
}

// 获取代理信息
const getAgentInformation = async () => {
  const token = uni.getStorageSync('token')
  if (!token) {
    return
  }

  try {
    await agentStore.fetchAgentStatus()
  } catch (error) {
    console.error('获取代理信息失败', error)
  }
}

// 获取用户信息
const getUser = async () => {
  const token = uni.getStorageSync('token')
  if (!token) {
    return
  }
  try {
    await userStore.fetchUserInfo()
  } catch (error) {
    console.error('获取用户信息失败', error)
  }
}
</script>

<style></style>
