import router from '@/router';
import { localGet, localRemove } from '@/utils/util.ts';
import axios from 'axios';
import mittBus from '@/utils/mittBus.ts';

const request = axios.create({
	// 默认请求地址
	baseURL: import.meta.env.VITE_BASE_API,
	// 设置超时时间
	timeout: import.meta.env.VITE_BASE_API_TIMEOUT,
	// @ts-ignore
	retry: import.meta.env.VITE_BASE_API_RETRY, //设置全局重试请求次数（最多重试几次请求）
	retryDelay: import.meta.env.VITE_BASE_API_RETRY_DELAY, //设置全局请求间隔
	// 跨域允许携带凭证
	// withCredentials: true,
});

// 请求拦截器
request.interceptors.request.use(config => {
	// TODO 当本地有token表示登录了，请求时将token带上
	const token = localGet('token');

	if (token !== null) {
		config.headers['token'] = token;
	}

	return config;
});

// 响应拦截器
request.interceptors.response.use(
	(response: any) => {
		// 返回相应数据
		const data = response.data;

		// 登录过期
		if (data.code === 208) {
			// TODO 登录过期
			console.log('登录过期');
			router.push('/').then();
			localRemove('token');
		}

		// 账户被封禁
		if (data.code === 209) {
			// TODO 账户被封禁
			console.log('账户被封禁');
			router.push('/').then();
			localRemove('token');
		}

		// 统一处理异常
		if (data.code !== 200 && data.code < 300) {
			// TODO 统一处理异常
			console.log('统一处理异常');
		} else if (data.code > 300) {
			console.log('统一处理异常');
		}

		// 返回消息内容
		mittBus.emit('system-request-error', { retry: 0, retryCount: 0, isSuccess: true });
		return data;
	},
	async error => {
		const config = error.config;
		// 重试次数
		const retry = config.retry;
		// 重试时间
		const retryDelay = config.retryDelay;
		// 当前重试次数
		config._retryCount = config._retryCount || 0;

		// 如果重试次数大于定义次数返回错误
		if (config._retryCount > retry) {
			return Promise.reject(new Error(error.response.statusText));
		}

		// 失败后打开到500页面
		await router.push('/500');
		mittBus.emit('system-request-error', { retry, retryCount: config._retryCount, isSuccess: false });

		// 设置请求间隔 在发送下一次请求之前停留一段时间，时间为上方设置好的请求间隔时间
		const backoff = new Promise(function (resolve) {
			setTimeout(() => resolve(true), retryDelay || 1000);
		});

		// 如果失败次数加1
		config._retryCount += 1;

		// 再次发送请求
		return backoff.then(() => request(error.config));
	},
);

export default request;
