import type { AxiosRequestConfig,Canceler } from 'axios'

// 用于存储每个请求的标识和取消函数
let pendingMap = new Map<string, Canceler>()

import { isFunction } from 'lodash-es';

const getPendingUrl = (config: AxiosRequestConfig): string => {
  return [config.method, config.url].join('&')
}

export class AxiosCanceler {
  // 添加请求
  public addPending(config: AxiosRequestConfig) {
    this.removePending(config)
    const url = getPendingUrl(config)
    // @ts-ignore
    config.cancelToken = config.cancelToken || new axios.CancelToken(cancel => {
      if (!pendingMap.has(url)) {
        // 如果 pending 中不存在当前请求，则添加进去
        pendingMap.set(url, cancel)
      }
    })
  }
  //取消全部请求
  public removeAllPending() {
    pendingMap.forEach(cancel => {
      cancel && isFunction(cancel) && cancel()
    })
  }

  public removePending(config: AxiosRequestConfig) {
    const url = getPendingUrl(config)
    if (pendingMap.has(url)) {
      // 如果在 pending 中存在当前请求标识，需要取消当前请求，并且移除
      const cancel = pendingMap.get(url)
      cancel && cancel()
      pendingMap.delete(url)
    }
  }

  reset(): void {
    pendingMap = new Map<string, Canceler>()
  }



}