import { message } from 'antd'
import moment from 'moment'
import { useRequest } from 'umi'

interface Options {
    manual?: boolean,//手动模式true开启
    pollingInterval?: number,//轮询间隔，单位为毫秒。设置后，将进入轮询模式，定时触发 run
    pollingWhenHidden?: boolean,//在页面隐藏时，是否继续轮询。默认为 true，即不会停止轮询
    debounceInterval?: number,//防抖间隔, 单位为毫秒，设置后，请求进入防抖模式。
    throttleInterval?: number,//节流间隔, 单位为毫秒，设置后，请求进入节流模式。
    cacheKey?: string,//请求唯一标识。如果设置了 cacheKey启用缓存机制
    onSuccess?: (data: any, params: any[]) => void,//service resolve 时触发，参数为 data 和 params
    onError?: (error: Error, params: any[]) => void,//service 报错时触发，参数为 error 和 params。
    formatResult?: boolean,//格式化请求结果
    isExcelData?:boolean,//是否是excel数据，返回原始内容
    initialData?: any,//默认的 data
    msgNmae?: string,
}
/**
 * 
 * @param fnc 
 * @param options:Options 
 * @param  manual?: boolean,//手动模式true开启
 * @param  pollingInterval?: number,//轮询间隔，单位为毫秒。设置后，将进入轮询模式，定时触发 run
 * @param  pollingWhenHidden?: boolean,//在页面隐藏时，是否继续轮询。默认为 true，即不会停止轮询
 * @param  debounceInterval?: number,//防抖间隔, 单位为毫秒，设置后，请求进入防抖模式。开启后then获取不到res
 * @param  throttleInterval?: number,//节流间隔, 单位为毫秒，设置后，请求进入节流模式。开启后then获取不到res
 * @param  cacheKey?: string,//请求唯一标识。如果设置了 cacheKey启用缓存机制
 * @param  onSuccess?: (data: any, params: any[]) => void,//service resolve 时触发，参数为 data 和 params
 * @param  onError?: (error: Error, params: any[]) => void,//service 报错时触发，参数为 error 和 params。
 * @param  formatResult?: boolean,//格式化请求结果
 * @param  initialData?: any,//默认的 data
 * @param  msgNmae?: string,//操作完成提示文字
 * 
 */
export function useAjax(fnc: (params?: any) => Promise<any>, options?: Options) {
    const ajax = useRequest(fnc, {
        manual: options?.manual || true,
        cacheKey: options?.cacheKey,
        pollingInterval: options?.pollingInterval || undefined,
        debounceInterval: options?.debounceInterval || undefined,
        // throttleInterval:500,
        formatResult: (res) => {
            let reqTime = moment().format('YYYY-MM-DD HH:mm:ss')
            if(options?.isExcelData){
                return res
            }else{
                return options?.formatResult ? {...res,reqTime} : res?.data
            }
        },
        onSuccess: (res) => {
            if (res) {
                options?.msgNmae && message.success(options?.msgNmae + '成功！', 2)
            }
            return null
        },
        onError: () => {
        }
    })
    return ajax
}