import axios from 'axios';
import { ElLoading, ElMessage, ElMessageBox, } from 'element-plus';
import { Session } from '/@/utils/storage';
import Qs from 'qs';

export const BASE_URL = import.meta.env.VITE_API_URL as any
axios.defaults.withCredentials = false;
// 记录请求次数
let needLoadingRequestCount = 0;
let loading;
// 正在进行中的请求列表
let reqList = [] // 如果某个api存在这个数组里，说明该api暂时无法再次请求
/**
 * 阻止重复请求
 * @param {array} reqList - 请求缓存列表
 * @param {string} url - 当前请求地址
 * @param {function} cancel - 请求中断函数
 * @param {string} errorMessage - 请求中断时需要显示的错误信息
 */
const stopRepeatRequest = function (reqList, url, cancel, errorMessage) {
	const errorMsg = errorMessage || ''
	for (let i = 0; i < reqList.length; i++) {
	  if (reqList[i] === url) {
		cancel(errorMsg)
		return
	  }
	}
	reqList.push(url)
  }
/**
 * 允许某个请求可以继续进行
 * @param {array} reqList 全部请求列表
 * @param {string} url 请求地址
 */
const allowRequest = function (reqList, url) {
	for (let i = 0; i < reqList.length; i++) {
	  if (reqList[i] === url) {
		reqList.splice(i, 1)
		break
	  }
	}
  }
// 配置新建一个 axios 实例
const service = axios.create({
	baseURL: import.meta.env.VITE_API_URL as any,
	timeout: 600000,
	paramsSerializer: function(params) {//序列化请求参数，避免get请求参数出现&,空格等识别错误的问题
        return Qs.stringify(params, {arrayFormat: 'brackets'})
    },
	headers: { 'Content-Type': 'application/json' },
});

// 添加请求拦截器
service.interceptors.request.use(
	(config) => {
		// console.log('-------------',config)
		// showFullScreenLoading();
		// 在发送请求之前做些什么 token
		if (Session.get('token')) {
			config.headers.common['Authorization'] = 'Bearer '+ `${Session.get('token')}`;
		}
		const systemLang = Session.get('st_locale') || 'zh-cn';
		const langMap = {
			'zh-cn': 'zh-CN',
			'ja': 'ja-JP',
			'en': 'en-US',
			'zh-tw': 'zh-TW',
			'ms': 'ms-MY'
		}
		config.headers.common['accept-language'] = langMap[systemLang];

		let cancel
		// 设置cancelToken对象
		config.cancelToken = new axios.CancelToken(function(c) {
		cancel = c
		})
		// 阻止重复请求。当上个请求未完成时，相同的请求不会进行
		// stopRepeatRequest(reqList, config.url, cancel, `${config.url} 请求被中断`)
		return config;
	},
	(error) => {
		// tryHideFullScreenLoading();
		// 对请求错误做些什么
		return Promise.reject(error);
	}
);

// 添加响应拦截器
service.interceptors.response.use(
	(response) => {
		// tryHideFullScreenLoading();
		// 增加延迟，相同请求不得在短时间内重复发送
		setTimeout(() => {
			allowRequest(reqList, response.config.url)
		  }, 1000) // 上一次请求返回后过1s才允许再次请求
		// 对响应数据做点什么
		const res = response.data;
		if (res.code && res.code !== 0) {
			// `token` 过期或者账号已在别处登录
			if (res.code === 401 || res.code === 4001||res.code===50014) {
				Session.clear(); // 清除浏览器全部临时缓存
				window.location.href = '/'; // 去登录页
				ElMessageBox.alert('你已被登出，请重新登录', '提示', {})
					.then(() => {})
					.catch(() => {});	
			}
			if(res.code===200){
				return response.data;
			}
			if(res.code === 400){
				ElMessage.error(res.message);
			}
			if(res.code === 500){
				ElMessage.error(res.message);
			}
			return Promise.reject(res.message);
		} else {
			return response.data;
		}
	},
	(error) => {
		// tryHideFullScreenLoading();
		console.log('--------------------')
		console.log(error)
		
		if (axios.isCancel(error)) {
			console.log(error.message);
		  } 
		  else {
			setTimeout(() => {
				allowRequest(reqList, error.config.url)
			  }, 1000) // 请求失败返回后过1s才允许再次请求
		  }
		// 对响应错误做点什么
		if (error.message.indexOf('timeout') != -1) {
			ElMessage.error('网络超时');
		}else if (error.message.indexOf('status code 401') != -1) {
			ElMessage.error('token 过期了');
			Session.clear(); // 清除浏览器全部临时缓存
			window.location.href = '/'; // 去登录页
		}
		 else if (error.message == 'Network Error') {
			ElMessage.error('网络连接错误');
		} else {
			if (error.response.data) ElMessage.error(error.response.statusText);
			else ElMessage.error('接口路径找不到');
		}
		return Promise.reject(error);
	}
);

// loading函数
const  startLoading=()=> {
  loading = ElLoading.service({
    lock: true,
    text: '加载中……',
    background: 'rgba(0, 0, 0, 0.5)',
  });
}
const endLoading=()=> {
  // 延迟500ms，防止网速特快加载中画面一闪而过
  setTimeout(function () {
    if (loading) loading.close();
  }, 500);
}
// 打开loading
const showFullScreenLoading=()=> {
  if (needLoadingRequestCount === 0) {
    startLoading();
  }
  needLoadingRequestCount++;
}
// 关闭loading
const tryHideFullScreenLoading=()=> {
  if (needLoadingRequestCount <= 0) return;
  needLoadingRequestCount--;
  if (needLoadingRequestCount === 0) {
    endLoading();
  }
}


// 导出 axios 实例
export default service;
