import axios, { AxiosResponse } from 'axios';
import { message } from 'antd';
import config, { getHeaders } from './config';
import LocalStorage from '@/LocalStorage';
import router from '@/router';

// 创建axios实例
const axiosInstance = axios.create({
    baseURL: config.baseURL,
    timeout: 600000 * 2,// 请求超时20分钟
});

// 请求拦截器
axiosInstance.interceptors.request.use(
    (config: any) => {
        config.headers = getHeaders();
        if (!navigator.onLine) {
            message.error('网络故障');
        }
        return config;
    }
);

// 响应拦截器
axiosInstance.interceptors.response.use(
    (response: AxiosResponse) => {// 成功信息
        const { config, data } = response;
        if (config.responseType === 'blob') {
            return Promise.resolve(data);
        } else {
            if (data.code === 200) {// 成功
                return Promise.resolve(data);
            } else {// 失败
                if (data.code === 401) {
                    LocalStorage.clear();
                    router.navigate({ pathname: '/login' }, { replace: true });
                    message.error('登录过期');
                    return Promise.reject();
                } else {
                    return Promise.reject(data);
                }
            }
        }
    },
    (error) => {// 错误信息
        // HTTP状态码
        const statusCode = error.response?.status;
        if (String(error).includes('timeout')) {
            message.error('请求超时');
        } else if (statusCode === 504) {
            // 504网关超时，通常是上传文件超时
            message.error('请求超时，请稍后重试');
        } else if (statusCode === 403) {
            // 403禁止访问，通常是防火墙拦截或内容违规
            message.error('检测到您的此次提交请求未能通过安全验证，请检查提示词中是否包含特殊符号（如 ` \ $ ）, 请调整后重新提交。');
        } else {
            if (statusCode < 500) {
                message.error('请求失败');
            } else {
                message.error('服务异常');
            }
        }
        return Promise.reject();
    }
);

export default axiosInstance;
