import axios, { AxiosRequestConfig } from 'axios'
import qs from 'qs'

/**
 * 缓存请求列表，防止重复请求
 */
const pending = new Map()

const getRequestKey = (config: AxiosRequestConfig) => {
    return [
        config.method,
        config.url,
        qs.stringify(config.params),
        qs.stringify(config.data),
    ].join('&')
}

/**
 * 添加请求
 */
export function addPending(config: AxiosRequestConfig) {
    removePending(config) //在请求开始前，对之前的请求做检查取消操作
    const key = getRequestKey(config)
    config.cancelToken =
        config.cancelToken ||
        new axios.CancelToken((cancel) => {
            if (!pending.has(key)) {
                //如果列表中不存在当前请求，则添加进去
                pending.set(key, cancel)
            }
        })
}

/**
 * 移除请求
 */
export function removePending(config: AxiosRequestConfig) {
    const key = getRequestKey(config)
    if (pending.has(key)) {
        //如果在列表中存在当前请求，需要取消当前请求，并且移除
        const cancel = pending.get(key)
        cancel(key)
        pending.delete(key)
    }
}

/**
 * 清空等待中的请求（在路由跳转时调用）
 */
export function clearPending() {
    for (const [key, cancel] of pending) {
        cancel(key)
    }
    pending.clear()
}