import Request from 'luch-request'
import crypto from '@/utils/crypto.js'

let baseURL = 'https://ldt.guosen-fumao.cn/api/'
// let baseURL = 'http://192.168.1.168:2366/'

let refreshTokenUrl = baseURL + "blade-auth/oauth/token"

//获取token
const getTokenStorage = () => {
	let token = ''
	try {
		token = uni.getStorageSync('token')
	} catch (e) {}
	return token
}
//缓存token信息
const cacheToken = (data) => {
	let tokenInfo = {
		accessToken: data.access_token,
		//提前200秒过期
		expiresIn: new Date().getTime() + (data.expires_in - 200) * 1000,
		refreshToken: data.refresh_token,
		tenantId: data.tenant_id,
		nickName: data.nick_name
	}
	uni.setStorageSync('token', data.access_token)
	uni.setStorageSync('tokenInfo', tokenInfo)
}

const http = new Request()
http.setConfig((config) => {
	/* 设置全局配置 */
	config.baseURL = baseURL /* 根域名不同 */
	config.header = {
		...config.header,
	}
	return config
})

http.interceptors.request.use((config) => {
	/* 请求之前拦截器。可以使用async await 做异步操作 */
	config.header = {
		...config.header,
		Authorization: "Basic c2FiZXI6c2FiZXJfc2VjcmV0",
		"Blade-Auth": getTokenStorage()
	}
	if (config.method == 'POST' && config.data) {
		//报文加密
		let encrypt= crypto.encrypt(JSON.stringify(config.data))
		config.data=encrypt
	}
	return config
}, (config) => {
	return Promise.reject(config)
})
// 是否正在刷新的标记
let isRefreshing = false
// 重试队列，每一项将是一个待执行的函数形式
let requests = []
http.interceptors.response.use(async (response) => {
	/* 请求之后拦截器。可以使用async await 做异步操作  */
	//toekn过期处理 
	//200 返回数据成功 0
	if (response.data.code != 200 && response.data.code != 400 && response.data.access_token==null) {
		return Promise.reject(response)
	}
	return response.data
}, async (err) => { // 请求错误做点什么
	if (err.data.code == 401) {
		let {
			config
		} = err
		if (!isRefreshing) {
			isRefreshing = true

			let tokenInfo = uni.getStorageSync('tokenInfo')

			let [, res] = await uni.request({
				url: refreshTokenUrl,
				method: 'POST',
				header: {
					'Authorization': "Basic c2FiZXI6c2FiZXJfc2VjcmV0",
					'Content-Type': 'application/x-www-form-urlencoded',
					'Tenant-Id': tokenInfo.tenantId
				},
				data: {
					'tenantId': tokenInfo.tenantId,
					'refresh_token': tokenInfo.refreshToken,
					'grant_type': "refresh_token",
					'scope': "all",
				}
			})
			if ( !res.data ||  (res.data && res.data.error_description=="用户名或密码不正确")) {
				uni.clearStorage()
				uni.reLaunch({
					url:"/pages/login/account-login"
				})
				// uni.showModal({
				// 	title:"提示",
				// 	content:"登录失败",
				// 	showCancel:false,
				// 	success: (res) => {
				// 		if (res.confirm) {
				// 			uni.clearStorage()
				// 			uni.reLaunch({
				// 				url:"/pages/login/account-login"
				// 			})
				// 		}
				// 	}
				// })
				return
			}
			//否则保存新的token
			cacheToken(res.data)

			requests.forEach(cb => cb())
			// 重试完了清空这个队列
			requests = []
			isRefreshing = false
			return http.request(config)
		} else {
			return new Promise((resolve) => {
				// 将resolve放进队列，用一个函数形式来保存，等token刷新后直接执行
				requests.push(() => {
					resolve(http.request(config))
				})
			})
		}
	}
	if (err.data.code == 500) {
		uni.showToast({
			title: err.data.msg,
			icon: "none"
		})
		return Promise.reject(err)
	}
	if (!err.data.success) {
		uni.showToast({
			title: err.data.msg,
			icon: "none"
		})
		return err.data
	} else {
		return err.data
	}
})
export {
	http
}
