var md5 = require('@/GraceUI5/js/md5.js');
module.exports = {
	// 版本检查
	verson: function() {
		var currentVersion = '5.0';
		console.log(currentVersion);
	},
	// --- 页面跳转相关 ---
	// 页面跳转
	navigate: function(url, type, success, fail, complete) {
		if (!type) {
			type = 'navigateTo';
		}
		if (!success) {
			success = function() {};
		}
		if (!fail) {
			fail = function() {};
		}
		if (!complete) {
			complete = function() {};
		}
		switch (type) {
			case 'navigateTo':
				uni.navigateTo({
					url: url,
					success: success,
					fail: fail,
					complete: complete
				});
				break;
			case 'redirectTo':
				uni.redirectTo({
					url: url,
					success: success,
					fail: fail,
					complete: complete
				});
				break;
			case 'switchTab':
				uni.switchTab({
					url: url,
					success: success,
					fail: fail,
					complete: complete
				});
				break;
			case 'reLaunch':
				uni.reLaunch({
					url: url,
					success: success,
					fail: fail,
					complete: complete
				});
				break;
		}
	},
	// 返回
	back: function(delta) {
		if (!delta) {
			delta = 1;
		}
		uni.navigateBack({
			delta: delta
		});
	},

	// --- 网络请求 ---
	// get
	get: function(url, data, headers, success, fail) {
		if (!fail) {
			fail = () => {
				this.msg("网络请求失败");
			}
		}
		if (!headers) {
			headers = {};
		}
		if (this.__before != null) {
			this.__before();
			this.__before = null;
		}
		uni.request({
			url: url,
			data: data,
			method: "GET",
			dataType: "json",
			header: headers,
			success: (res) => {
				success(res.data);
			},
			fail: fail,
			complete: () => {
				if (this.__after != null) {
					this.__after();
					this.__after = null;
				}
			}
		});
	},
	// post
	post: function(url, data, contentType, headers, success, fail) {
		if (!fail) {
			fail = () => {
				this.msg("网络请求失败");
			}
		}
		if (!headers) {
			headers = {};
		}
		if (!contentType) {
			contentType = 'form';
		}
		if (this.__before != null) {
			this.__before();
			this.__before = null;
		}
		switch (contentType) {
			case "form":
				headers['content-type'] = 'application/x-www-form-urlencoded';
				break;
			case "json":
				headers['content-type'] = 'application/json';
				break;
			default:
				headers['content-type'] = 'application/x-www-form-urlencoded';
		}
		uni.request({
			url: url,
			data: data,
			method: "POST",
			dataType: "json",
			header: headers,
			success: (res) => {
				success(res.data);
			},
			fail: fail,
			complete: () => {
				if (this.__after != null) {
					this.__after();
					this.__after = null;
				}
			}
		});
	},
	// 请求前置函数
	__before: null,
	setBefore: function(func) {
		this.__before = func;
	},
	// 请求后置函数
	__after: null,
	setAfter: function(func) {
		this.__after = func;
	},

	// --- 数据缓存 ---
	setStorage: function(data) {
		try {
			for (let k in data) {
				uni.setStorageSync(k, data[k] + '');
			}
			return true;
		} catch (e) {
			return false;
		}
	},
	getStorage: function(keyName) {
		try {
			var tmpVal = uni.getStorageSync(keyName);
			if (tmpVal == '') {
				return false;
			}
			return tmpVal;
		} catch (e) {
			return false;
		}
	},
	removeStorage: function(keyName) {
		try {
			uni.removeStorageSync(keyName);
			return true;
		} catch (e) {
			return false;
		}
	},
	clearStorage: function() {
		try {
			uni.clearStorageSync();
		} catch (e) {}
	},

	// --- 图片相关 ---
	chooseImgs: function(sets, success, fail, complete) {
		if (!sets.count) {
			sets.count = 1;
		}
		if (!sets.sizeType) {
			sets.sizeType = ['original', 'compressed'];
		}
		if (!sets.sourceType) {
			sets.sourceType = ['album', 'camera'];
		}
		uni.chooseImage({
			count: sets.count, //默认9
			sizeType: sets.sizeType, //可以指定是原图还是压缩图，默认二者都有
			sourceType: sets.sourceType, //从相册选择
			success: (res) => {
				success(res.tempFilePaths);
			},
			fail: (e) => {
				if (fail) {
					fail(e);
				}
			},
			complete: (e) => {
				if (complete) {
					complete(e);
				}
			}
		});
	},
	getImageInfo: function(imgUrl, success, fail, complete) {
		uni.getImageInfo({
			src: imgUrl,
			success: function(info) {
				success(info);
			},
			fail: (e) => {
				if (fail) {
					fail(e);
				}
			},
			complete: (e) => {
				if (complete) {
					complete(e);
				}
			}
		});
	},
	previewImage: function(items, currentImg) {
		uni.previewImage({
			urls: items,
			current: currentImg
		});
	},

	// --- 系统信息 ---
	system: function() {
		try {
			var res = uni.getSystemInfoSync();
			var iPhoneXBottom = 0;
			if (!res.model) {
				res.model = 'no';
			}
			res.model = res.model.replace(' ', '');
			res.model = res.model.toLowerCase();
			var res1 = res.model.indexOf('iphonex');
			if (res1 > 5) {
				res1 = -1;
			}
			var res2 = res.model.indexOf('iphone1');
			if (res2 > 5) {
				res2 = -1;
			}
			if (res1 != -1 || res2 != -1) {
				res.iPhoneXBottomHeightRpx = 50;
				res.iPhoneXBottomHeightPx = uni.upx2px(50);
			} else {
				res.iPhoneXBottomHeightRpx = 0;
				res.iPhoneXBottomHeightPx = 0;
			}
			return res;
		} catch (e) {
			return null;
		}
	},

	// --- 消息弹框 ---
	msg: function(msg) {
		uni.showToast({
			title: msg,
			icon: "none"
		});
	},
	showLoading: function(title) {
		uni.showLoading({
			title: title,
			mask: true
		});
	},

	// --- 导航条设置 ---
	setNavBar: function(sets) {
		if (sets.title) {
			uni.setNavigationBarTitle({
				title: sets.title
			});
		}
		if (sets.color) {
			uni.setNavigationBarColor({
				frontColor: sets.color.frontColor,
				backgroundColor: sets.color.backgroundColor,
			 animation: {
					duration: 400,
			  timingFunc: 'easeIn'
				}
			});
		}
		if (sets.loading) {
			uni.showNavigationBarLoading();
		} else {
			uni.hideNavigationBarLoading();
		}
	},

	// --- 元素选择 ---
	// 单个元素选择
	select: function(selector, callBack) {
		uni.createSelectorQuery().select(selector).boundingClientRect().exec((res) => {
			callBack(res[0]);
		});
	},
	// 多个元素获取
	selectAll: function(selector, callBack) {
		uni.createSelectorQuery().selectAll(selector).boundingClientRect().exec((res) => {
			callBack(res[0]);
		});
	},

	// --- 数组操作 ---
	// 数组合并
	arrayConcat: function() {
		var tmpArr = [];
		for (let i = 0; i < arguments.length; i++) {
			tmpArr = tmpArr.concat(arguments[i]);
		}
		return tmpArr;
	},
	arrayDrop: function(array, index, howmany) {
		if (!index) {
			index = 0;
		}
		if (!howmany) {
			howmany = 1;
		}
		array.splice(index, howmany);
		return array;
	},
	arrayIndexOf: function(arr, needFind) {
		var index = -1;
		for (let i = 0; i < arr.length; i++) {
			if (arr[i] == needFind) {
				index = i;
				return i;
			}
		}
		return index;
	},
	arrayDifference: function(a, b) {
		const set = new Set(b);
		return a.filter(x => !set.has(x));
	},
	arrayShuffle: function(arr) {
		let l = arr.length;
		while (l) {
			const i = Math.floor(Math.random() * l--);
			[arr[l], arr[i]] = [arr[i], arr[l]];
		}
		return arr;
	},
	arraySum: function(arr) {
		return arr.reduce((acc, val) => acc + val, 0);
	},
	arrayAvg: function(arr) {
		return arr.reduce((acc, val) => acc + val, 0) / arr.length;
	},
	arrayEach: function(arr, fun) {
		for (let i = 0; i < arr.length; i++) {
			fun(arr[i], i);
		}
	},

	// 2数之间的随机数
	random: function(min, max) {
		switch (arguments.length) {
			case 1:
				return parseInt(Math.random() * min + 1, 10);
				break;
			case 2:
				return parseInt(Math.random() * (max - min + 1) + min, 10);
				break;
			default:
				return 0;
		}
	},

	// UUID
	uuid: function(len) {
		var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
		var uuid = [],
			i;
		if (len) {
			for (i = 0; i < len; i++) {
				uuid[i] = chars[0 | Math.random() * chars.length];
			}
		} else {
			var r;
			uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
			uuid[14] = '4';
			for (i = 0; i < 36; i++) {
				if (!uuid[i]) {
					r = 0 | Math.random() * 16;
					uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
				}
			}
		}
		return uuid.join('');
	},

	// --- 日期时间 ---
	now: function(type, addTime) {
		var dateObj = new Date();
		var cTime = dateObj.getTime();
		if (addTime) {
			cTime += addTime;
		}
		if (!type) {
			type = 'number';
		}
		if (type == 'number') {
			return cTime;
		} else if (type == 'str') {
			return this.toDate(cTime / 1000, 'str');
		} else if (type == 'array') {
			return this.toDate(cTime / 1000, 'array');
		}
	},
	// 时间戳转 YY-mm-dd HH:ii:ss
	toDate: function(timeStamp, returnType) {
		timeStamp = parseInt(timeStamp);
		var date = new Date();
		if (timeStamp < 90000000000) {
			date.setTime(timeStamp * 1000);
		} else {
			date.setTime(timeStamp);
		}
		var y = date.getFullYear();
		var m = date.getMonth() + 1;
		m = m < 10 ? ('0' + m) : m;
		var d = date.getDate();
		d = d < 10 ? ('0' + d) : d;
		var h = date.getHours();
		h = h < 10 ? ('0' + h) : h;
		var minute = date.getMinutes();
		var second = date.getSeconds();
		minute = minute < 10 ? ('0' + minute) : minute;
		second = second < 10 ? ('0' + second) : second;
		if (returnType == 'str') {
			return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second;
		}
		return [y, m, d, h, minute, second];
	},
	// 字符串转时间戳
	toTimeStamp: function(timeStamp) {
		var reg = /^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})$/;
		var res = timeStamp.match(reg);
		if (res == null) {
			var reg2 = /^([0-9]{2})\/([0-9]{2})\/([0-9]{4}) ([0-9]{2}):([0-9]{2}):([0-9]{2})$/;
			var res2 = timeStamp.match(reg2);
			if (res2 == null) {
				console.log('时间格式错误 E001');
				return false;
			}
			var year = parseInt(res2[3]);
			var month = parseInt(res2[1]);
			var day = parseInt(res2[2]);
			var h = parseInt(res2[4]);
			var i = parseInt(res2[5]);
			var s = parseInt(res2[6]);
		} else {
			var year = parseInt(res[1]);
			var month = parseInt(res[2]);
			var day = parseInt(res[3]);
			var h = parseInt(res[4]);
			var i = parseInt(res[5]);
			var s = parseInt(res[6]);
		}
		if (year < 1000) {
			console.log('时间格式错误');
			return false;
		}
		if (h < 0 || h > 24) {
			console.log('时间格式错误');
			return false;
		}
		if (i < 0 || i > 60) {
			console.log('时间格式错误');
			return false;
		}
		if (s < 0 || s > 60) {
			console.log('时间格式错误');
			return false;
		}
		return Date.parse(new Date(year, month - 1, day, h, i, s));
	},
	// 根据时间戳计算多少分钟/小时/天之前
	fromTime: function(time) {
		if (time < 90000000000) {
			time *= 1000;
		}
		var timer = new Date().getTime() - time;
		timer = parseInt(timer / 1000);
		if (timer < 180) {
			return '刚刚';
		} else if (timer >= 180 && timer < 3600) {
			return parseInt(timer / 60) + '分钟前';
		} else if (timer >= 3600 && timer < 86400) {
			return parseInt(timer / 3600) + '小时前';
		} else if (timer >= 86400 && timer < 2592000) {
			return parseInt(timer / 86400) + '天前';
		} else {
			return this.toDate(time, 'str');
		}
	},

	// 延迟操作
	delay: function(timer, func) {
		return setTimeout(func, timer);
	},
	// 间隔指定时间循环某个函数
	interval: function(timer, func) {
		return setInterval(func, timer);
	},

	// 对象操作
	assign: function(obj, key, val) {
		obj[key] = val;
	},
	removeByKey: function(obj, key) {
		delete obj[key];
	},
	each: function(obj, func) {
		for (let k in obj) {
			func(k, obj[k]);
		}
	},
	isEmptyObj: function(obj) {
		return JSON.stringify(obj) === '{}';
	},

	// 获取ref ( 循环获取，直到 组件创建完成并获取成功 )
	getRefs: function(ref, _this, count, fun) {
		if (count >= 50) {
			fun(_this.$refs[ref]);
			return false;
		}
		var refReturn = _this.$refs[ref];
		if (refReturn) {
			fun(refReturn);
		} else {
			count++;
			setTimeout(() => {
				this.getRefs(ref, _this, count, fun);
			}, 100);
		}
	},
	
	// md5
	md5 : function(str){
		return md5.md5(str);
	}
}
