/* eslint-disable no-console */
// 全局请求封装
import loginMethods from './login'

const http = {
  /**
   * 发起HTTP请求
   * @param {Object} params - 请求参数对象，包含url、data、method等
   * @returns {Promise} - 返回一个Promise对象，解析或拒绝根据请求结果
   */
  request: async function (params) {
    // 处理请求数据类型，确保数组和数字被正确序列化为字符串
    if (Object.prototype.toString.call(params.data) === '[object Array]') {
      params.data = JSON.stringify(params.data)
    } else if (Object.prototype.toString.call(params.data) === '[object Number]') {
      params.data = params.data + ''
    }

    // 如果不是登录请求且应用未完全启动（即未完成首次加载），并且不是刷新token的请求，则尝试刷新token
    if (!params.login && !getApp()?.globalData.isLanding && !params.isRefreshing) {
      await loginMethods.refreshToken()
    }

    // 发起请求，并返回Promise对象处理异步操作
    return new Promise((resolve, reject) => {
      uni.request({
        dataType: 'json',
        responseType: params.responseType === undefined ? 'text' : params.responseType,
        header: {
          Authorization: uni.getStorageSync('Token') // 设置请求头中的Authorization字段
        },
        url: (params.domain ? params.domain : import.meta.env.VITE_APP_BASE_API) + params.url, // 拼接完整的请求URL
        data: params.data, // 请求体数据
        method: params.method === undefined ? 'POST' : params.method, // 默认请求方法为POST
        success: (res) => {
          const responseData = res.data

          // 特殊处理小程序码请求
          if (params.responseType === 'arraybuffer' && res.statusCode === 200) {
            return resolve(responseData)
          }

          // 根据响应码处理不同情况
          switch (responseData.code) {
            case '00000': // 请求成功
            case 'A00002': // 系统成功的提示信息
              resolve(responseData)
              break;
            case 'A00004': // 未授权
              // 重设登录后跳转地址，并清除相关存储
              loginMethods.setRouteUrlAfterLogin()
              uni.removeStorageSync('expiresTimeStamp')
              uni.removeStorageSync('loginResult')
              uni.removeStorageSync('Token')

              // 如果允许转向登录页面，则显示模态框提示用户重新登录
              if (!params.dontTrunLogin) {
                uni.showModal({
                  title: '提示',
                  content: uni.getStorageSync('hadLogin') ? '登录已过期，请重新登陆！' : '请先进行登录！',
                  cancelText: '取消',
                  confirmText: '确定',
                  success: res => {
                    if (res.confirm) {
                      uni.navigateTo({
                        url: '/pages/accountLogin/accountLogin'
                      })
                    } else {
                      const router = getCurrentPages()
                      if (router[0].route === 'pages/basket/basket') {
                        uni.switchTab({
                          url: '/pages/index/index'
                        })
                      }
                    }
                  }
                })
              }
              resolve(responseData)
              break;
            case 'A00005': // 服务器错误
              this.onRequestFail(params, responseData)
              uni.showToast({
                title: '服务器出了点小差~',
                icon: 'none'
              })
              break;
            case 'A04001': // 社交账号未绑定
            case 'A00001': // 直接显示提示用户的错误
            case 'A00012': // tempUid错误
            case 'A00006': // 验证码错误
              if (!params.hasCatch) {
                uni.showToast({
                  title: responseData.msg || responseData.data || 'Error',
                  icon: 'none'
                })
              }
              reject(responseData)
              break;
            default:
              if (responseData.code !== '00000') {
                reject(responseData)
              }
          }
        },
        fail: (err) => {
          // 请求失败时显示提示并拒绝Promise
          uni.showToast({
            title: '请求失败'
          })
          reject(err)
        }
      })
    })
  },

  /**
   * 获取购物车商品数量，并更新tabBar徽章
   */
  getCartCount: () => {
    if (!uni.getStorageSync('Token')) {
      util.removeTabBadge() // 如果没有token，移除购物车徽章
      return
    }
    http.request({
      url: '/p/shopCart/prodCount',
      method: 'GET',
      dontTrunLogin: true, // 不需要转向登录
      data: {}
    })
      .then(({ data }) => {
        if (data > 0) {
          uni.setTabBarBadge({
            index: 2, // 假设购物车位于第三个tab
            text: data + '' // 显示商品数量
          })
          getApp().globalData.totalCartCount = data // 更新全局购物车数量
        } else {
          uni.removeTabBarBadge({
            index: 2 // 移除购物车徽章
          })
          getApp().globalData.totalCartCount = 0
        }
      })
  },

  /**
   * 请求失败时的日志记录
   * @param {Object} params - 请求参数
   * @param {Object} responseData - 响应数据
   */
  onRequestFail: (params, responseData) => {
    console.error('============== 请求异常 ==============')
    console.log('接口地址: ', params.url)
    console.log('异常信息: ', responseData)
    console.error('============== 请求异常 end ==========')
  },

  /**
   * 登录成功后的处理逻辑
   * @param {Object} result - 登录成功返回的数据
   * @param {Function} fn - 登录成功后的回调函数
   */
  loginSuccess: (result, fn) => {
    // 保存登录信息到本地存储
    wx.setStorageSync('loginResult', result)
    // 保存成功登录标识，用于判断token是否过期
    wx.setStorageSync('hadLogin', true)
    const expiresTimeStamp = result.expiresIn * 1000 / 2 + new Date().getTime() // 计算token过期时间
    // 缓存token的过期时间
    uni.setStorageSync('expiresTimeStamp', expiresTimeStamp)

    // 将accessToken保存到本地存储，以便后续请求使用
    wx.setStorageSync('Token', result.accessToken)
    // 执行登录成功后的回调函数
    if (fn) {
      fn()
    }
  }
}

export default http
