import axios from 'axios';

import { ErrorShowType } from '@/defines';
import { reportError } from '@/firebase';
import { message, notification } from '@/utils/antdAppInstance';
import { RequestConfig } from '@/utils/request/types';
// import { toLoginPage } from '@/utils/routerUtils';

/**
 * @name 错误处理
 */
export const errorConfig: RequestConfig = {
    // 错误处理： umi@3 的错误处理方案。
    errorConfig: {
        // 错误抛出
        errorThrower: (res: any) => {
            const { success, data, errorCode, errorMessage, showType } =
                res as unknown as API.Result;
            if (!success) {
                const error: any = new Error(errorMessage);
                error.name = 'BizError';
                error.info = { errorCode, errorMessage, showType, data };
                throw error; // 抛出自制的错误
            }
        },
        // 错误接收及处理
        errorHandler: (error: any, opts: any) => {
            if (axios.isCancel(error)) {
                console.warn('请求已被取消', error, opts);
                Object.assign(error, { isCanceled: true });
                return;
            }

            // 错误上报逻辑
            if (error.name === 'BizError') {
                // 接口业务错误
                const errorInfo: API.Result | undefined = error.info;
                if (errorInfo) {
                    const { errorMessage, errorCode, data } = errorInfo;
                    reportError(error, {
                        errorName: 'apiBiz',
                        errorCode: errorCode,
                        errorMessage: errorMessage,
                        errorData: data,
                        requestUrl: opts?.url,
                        requestMethod: opts?.method,
                    });
                }
            } else if (error.response) {
                // 接口响应错误
                reportError(error, {
                    errorName: 'apiResponse',
                    errorCode: error.response.status,
                    errorMessage: error.message,
                    responseData: error.response.data,
                    requestUrl: error.config?.url,
                    requestMethod: error.config?.method,
                });
            } else if (error.request) {
                // 请求已经成功发起，但没有收到响应
                reportError(error, {
                    errorName: 'apiNetwork',
                    errorMessage: 'None response',
                    requestUrl: error.config?.url,
                    requestMethod: error.config?.method,
                });
            } else {
                // 发送请求时出了点问题
                reportError(error, {
                    errorName: 'apiRequest',
                    errorMessage: 'Invalid request configuration or parameters',
                    requestUrl: error.config?.url,
                    requestMethod: error.config?.method,
                });
            }

            if (opts?.skipErrorHandler) throw error;

            // errorThrower 抛出的错误。
            if (error.name === 'BizError') {
                const errorInfo: API.Result | undefined = error.info;
                if (errorInfo) {
                    const { errorMessage, errorCode } = errorInfo;

                    if (errorCode === 401) {
                        // 如果接口返回 401 错误，跳转到登录页
                        // toLoginPage(); // 本项目没有登录页，所以不跳转
                        return;
                    }
                    switch (errorInfo.showType) {
                        case ErrorShowType.SILENT:
                            // do nothing
                            break;
                        case ErrorShowType.WARN_MESSAGE:
                            message.warning(errorMessage);
                            break;
                        case ErrorShowType.ERROR_MESSAGE:
                            message.error(errorMessage);
                            break;
                        case ErrorShowType.NOTIFICATION:
                            notification.error({
                                description: errorMessage,
                                message: errorCode,
                            });
                            break;
                        case ErrorShowType.REDIRECT:
                            // TODO: redirect
                            break;
                        default:
                            message.error(errorMessage);
                    }
                }
            } else if (error.response) {
                // Axios 的错误
                if (error.response.status === 401) {
                    // toLoginPage();
                    return;
                }

                notification.error({
                    message: error.response.status,
                    description: error.message,
                });
            } else if (error.request) {
                // 请求已经成功发起，但没有收到响应
                message.error('None response! Please retry.');
            } else {
                // 发送请求时出了点问题
                message.error('Request error, please retry.');
            }
        },
    },
};
