// 工具函数集合

/**
 * 显示加载提示
 * @param {string} title - 提示文字
 */
export const showLoading = (title = '加载中') => {
  uni.showLoading({
    title,
    mask: true
  })
}

/**
 * 隐藏加载提示
 */
export const hideLoading = () => {
  uni.hideLoading()
}

/**
 * 显示Toast提示
 * @param {string} title - 提示文字
 * @param {string} icon - 图标类型 success | error | loading | none
 * @param {number} duration - 显示时长
 */
export const showToast = (title, icon = 'none', duration = 2000) => {
  uni.showToast({
    title,
    icon,
    duration
  })
}

/**
 * 缓存工具类
 */
export const storage = {
  /**
   * 设置缓存
   * @param {string} key - 缓存键
   * @param {any} value - 缓存值
   */
  set(key, value) {
    if (typeof value === 'object') {
      value = JSON.stringify(value)
    }
    uni.setStorageSync(key, value)
  },

  /**
   * 获取缓存
   * @param {string} key - 缓存键
   * @returns {any} 缓存值
   */
  get(key) {
    const value = uni.getStorageSync(key)
    try {
      return JSON.parse(value)
    } catch (e) {
      return value
    }
  },

  /**
   * 删除缓存
   * @param {string} key - 缓存键
   */
  remove(key) {
    uni.removeStorageSync(key)
  },

  /**
   * 清空缓存
   */
  clear() {
    uni.clearStorageSync()
  }
}

/**
 * 时间格式化
 * @param {number|string} time - 时间戳或日期字符串
 * @param {string} format - 格式化模板
 * @returns {string} 格式化后的时间字符串
 */
export const formatTime = (time, format = 'YYYY-MM-DD HH:mm:ss') => {
  const date = new Date(time)
  const year = date.getFullYear()
  const month = String(date.getMonth() + 1).padStart(2, '0')
  const day = String(date.getDate()).padStart(2, '0')
  const hour = String(date.getHours()).padStart(2, '0')
  const minute = String(date.getMinutes()).padStart(2, '0')
  const second = String(date.getSeconds()).padStart(2, '0')

  return format
    .replace('YYYY', year)
    .replace('MM', month)
    .replace('DD', day)
    .replace('HH', hour)
    .replace('mm', minute)
    .replace('ss', second)
}

/**
 * 金额格式化（支持元或分，保留两位小数）
 * @param {number|string} amount - 金额（元或分）
 * @param {boolean} isCent - 是否为分单位（默认为true，因为项目中金额单位均为分）
 * @returns {string} 格式化后的金额（元）
 */
export const formatAmount = (amount, isCent = true) => {
  if (amount === null || amount === undefined || isNaN(amount)) {
    return '0.00'
  }

  // 将金额转换为数字
  const numAmount = parseFloat(amount)

  // 根据单位转换为元
  const yuan = isCent ? numAmount / 100 : numAmount

  // 保留两位小数
  return yuan.toFixed(2)
}

/**
 * 获取请求头
 * @returns {Object} 请求头
 */
export const getHeaders = () => {
  const token = storage.get('token')
  const headers = {
    'Content-Type': 'application/json'
  }

  if (token) {
    headers['accessToken'] = token
  }

  return headers
}

/**
 * 网络请求工具
 * @param {Object} config - 请求配置
 * @returns {Promise} 请求结果
 */
export const request = (config) => {
  const {
    url,
    method = 'GET',
    data = {},
    showLoad = true
  } = config

  if (showLoad) {
    showLoading()
  }

  // 根据admin-web配置，基础API地址为后台服务地址
  // 请根据实际部署情况修改此地址
  const baseApi = 'https://dev-wash-cloud.kuaiyuman.cn/admin' // admin-web的后台服务地址

  const fullUrl = `${baseApi}${url}`
  console.log(`发起${method}请求:`, fullUrl)

  // 对于GET请求，如果data不为空，将其作为查询参数
  const requestConfig = {
    url: fullUrl,
    method,
    header: getHeaders()
  }

  // GET请求使用查询参数，POST/PUT/DELETE使用请求体
  if (method === 'GET' && Object.keys(data).length > 0) {
    requestConfig.data = data
  } else if (method !== 'GET') {
    requestConfig.data = data
  }

  return new Promise((resolve, reject) => {
    uni.request({
      ...requestConfig,
      success: (res) => {
        if (showLoad) {
          hideLoading()
        }

        const { statusCode, data } = res
        console.log(`请求响应 [${statusCode}]:`, fullUrl, data)

        if (statusCode === 200) {
          // 登录成功后保存token
          if (url === '/admin-user/login' && data.code === 200) {
            storage.set('token', data.data.accessToken)
          }

          if (data.code === 200) {
            resolve(data)
          } else {
            showToast(data.msg || '请求失败')
            reject(data)
          }
        } else if (statusCode === 401) {
          showToast('登录已过期，请重新登录')
          storage.remove('token')
          uni.navigateTo({
            url: '/pages/login/login'
          })
          reject(data)
        } else {
          showToast(`请求失败(${statusCode})`)
          reject(data)
        }
      },
      fail: (err) => {
        if (showLoad) {
          hideLoading()
        }
        console.error('网络请求失败:', fullUrl, err)
        showToast('网络请求失败，请检查网络连接')
        reject(err)
      }
    })
  })
}

/**
 * GET请求
 * @param {string} url - 请求地址
 * @param {Object} data - 请求参数
 * @param {boolean} showLoad - 是否显示加载提示
 * @returns {Promise} 请求结果
 */
export const get = (url, data = {}, showLoad = true) => {
  return request({
    url,
    method: 'GET',
    data,
    showLoad
  })
}

/**
 * POST请求
 * @param {string} url - 请求地址
 * @param {Object} data - 请求参数
 * @param {boolean} showLoad - 是否显示加载提示
 * @returns {Promise} 请求结果
 */
export const post = (url, data = {}, showLoad = true) => {
  return request({
    url,
    method: 'POST',
    data,
    showLoad
  })
}
