import Axios from 'axios';
import { Message } from 'iview'

Axios.defaults.baseURL = ''


/**
 * 请求提示消息延迟时间，单位毫秒，默认1500毫秒
 * @type {number}
 */
const DELAY_REQUEST_MESSAGE = 1500;

/**
 * 第二条消息的推迟时间，单位毫秒，默认500毫秒
 * @type {number}
 */
const DELAY_SECOND_MESSAGE = 500;

/**
 * 请求前拦截器，延迟一段时间后弹出加载消息
 * @param config 请求配置
 * @returns {*} 请求配置
 */
function getCookie(userName) {
    if (document.cookie.length > 0) {
        let c_start = document.cookie.indexOf(userName + "=");
        if (c_start != -1) {
            c_start = c_start + userName.length + 1;
            let c_end = document.cookie.indexOf(";", c_start);
            if (c_end == -1) {
                c_end = document.cookie.length;
            }
            return unescape(document.cookie.substring(c_start, c_end));
        }
    }
    return "";
}
const preRequest = (config) => {
    const val = config;
    const token = '4Pt2o4F0_p-iTyUc0aURP57XIYzUgyYIA7wJrm0oC3wFYiagd6t_9B_jn6JPDI7PEb0h-StAJMUjVDdJf9I5eA..'
        // const token = window.sessionStorage.getItem('token');
    if (token) {
        // 获取cookie
        val.headers.authorization = getCookie('token') || token;
        console.log(getCookie('token') || token)
    }
    val.$messageTimer = setTimeout(() => {
        val.$closeLoading = Message.loading('请求处理中，请稍候...');
    }, DELAY_REQUEST_MESSAGE);
    return val;
};


/**
 * 请求错误拦截器，弹出请求错误消息
 * @param err 请求错误
 * @returns {Promise<never>} 请求错误，失败的Promise
 */
const errRequest = (err) => {
    clearTimeout(err.config.$messageTimer);

    const showMessage = () => {
        Message.error({
            content: '请求错误，无法发送请求！',
            closable: true,
        });
        if (typeof err.config.$errorHandler === 'function') {
            err.config.$errorHandler();
        }
    };

    if (err.config.$closeLoading) {
        err.config.$closeLoading();
        setTimeout(showMessage, DELAY_SECOND_MESSAGE);
    } else {
        showMessage();
    }

    return Promise.reject(err);
};


/**
 * 响应处理前拦截器，处理登录超时，弹出处理成功或失败的消息
 * @param res 响应对象
 * @returns {*} 响应对象
 */
const preResponse = (res) => {
    clearTimeout(res.config.$messageTimer);

    const showNotice = () => {
        if (!(res.data.code === '0' || res.data.code === '200')) {
            res.data.message && Message.error(res.data.message);
            throw new Error;
        }
    };

    if (res.config.$closeLoading) {
        res.config.$closeLoading();
        return setTimeout(showNotice, DELAY_SECOND_MESSAGE);
    } else {
        showNotice();
    }

    if (res.data.code === '0' || res.data.code === '200') {
        return res.data;
    }

};


/**
 * 响应失败拦截器，弹出处理失败消息
 * @param err 响应错误对象
 * @returns {Promise<never>} 响应错误，失败的Promise
 */
const errResponse = (err) => {
    clearTimeout(err.config.$messageTimer);

    const showMessage = () => {
        Message.error({
            content: '请求处理失败，请稍后再试！',
            closable: true,
        });
        if (typeof err.config.$errorHandler === 'function') {
            err.config.$errorHandler();
        }
    };

    if (err.config.$closeLoading) {
        err.config.$closeLoading();
        setTimeout(showMessage, DELAY_SECOND_MESSAGE);
    } else {
        showMessage();
    }

    return Promise.reject(err);
};


Axios.interceptors.request.use(preRequest, errRequest);
Axios.interceptors.response.use(preResponse, errResponse);


/**
 * 默认响应成功处理函数，如果响应code不是0则停止后续处理
 * @param res 响应对象
 * @returns {*} 响应对象
 */
Axios.$success = (res) => {
    if (res.data.code !== '0') {
        return new Promise(() => {});
    }
    return res.data;
};

Axios.$serverSuccess = (res) => {
    if (res.data.code !== '0') {
        return Promise.reject(res);
    }
    return res.data;
};

/**
 * 默认响应失败处理函数，向后续步骤传递错误
 * @param err 响应错误对象
 * @returns {Promise<never>} 响应错误，失败的Promise
 */
Axios.$fail = (err) => Promise.reject(err);

/**
 * 获取Axios配置对象
 * @param errorHandler
 */
Axios.$getConfig = (errorHandler) => ({ $errorHandler: errorHandler });
export default Axios