import {clientId, clientSecret, successCode, invalidCode, tenantId} from '@/common/setting'
import {options} from '@/http/config.js'
import {Base64} from '@/utils/base64.js'
import {throttle} from '@/utils/util.js'
import Request from '@/utils/luch-request/index.js'

const http = new Request(options);
const ignorePaths = ['yuecai-wx/login/miniapp', 'yuecai-wx/login/refresh']//"blade-auth/oauth/token";//更新token的api不需要检查token
const preExpire = 5 //token超时之前几分钟提前刷新token

const wxLogin = () => {//微信小程序获取wxcode静默登录,并获取token
	uni.hideLoading()
	console.log('api.js -- wxLogin')
	uni.reLaunch({
		url: '/pages/index?f=1',//强制重新登录
	})
}
// var throttleHandle = false
const reLogin = (isShowLoading) => {//重新登录
	if (isShowLoading) {
		uni.showLoading({
			title: '未登录，即将跳至登录页',
			mask: true,
		})
	}
	// if (!throttleHandle) {
	// 	throttleHandle = throttle(()=>{
	// 		// throttleHandle = null
	// 		wxLogin()
	// 	}, 1500)
	// 	throttleHandle()
	// }
	// throttle(wxLogin, 1500)
	uni.$u.throttle(wxLogin, 1500)
}
const isGetTokenPath = (url) => {//判断是否请求token或刷新token的url
	// for (let i = 0; i < ignorePaths.length; i++) {
	// 	if (url.indexOf(ignorePaths[i]) >= 0) {
	// 		return true
	// 	}
	// }
	return true
}

http.interceptors.request.use((config) => { // 可使用async await 做异步操作
	// 假设有token值需要在头部需要携带
	let accessToken = uni.getStorageSync('accessToken');
	if (accessToken) {
		config.header['Blade-Auth'] = 'bearer ' + accessToken;
	}
	config.header['Tenant-Id'] = tenantId;//添加一个默认租户ID
	// 客户端认证参数
	config.header['Authorization'] = 'Basic ' + Base64.encode(clientId + ':' + clientSecret);
	
	//token超时前5分钟重新默认静态登录,3秒内只允许一次静态登录
	let expireTime = uni.getStorageSync('tokenExpire') || 0
	if(!isGetTokenPath(config.url) && (!accessToken || (new Date().getTime() > expireTime - preExpire*60*1000)) ) {
		/* #ifdef MP-WEIXIN */
		console.log('token超时前' + preExpire + '分钟重新默认静态登录')
		console.log('new Date().getTime()=' + new Date().getTime())
		console.log('expireTime=' + expireTime)
		reLogin()//只要有请求发现token不存在或快超时了就去静默获取一次token
		/* #endif */
		return Promise.reject(config)
	}
	
	if(config.restParams) {//额外参数处理restParams
		let restPath = ""
		for(var key in config.restParams){
		  restPath = "/" + key + "/" + config.restParams[key]
		}
		if(restPath.length > 0) {
			config.url = config.url + restPath
		}
	}
	
	if (config.custom && config.custom.debug ){
		//console.log("ggg debug",config.custom)
		config.baseURL = ""
		config.url = config.custom.url
	}
	
	if (config.hasOwnProperty('custom') && config.custom.hasOwnProperty('loading') && config.custom.loading == false ) {
		//
	} else {
		uni.showLoading({
			title:"请稍后...",
			mask: true
		})
	}
	
	//console.log("extra",config)
	// config.data = config.data || {};
	// config.data.pf = uni.getSystemInfoSync().platform;
	// config.data.sys = uni.getSystemInfoSync().system;

	// 演示custom 用处
	// if (config.custom.auth) {
	//   config.header.token = 'token'
	// }
	// if (config.custom.loading) {
	//  uni.showLoading()
	// }
	/**
	 /* 演示
	 if (!token) { // 如果token不存在，return Promise.reject(config) 会取消本次请求
	    return Promise.reject(config)
	  }
	 **/
	return config
}, config => { // 可使用async await 做异步操作
	return Promise.reject(config)
})
http.interceptors.response.use((response) => {
	// 若有数据返回则通过
	uni.hideLoading()
	if (response.data.access_token || response.data.key) {
		return response.data
	}
    // 服务端返回的状态码等于401（请求未授权），则跳到登录页
	if (response.data.code == invalidCode) {
		console.log('response.success ' + invalidCode)
		reLogin()
		return Promise.reject(response);
    }
	// 服务端返回的状态码不等于200，则reject()
	if (response.data.code !== successCode) {
		return Promise.reject(response);
	}
	return response.data;
}, (response) => {
    // 服务端返回的状态码等于401（请求未授权），则跳到登录页
    if (response.data.code == invalidCode) {
		console.log('response.error ' + invalidCode)
		reLogin(true)
    } else {
		/*  对响应错误做点什么 （statusCode !== successCode）*/
		uni.showToast({
			title: response.data.msg,
			icon: 'none'
		})
	}
	return Promise.reject(response)
})
export default http;
