const loginMethods = {
  /**
   * 刷新token
   * 当用户的Token即将过期时，自动发起请求以获取新的Token。
   * 这个过程会检查当前Token是否有效以及是否正在进行刷新操作，以避免重复请求。
   */
  refreshToken: () => {
    // 从本地存储中获取Token的过期时间戳
    const expiresTimeStamp = uni.getStorageSync('expiresTimeStamp')

    // 如果没有有效的Token或过期时间戳，则直接返回，不进行刷新
    if (!uni.getStorageSync('Token') || !expiresTimeStamp) return

    // 检查Token是否已经过期
    const isExpires = expiresTimeStamp < new Date().getTime()

    // 检查是否已经有刷新Token的操作正在进行
    const isRefreshing = uni.getStorageSync('isRefreshingToken')

    // 如果Token未过期或已有刷新操作正在进行，则直接返回
    if (!isExpires || isRefreshing) {
      return
    }

    // 设置标志位，表示正在刷新Token，防止并发刷新
    uni.setStorageSync('isRefreshingToken', true)

    // 发起刷新Token的请求
    http.request({
      url: '/token/refresh', // 刷新Token的API接口
      method: 'POST', // 使用POST方法发送请求
      login: true, // 标记这是一个与登录相关的请求
      isRefreshing: true, // 标记这是刷新Token的请求
      dontTrunLogin: true // 即使刷新失败也不跳转到登录页面
    }).then(res => {
      // 刷新成功后，更新本地存储中的Token过期时间
      uni.setStorageSync('isRefreshingToken', false)
      uni.setStorageSync('expiresTimeStamp', res.data * 1000 / 2 + new Date().getTime())
    }).catch(() => {
      // 刷新失败后，重置标志位
      uni.setStorageSync('isRefreshingToken', false)
    })
  },

  /**
   * 设置登录后的跳转地址
   * 在用户登录之前，记录当前页面的路径，以便在登录成功后能够返回到该页面。
   */
  setRouteUrlAfterLogin: () => {
    // 获取当前所有页面的栈
    const pages = getCurrentPages()

    // 确保当前页面不是登录页面（避免循环跳转）
    if (pages[pages.length - 1].route.indexOf('user-login') === -1) {
      // 记录当前页面的完整路径，用于登录成功后的跳转
      uni.setStorageSync('routeUrlAfterLogin', pages[pages.length - 1].$page.fullPath)
    }
  }
}

export default loginMethods
