import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import store from '../store'
import cache from '@/plugins/cache'
import { getToken, setToken } from '@/utils/auth'

// 创建axios实例
const service = axios.create({
	headers: { 'Content-Type': 'application/json;charset=utf-8' },
	// baseURL: process.env.BASE_API,
	// timeout: 5000 // 请求超时时间
})

// request拦截器
if (!window.flag) {
	service.interceptors.request.use(
		config => {
			if (config.method === 'get') {
				config.params = {
					_t: Date.parse(new Date()) / 1000,
					...config.params,
				}
			}

			let token = window.localStorage.getItem('token')
			if (sessionStorage.getItem('TOKENL')) {
				config.headers['token'] = sessionStorage.getItem('TOKENL') // 让每个请求携带自定义token 请根据实际情况自行修改
			}
			config.url = encodeURI(config.url)
			// config.headers['token'] =
			// 	'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIiLCJ1c2VyQWNjb3VudCI6InpoYW5nc2FuMSIsImV4cCI6MTU2NTgzMjM4MywidXNlcklkIjoiVTAwMDAyNjEiLCJpYXQiOjE1NjU3NDU5ODMsImp0aSI6ImM1MGQ0NDRhLWQ5MTItNGIzZC1hMWVkLTNkMThmNGI3ODJiZCJ9.7oyxbLqeGqnxhen3pawfelIOSqSJ_7za5CYHQ6LfU6E';

			// // 是否需要防止数据重复提交
			// const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
			// if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
			// 	const requestObj = {
			// 		url: config.url,
			// 		data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
			// 		time: new Date().getTime()
			// 	}
			// 	const sessionObj = cache.session.getJSON('sessionObj')
			// 	if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
			// 		cache.session.setJSON('sessionObj', requestObj)
			// 	} else {
			// 		const s_url = sessionObj.url;                  // 请求地址
			// 		const s_data = sessionObj.data;                // 请求数据
			// 		const s_time = sessionObj.time;                // 请求时间
			// 		const interval = 1000;                         // 间隔时间(ms)，小于此时间视为重复提交
			// 		if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
			// 		const message = '数据正在处理，请勿重复提交';
			// 		console.warn(`[${s_url}]: ` + message)
			// 		console.log('error',Promise.reject(new Error(message)))
			// 		// return Promise.reject(new Error(message))
			// 		return Promise.reject()
			// 		} else {
			// 			cache.session.setJSON('sessionObj', requestObj)
			// 		}
			// 	}
			// }

			return config
		},
		error => {
			Promise.reject(error)
		},
	)
}

axios.defaults.withCredentials = true // 请求携带cookie
// respone拦截器
service.interceptors.response.use(
	response => {
		/**
		 * code为非20000是抛错 可结合自己业务进行修改
		 */
		let token = window.localStorage.getItem('token')
		if (response.headers.token) {
			window.flag = true
			window.localStorage.removeItem('token')
			window.localStorage.setItem('token', response.headers.token)
			setToken(response.headers.token)
			window.flag = false
		}

		const res = response.data
		if (res.infoCode === 200) {
			return res
		} else {
			if (res.infoCode === 401) {
				window.location.href = 'http://localhost:9000/login.html'
			}
			// Message({
			//   message: res.message,
			//   type: 'error',
			//   duration: 2 * 1000
			// })
			// 50008:非法的token; 50012:其他客户端登录了;  50014:Token 过期了;
			if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
				MessageBox.confirm('你已被登出，可以取消继续留在该页面，或者重新登录', '确定登出', {
					confirmButtonText: '重新登录',
					type: 'warning',
				}).then(() => {
					store.dispatch('FedLogOut').then(() => {
						location.reload() // 为了重新实例化vue-router对象 避免bug
					})
				})
			}
			return res
		}
	},
	error => {
		let code = error.message.substr(error.message.length - 3)

		if (code === '401') {
			MessageBox.confirm('你已被登出，可以取消继续留在该页面，或者重新登录', '确定登出', {
				confirmButtonText: '重新登录',
				cancelButtonText: '取消',
				type: 'warning',
			}).then(() => {
				store.dispatch('FedLogOut').then(() => {
					location.reload() // 为了重新实例化vue-router对象 避免bug
				})
			})
			return Promise.reject('error')
		} else {
			Message({
				message: error.message,
				type: 'error',
				duration: 1000,
			})
		}
	},
)

export default service
