/**
 * uni-app 网络请求封装
 * @author steelwei
 */
import { BASE_URL, CLIENT_ID, PLATFORM_CODE, TENANT_ID } from './config'
import { getToken, clearAuth } from './auth'

/**
 * 通用请求方法
 * @param {Object} options - 请求配置
 * @param {string} options.url - 请求路径（不含 BASE_URL）
 * @param {string} [options.method='GET'] - 请求方法
 * @param {Object} [options.data] - 请求数据
 * @param {Object} [options.header] - 额外请求头
 * @param {boolean} [options.needToken=true] - 是否需要携带 Token
 * @returns {Promise}
 */
export default function request(options = {}) {
  const {
    url,
    method = 'GET',
    data,
    header = {},
    needToken = true
  } = options

  // 构建请求头
  const headers = {
    'Content-Type': 'application/json;charset=utf-8',
    'clientid': CLIENT_ID,
    'X-Platform-Code': PLATFORM_CODE,
    ...header
  }

  // 携带 Token
  if (needToken) {
    const token = getToken()
    if (token) {
      headers['Authorization'] = 'Bearer ' + token
    }
  }

  return new Promise((resolve, reject) => {
    uni.request({
      url: BASE_URL + url,
      method: method.toUpperCase(),
      data,
      header: headers,
      success: (res) => {
        const statusCode = res.statusCode
        const result = res.data

        // HTTP 状态码错误
        if (statusCode === 401) {
          // Token 过期或未登录
          clearAuth()
          uni.showToast({ title: '登录已过期，请重新登录', icon: 'none' })
          setTimeout(() => {
            uni.reLaunch({ url: '/pages/login/login' })
          }, 1500)
          return reject(new Error('未授权'))
        }

        if (statusCode !== 200) {
          const msg = result?.msg || `请求失败(${statusCode})`
          uni.showToast({ title: msg, icon: 'none' })
          return reject(new Error(msg))
        }

        // 业务状态码
        if (result.code !== undefined && result.code !== 200) {
          const msg = result.msg || '操作失败'
          uni.showToast({ title: msg, icon: 'none' })
          return reject(new Error(msg))
        }

        resolve(result)
      },
      fail: (err) => {
        uni.showToast({ title: '网络异常，请稍后重试', icon: 'none' })
        reject(err)
      }
    })
  })
}
