// 这里书写防抖，节流
import request from "@/api/request";

// 全局管理的存储状态
const requestControlMap = new Map()
const MAX_MAP_SIZE = 1000  // 防止内存轻易泄露

// 请求标识生成器（更稳健的版本）
const generateApiKey = (config) => {
  const { method, url, header, debounce, throttle } = config
  return `DEBOUNCE_AND_THROTTLE:${method}:${url}:${JSON.stringify(header)}:${debounce}:${throttle}`;
}

export default function http (config) {
  const apiKey = generateApiKey(config)

  // 空间保护
  if (requestControlMap.size > MAX_MAP_SIZE) {
    requestControlMap.clear() // 清空缓存
    // 类型保护
  }else if (config.debounce > 0 && config.throttle > 0) {
    throw new Error('请勿同时使用防抖和节流！')
  }

  // 如果有防抖的需求
  if (config.debounce > 0  ){
    clearTimeout(requestControlMap.get(apiKey)?.timer)

    return new Promise((resolve, reject) => {
      requestControlMap.set(apiKey, {
        timer: setTimeout(() => {
          // 防抖时间到了，清除缓存并发起请求
          requestControlMap.delete(apiKey)
          request(config).then(resolve).catch(reject)
        }, config.debounce),
        timeStamp: Date.now()
      })
    })
  }

  // 如果需要节流
  if (config.throttle > 0){
    const record = requestControlMap.get(apiKey)
    if (record && Date.now() - record.lastTime < config.throttle) {
      // 节流时间未到，不发起请求
      return Promise.reject(new Error('请求过于频繁'))
    }
    requestControlMap.set(apiKey, {
      lastTime: Date.now(),
      timeStamp: Date.now()
    })
  }

  // 正常发起请求
  return request(config)
}