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

/**
 * 缓存请求列表，防止重复请求
 */
const pendingMap = new Map<string, AbortController>()

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

/**
 * 添加请求
 */
export function addPending(config: AxiosRequestConfig, controller: AbortController) {
    const requestId = getRequestId(config)
    removePending(requestId) // 在请求开始前，对之前的请求做检查取消操作
    pendingMap.set(requestId, controller)
}

/**
 * 移除请求
 */
export function removePending(requestId: string) {
    const controller = pendingMap.get(requestId)
    if (controller) {
        controller.abort()
        pendingMap.delete(requestId)
    }
}

/**
 * 清空等待中的请求（在路由跳转时调用）
 */
export function clearPending() {
    pendingMap.forEach((controller) => controller.abort())
    pendingMap.clear()
}