import axios from 'axios'
import {
	MessageBox,
	Message
} from 'element-ui'
import store from '@/store'
import {
	getToken,
	getName
} from '@/utils/auth'

// 创建axios实例
const service = axios.create({
	baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
	// withCredentials: true, // 跨域请求时发送cookie
	timeout: 20000 // 请求超时
})

// 请求拦截器
service.interceptors.request.use(
	config => {
		// 在发送请求之前做些什么
		if (store.getters.token) {
			// 让每个请求携带令牌
			// ['X-Token'] 是否为自定义标题键
			// 请根据实际情况进行修改
			config.headers['X-Token'] = getToken()
			config.headers['Admin-Name'] = getName()
		}
		return config
	},
	error => {
		// 处理请求错误
		// console.log(error) // 调试命令
		return Promise.reject(error)
	}
)

// 响应拦截器
service.interceptors.response.use(
	/**
	 * 如果您想要获取http信息，如header或状态
	 * 请返回  response => response
	 */

	/**
	 * 通过自定义代码确定请求状态
	 * 这只是一个例子
	 * 您也可以通过“HTTP状态码”来判断状态
	 */
	response => {
		const res = response.data

		// 如果定制代码不是20000，则判定为错误。
		if (res.code !== 200) {
			// 返回格式不规范，也只能如此了
			return res

			Message({
				message: res.message || '返回信息中无code，无法解析数据',
				type: 'error',
				duration: 5 * 1000
			})

			// 50008: 非法的令牌; 50012: 其他客户端已登录; 50014: 过期令牌;
			if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
				// 重新登陆
				MessageBox.confirm('您已注销，您可以取消留在此页面，或重新登录',
					'确认注销', {
						confirmButtonText: '重新登入',
						cancelButtonText: '取消',
						type: 'warning'
					}).then(() => {
					store.dispatch('user/resetToken').then(() => {
						location.reload()
					})
				})
			}

			return Promise.reject(new Error(res.message || '未知错误'))
		} else {
			return res
		}
	},
	error => {
		// console.log('错误：' + error) // 用于调试
		// Message({
		// 	message: error.message,
		// 	type: 'error',
		// 	duration: 5 * 1000
		// })
		return Promise.reject(error)
	}
)

export default service
