import { message } from 'ant-design-vue'
import { Ref } from 'vue'
import { ResultInfo } from './interface'
/**
 * 获取请求接口时候成功或者失败信息
 * @param map 提示信息数据集合
 * @param type 数据集合 的key
 * @returns [成功信息， 失败信息]
 */
export function getRequestResultInfo(map: Map<number, ResultInfo>, type: number): ResultInfo {
    if (map.has(type)) {
        const result = map.get(type) as ResultInfo
        return result
    } else {
        return ['成功', '失败']
    }
}

/**
 * 请求接口通用信息处理（此方法用于不关心请求结果，只关心成功或者失败状态）
 * @param fn 处理服务接口的函数
 * @param sign 自定义成功和失败的信息
 * @param loading loading状态
 */
export function commonResultInfo(fn: Promise<any>, sign: ResultInfo, loading: Ref<boolean>): Promise<string> {
    return fn.then(() => {
        message.success(sign[0])
        return Promise.resolve(sign[0])
    })
        .catch((err: string) => {
            console.warn(`${fn}调用失败： ${err}`);
            message.error(sign[1] + err)
            return Promise.reject(sign[1] + err)
        }).finally(() => {
            loading.value = false
        })
}

/**
 * 控制 请求接口 打开与关闭loading
 * @param fn 请求接口 函数
 * @param param 请求接口 参数
 * @param loading
 * @returns
 */
export async function controlLoading(fn: Function, loading: Ref<boolean>, param?: any,): Promise<any> {
    console.log('请求接口参数: ', param);
    loading.value = true;
    try {
        const result = await param ? fn(param) : fn()
        loading.value = false;
        return result;
    } catch (err) {
        loading.value = false;
        Promise.resolve(err)
    }
}

/**
 * 控制服务请求成功和失败的弹窗提示
 * @param fn 请求接口 函数
 * @param msgInfo [成功结果， 失败结果]
 * @returns
 */
export function controlResultInfo(fn: Promise<any>, msgInfo: [string, string] = ['成功', '失败']) {
    const [sucInfo, errInfo] = msgInfo
    return fn.then(res => {
        message.success(sucInfo)
        return res;
    }).catch(err => {
        console.warn(`${fn}调用失败： ${err}`);
        const result = errInfo + err
        message.error(result)
        Promise.reject(result)
    })
}

/**
 * 用户查询数据，成功返回数据，失败提示
 * @param fn
 * @returns
 */
export function controlResultErrInfo(fn: Promise<any>) {
    return fn.then(res => {
        let result = res
        if (Array.isArray(res)) {
            // 列表数据需要一个key，要不然会报错，统一处理
            result = res.map((e: any, i: number) => {
                if (e.hasOwnProperty('key')) {
                    return e
                } else {
                    return { ...e, key: String(i) };
                }
            })
        }
        console.log('查询数据成功：', result)
        return result
    }).catch(err => {
        console.error('查询数据失败：', err)
        message.error(err.message)
    })
}

/**
 * 处理服务请求时候的loading和 成功和失败提示
 * @param fn
 * @param param
 * @param loading
 * @param messageInfo
 * @returns
 */
export function requestResultLoadingAndInfo(fn: Function, param: any, loading: Ref<boolean>, messageInfo: [string, string] = ['成功', '失败']) {
    return controlResultInfo(controlLoading(fn, loading, param), messageInfo)
}

/**
 * 查询数据 loading 成功和失败提示
 * @param fn
 * @param loading
 * @param param
 * @returns
 */
export function queryResultLoadingAndInfo(fn: Function, loading: Ref<boolean>, param?: any) {
    return controlResultErrInfo(controlLoading(fn, loading, param))
}

