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
 * @param messageInfo
 * @returns
 */
export async function requestResultLoadingAndInfo(fn: any, param: any, loading: Ref<boolean>, messageInfo: [string, string] = ['成功', '失败'], isDefaultMsg = false) {
    console.log('Proto请求参数: ', param);
    const [sucInfo, errInfo] = messageInfo
    loading.value = true;
    return new Promise((resolve, reject) => {
        const tempFN = param ? fn(param) : fn()
        tempFN.then((res: any) => {
            // 处理同一个请求，根据不同场景提现不同消息
            const msg = isDefaultMsg ? res : sucInfo
            message.success(msg)
            loading.value = false;
            resolve(res);
        }).catch((err: string) => {
            loading.value = false;
            const msg = '您的申请已提交，请稍后查询结果！'
            if (err === msg) {
                message.success(msg)
                resolve('ok');
            } else {
                //console.warn(`${fn}调用失败： ${err}`);
                const temp = errInfo + err
                message.error(temp)
                reject(temp)
            }
        })
    })
}

/**
 * 查询数据 loading 成功和失败提示
 * @param fn
 * @param loading
 * @param param
 * @returns
 */
export async function queryResultLoadingAndInfo(fn: Function, loading: Ref<boolean>, param?: any): Promise<any[]> {
    loading.value = true;
    return new Promise((resolve, reject) => {
        const tempFN = param ? fn(param) : fn()
        tempFN.then((res: any) => {
            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) };
                    }
                })
            }
            loading.value = false;
            resolve(result as any[]);
        }).catch((err: Error | string) => {
            loading.value = false;
            console.error('查询数据失败：', err)
            if (err instanceof Error) {
                message.error(err.message);
            } else {
                message.error(err);
            }
            reject(err)
        })
    })
}