const preCacheKeyClearFetch = 'storage:clear:fetch:'

uni.pro.interceptor('request', {
	config(paramOptions) {
		let options = Object.assign({}, paramOptions)
		options.url = uni.conf.baseUrl + paramOptions.url
		this.options = options
		return options
	},
	success(res) {
		if (res.code >= 400) {
			return res.data
		} else {
			return res.data
		}
	}
})

async function request(options) {
	let networkType = ''
	uni.getNetworkType({
		success: (res) => {
			networkType = res.networkType
		}
	});
	if (networkType == 'none') {
		uni.showToast({
			title: '网络异常，请检查网络',
			icon: 'none'
		})
		return false;
	}
	try {
		if (options.toast) {
			uni.pro.showLoading({
				title: '加载中',
				mask: true
			})
		}
		options.header = {
			userId: uni.getStorageSync('userId'),
			minitype:uni.getStorageSync('Type'),
			'content-type': 'application/json'
		}
		let res = await uni.pro.request(options)
		if (res.code != 1) {
			if (options.toast) {
				uni.showToast({
					title: res.message || res.msg,
					icon: "none",
					success() {
						setTimeout(res => {
							// if (options.toast) {
							uni.hideLoading()
							// }
						}, 2000)
					}
				})
			}
			if (res.code == 400) {
				return Promise.reject(res.message)
			} else if (res.code == 401) {
				uni.showToast({
					title: res.message || res.msg,
					icon: "none",
					success: () => {
						uni.cache.clear();
						uni.removeStorageSync("token");
						uni.removeStorageSync("userId");
						uni.removeStorageSync('myLoginName')
						uni.pro.redirectTo("login/login");
					}
				})
			} else if (res.code == 482) {
				let nowTime = new Date() / 1000 | 0
				let offset = parseInt(res.message) - parseInt(nowTime);
				uni.cache.set('storage:offset-time', offset, -1)
				return await request(options)
			} else if (res.code == 422) {
				return Promise.reject(res.message)
			}
		} else {
			if (!options.toast) {
				// uni.showToast({
				// 	title: res.message || res.msg,
				// 	icon: "none",
				// 	success() {
				// 		setTimeout(res => {
				// 			// if (options.toast) {
				// 			uni.hideLoading()
				// 			// }
				// 		}, 2000)
				// 	}
				// })
			}
			return res

		}
	} catch (err) {
		console.warn('uni.request fail [network]', options, err)
		throw err;
	} finally {
		if (options.toast) {
			uni.pro.hideLoading()
		}
	}
}

function isExpire(url) {
	return uni.cache.get(preCacheKeyClearFetch + url)
}
/**
 * 标记fetch过期，会重新请求
 * @author NanQi
 * @param {String} url 标记的URL 
 */
function markFetch(url) {
	uni.cache.set(preCacheKeyClearFetch + url, true)
}

/**
 * 拉取数据(get请求,带缓存)
 * @author NanQi
 * @param {String} url 请求的URL 
 * @param {Object} data 请求参数 
 * @param {Boolean} toast 是否显示toast
 * @param {Number} expire 缓存过期时间（秒）
 * @return {Promise} Promise对象
 */
async function fetch(url, data, toast = true, expire = uni.conf.default_expire) {
	let param = ''
	if (data) {
		param += ':' + uni.utils.md5(uni.utils.sortTransform(data));
	}
	const cacheKey = 'memory:fetch:' + url + param;
	const cacheVal = uni.cache.get(cacheKey);
	if (!isExpire(url) && cacheVal) {
		return Promise.resolve(cacheVal);
	} else {
		if (isExpire(url)) {
			uni.cache.remove(preCacheKeyClearFetch + url)
		}
		try {
			const res = await get(url, data, toast);
			uni.cache.remove(cacheKey);
			uni.cache.set(cacheKey, res, expire);
			return res;
		} catch (err) {
			const res = uni.cache.getStorageData(cacheKey);
			if (res) {
				return Promise.resolve(res);
			} else {
				throw err;
			}
		}
	}
}

/**
 * 获取数据(get请求,不带缓存)
 * @author NanQi
 * @param {String} url 请求的URL 
 * @param {Object} data 请求参数 
 * @param {Boolean} toast 是否显示toast
 * @return {Promise} Promise对象
 */
function get(url, data, toast = true) {
	return request({
		url,
		data,
		toast,
	})
}


/**
 * post请求
 * @author NanQi
 * @param {String} url 请求的URL 
 * @param {Object} data 请求参数 
 * @param {Boolean} toast 是否显示toast
 * @param {String} method 请求方式,默认POST 
 * @return {Promise} Promise对象
 */
function post(url, data, toast = true, method = 'POST') {
	return request({
		url,
		method,
		data,
		toast
	})
}

uni.api = {
	request,
	markFetch,
	fetch,
	get,
	post
}