import { CombineService, Mutate } from '@ahooksjs/use-request/lib/types'
import e from '@umijs/deps/compiled/express'
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,//格式化请求结果
    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,// 开启返回原数据，不开启默认返回res.data
 * @param  initialData?: any,//默认的 data
 * @param  msgNmae?: string,//操作完成提示文字
 * 
 */
export interface FnAjax<T> {
    loading: boolean,
    data: T,
    run: (...args: any) => Promise<any>,
    refresh: () => Promise<any>,
    mutate: Mutate<any>
}
export function useAjax(fnc: CombineService<any, any>, options?: Options) {
    const ajax = useRequest(fnc, {
        manual: options?.manual || true,
        cacheKey: options?.cacheKey,
        pollingInterval: options?.pollingInterval || undefined,
        debounceInterval: options?.debounceInterval || 0,
        throttleInterval: options?.throttleInterval || 0,
        formatResult: (res) => {
            let reqTime = moment().format('YYYY-MM-DD HH:mm:ss')
            res['reqTime'] = reqTime
            if (res.data || res.data === null || res.data === undefined) {
                return options?.formatResult ? { ...res, reqTime } : res.data
            } else {
                console.log('res===>', res)
                return res
            }
        },
        onSuccess: (res) => {
            if (res) {
                options?.msgNmae && message.success(options?.msgNmae + '成功！', 2)
            }
            return null
        },
        onError: (err) => {
        }
    })
    return ajax
}