import Axios from 'axios';
import { ElMessage, ElMessageBox } from 'element-plus';

// import { useUserStore } from "~/store/user";
// const userStore=useUserStore();
export let isRelogin = { show: false };
// @ts-ignore
Axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'; //设置前后端请求文档的类型

// 开发环境使用 /api 前缀，让 vite proxy 代理生效
// 生产环境使用环境变量配置的域名
const baseURL: any = import.meta.env.VITE_API_DOMAIN || '/api'; //设置统一接口地址前缀

const axios = Axios.create({
    // axios中请求配置有baseURL选项，表示请求URL公共部分
    baseURL,
    timeout: 120000,
});

// 前置拦截器（发起请求之前的拦截）
axios.interceptors.request.use(
    (config) => {
        let userStore = localStorage.getItem('userStore');
        let token = '';
        if (userStore) {
            const us = JSON.parse(userStore);
            token = us.token;
        }
        if (token) {
            // @ts-ignore
            config.headers.Authorization = token;
        }
        return config;
    },
    (error) => {
        return Promise.reject(error);
    },
);

// 后置拦截器（获取到响应时的拦截）
axios.interceptors.response.use(
    (response) => {
        //后端没报错
        /**
         * 根据你的项目实际情况来对 response 和 error 做处理
         * 这里对 response 和 error 不做任何处理，直接返回
         */
        const responseData = response.data;



        // 单独判断导出问题-start
        if(toString.call(responseData) === '[object Blob]' && (responseData.type !== 'application/json')) {
            download(response);
            ElMessage({
                type: 'success',
                message: '导出成功！',
            });
            return Promise.resolve(response.data); // 返回 Promise，避免返回对象
        }else if(toString.call(responseData) === '[object Blob]' && (responseData.type == 'application/json')){
            setTimeout(() => {
                window.location.href = '/login';
            }, 1000);
            ElMessage.error(`登录过期，请重新登录!`);
            return Promise.reject('登录过期，请重新登录!'); // 返回 Promise.reject，避免返回对象
        }
        // 单独判断导出问题-end

        if (responseData && (responseData.code == 200 || responseData.status == 0)) {
            return Promise.resolve(response.data); //成功==》可以执行then方法
            
        }else if(responseData.code === 401){
            setTimeout(() => {
                window.location.href = '/login';
            }, 1000);
            ElMessage.error(`登录过期，请重新登录!`);
            return Promise.reject('登录过期，请重新登录!'); // 返回 Promise.reject，避免返回对象
        }
        // console.log(responseData);
        // if (responseData && (responseData.code === 650)) {
        //     ElMessageBox.confirm('登录状态已过期，您可以继续留在该页面，或者重新登录', '系统提示', {
        //         confirmButtonText: '重新登录',
        //         cancelButtonText: '取消',
        //         type: 'warning',
        //     })
        //         .then(() => {
        //             window.location.href = '/login';
        //         })
        //         .catch(() => {});
        //     // eslint-disable-next-line prefer-promise-reject-errors
        //     return Promise.reject('无效的会话，或者会话已过期，请重新登录。');
        // }

        const { msg } = responseData;
        ElMessage.error(msg?.length > 50 ? `抱歉！当前系统繁忙，请您刷新页面或稍后再试.` : msg);
        // ElMessage.error(`抱歉！当前系统繁忙，请您刷新页面或稍后再试。`);
        return Promise.reject(msg);
    },
    (error) => {
        //后端自己的接口报错
        if(error.code == "ECONNABORTED") {
            ElMessage.error(`抱歉！网络请求超时，请稍后再试!`);
            return Promise.reject(error);
        }
        if (error.response.status === 509) {
            const html = error.response.data;
        }
        if (error.response && error.response.data) {
            if (error.response.status !== 509 && error.response.status !== 401) {
                ElMessage.error(`抱歉！当前系统繁忙，请您刷新页面或稍后再试。`);
            }
        } else {
            // ElMessage.error(`${error}`);
            ElMessage.error(`抱歉！当前系统繁忙，请您刷新页面或稍后再试。`);
        }
        return Promise.reject(error);
    },
);

// 下载文件
function download(res: any) {
    const blob = new Blob([res.data], { type: 'application/vnd.ms-excel' }); // type是文件类，详情可以参阅blob文件类型
    // 创建新的URL并指向File对象或者Blob对象的地址
    const blobURL = window.URL.createObjectURL(blob);
    // 创建a标签，用于跳转至下载链接
    const tempLink = document.createElement('a');
    tempLink.style.display = 'none';
    tempLink.href = blobURL;
    if(res.headers['content-disposition']){
        tempLink.setAttribute('download', decodeURI(res.headers['content-disposition'].split(';')[1].split('=')[1]));
    }
    // 兼容：某些浏览器不支持HTML5的download属性
    if (typeof tempLink.download === 'undefined') {
        tempLink.setAttribute('target', '_blank');
    }
    // 挂载a标签
    document.body.appendChild(tempLink);
    tempLink.click();
    document.body.removeChild(tempLink);
    // 释放blob URL地址
    window.URL.revokeObjectURL(blobURL);
}

export default axios;
