/**
 * 常用方法封装 请求，文件上传等
 * @author echo. 
 **/
 
 import pako from './pako.es5.min.js'

const axg = {
	//接口地址
	interfaceUrl: function() {
		// #ifdef H5
		return '/api';
		// #endif
		// #ifdef MP
		return 'http://192.168.2.183:18900/v2'
		// #endif
	},
	toast: function(text, duration, success) { 
		// #ifdef APP-PLUS
		plus.nativeUI.toast(text || "出错啦~");
		// #endif
		// #ifndef MP
		uni.showToast({
			title: text || "出错啦~",
			icon: success ? 'success' : 'none',
			duration: duration || 2000
		})
		// #endif
	},
	modal: function(title, content, showCancel, callback, confirmColor, confirmText) {
		uni.showModal({
			title: title || '提示',
			content: content,
			showCancel: showCancel,
			cancelColor: "#555",
			confirmColor: confirmColor || "#5677fc",
			confirmText: confirmText || "确定",
			success(res) {
				if (res.confirm) {
					callback && callback(true)
				} else {
					callback && callback(false)
				}
			}
		})
	},
	delayed: null,
	decompress(str) {
		try {
			return pako.inflateRaw(axg.base64ToUint8Array(str), {
				to: 'string'
			});
		} catch (error) {
			console.error('解压数据失败:', error);
			throw error;
		}
	},
	base64ToUint8Array(base64String) {
	  let padding = '='.repeat((4 - base64String.length % 4) % 4);
	  let base64 = (base64String + padding)
	    .replace(/\-/g, '+')
	    .replace(/_/g, '/');
	  let rawData = axg.atob(base64);
	  let outputArray = new Uint8Array(rawData.length);
	  for (let i = 0; i < rawData.length; ++i) {
	    outputArray[i] = rawData.charCodeAt(i);
	  }
	  return outputArray;
	},
	atob(input) {
	  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
	  let str = input.replace(/=+$/, '');
	  let output = '';
	  if (str.length % 4 === 1) {
	    throw new Error('InvalidLengthError');
	  }
	  for (let i = 0, len = str.length; i < len; i += 4) {
	    const a = chars.indexOf(str.charAt(i));
	    const b = chars.indexOf(str.charAt(i + 1));
	    const c = chars.indexOf(str.charAt(i + 2));
	    const d = chars.indexOf(str.charAt(i + 3));
	    const sum = (a << 18) | (b << 12) | (c << 6) | d;
	    output += String.fromCharCode((sum >> 16) & 0xFF, (sum >> 8) & 0xFF, sum & 0xFF);
	  }
	 
	  return output;
	},
	/**
	 * 请求数据处理
	 * @param string url 请求地址
	 * @param string method 请求方式
	 *  GET or POST
	 * @param {*} postData 请求参数
	 * @param bool isDelay 是否延迟显示loading
	 * @param bool isForm 数据格式
	 *  true: 'application/x-www-form-urlencoded'
	 *  false:'application/json'
	 * @param bool hideLoading 是否隐藏loading
	 *  true: 隐藏
	 *  false:显示
	 */
	request: function(url, method, postData, isDelay, isForm, hideLoading) {
		//接口请求
		let loadding = false;
		axg.delayed && uni.hideLoading();
		clearTimeout(axg.delayed);
		axg.delayed = null;
		if (!hideLoading) {
			axg.delayed = setTimeout(() => {
				uni.showLoading({
					mask: true,
					title: '请求中...',
					success(res) {
						loadding = true
					}
				})
			}, isDelay ? 1000 : 0)
		}
		var header = {
			'Content-Type': isForm ? 'application/x-www-form-urlencoded' : 'application/json',
			'authorization': "Bearer "+axg.getToken(),
			'api-type': "mini"
		}
		return new Promise((resolve, reject) => {
			uni.request({
				url: axg.interfaceUrl() + url,
				data: postData,
				header: header,
				method: method, //'GET','POST'
				dataType: 'json',
				success: (res) => {
					clearTimeout(axg.delayed)
					axg.delayed = null;
					uni.hideLoading()
					if (loadding && !hideLoading) {
						uni.hideLoading()
					}
					if (res.data && res.data.code == 401) {
						uni.showToast({
							title: res.data.msg,
							icon: 'none',
							mask: true,
							duration: 1500,
							success() {
								uni.clearStorageSync();
								uni.navigateTo({
									url:"/pages/auth/login"
								});
							}
						});
						return ;
					}
					if (res.data && res.data.encode) {
						try
						{
							res.data = JSON.parse(axg.decompress(res.data.data));
						}catch(e){
							res.data = axg.decompress(decodeURI(res.data.data));
						}
					}
					resolve(res.data)
				},
				fail: (res) => {
					clearTimeout(axg.delayed)
					axg.delayed = null;
					axg.toast("网络不给力，请稍后再试~")
					reject(res)
				}
			})
		})
	},
	/**
	 * 上传文件
	 * @param string url 请求地址
	 * @param string src 文件路径
	 */
	uploadFile: function(url, src, param) {
		return new Promise((resolve, reject) => {
			const uploadTask = uni.uploadFile({
				url: axg.interfaceUrl() + url,
				filePath: src,
				name: 'file',
				header: {
					'authorization': "Bearer "+axg.getToken(),
					'platform': "mini"
				},
				formData:param,
				success: function(res) {
					uni.hideLoading()
					console.log(res)
					let d = JSON.parse(res.data.replace(/\ufeff/g, "") || "{}")
					if (res.statusCode == 200) {
						//返回图片地址
						let fileObj = d.data;
						resolve(res.data)
					} else {
						axg.toast("系统响应错误");
					}
				},
				fail: function(res) {
					console.log('上传错误：',res)
					reject(res)
					axg.toast(res.msg);
				}
			})
		})
	},
	tuiJsonp: function(url, callback, callbackname) {
		// #ifdef H5
		window[callbackname] = callback;
		let tuiScript = document.createElement("script");
		tuiScript.src = url;
		tuiScript.type = "text/javascript";
		document.head.appendChild(tuiScript);
		document.head.removeChild(tuiScript);
		// #endif
	},
	//设置用户信息
	setUserInfo: function(mobile, token) {
		//uni.setStorageSync("thorui_token", token)
		uni.setStorageSync("user_token", mobile)
	},
	//获取token
	getToken() {
		return uni.getStorageSync("user_token") || 'None'
	},
	//判断是否登录
	isLogin: function() {
		return uni.getStorageSync("user_token") ? true : false
	},
	//跳转页面，校验登录状态
	href(url, isVerify) {
		if (isVerify && !axg.isLogin()) {
			uni.navigateTo({
				url: '/pages/user/login/login'
			})
		} else {
			uni.navigateTo({
				url: url
			});
		}
	}
}

export default axg
