/**函数防抖
 * @param { function } func
 * @param { number } wait 延迟执行毫秒数
 * @param { boolean } immediate  true 表立即执行,false 表非立即执行
 */
function debounce(func, wait = 100, immediate = false) {
	let timeout
	return function() {
		let context = this
		let args = arguments

		if (timeout) clearTimeout(timeout)
		if (immediate) {
			let callNow = !timeout
			timeout = setTimeout(() => {
				timeout = null
			}, wait)
			if (callNow) func.apply(context, args)
		} else {
			timeout = setTimeout(() => {
				func.apply(context, args)
			}, wait)
		}
	}
}

/**函数节流
 * @param { function } func 函数
 * @param { number } wait 延迟执行毫秒数
 * @param { number } type 1 表时间戳版,2 表定时器版
 */
function throttle(func, wait = 100, type = 2) {
	let previous, timeout
	if (type === 1) {
		previous = 0
	} else if (type === 2) {
		timeout = null
	}
	return function() {
		let context = this
		let args = arguments
		if (type === 1) {
			let now = Date.now()

			if (now - previous > wait) {
				func.apply(context, args)
				previous = now
			}
		} else if (type === 2) {
			if (!timeout) {
				timeout = setTimeout(() => {
					timeout = null
					func.apply(context, args)
				}, wait)
			}
		}
	}
}

function forMatNum(num) {
	return num < 10 ? '0' + num : num + '';
}

function initDays(year, month) {
	let totalDays = new Date(year, month, 0).getDate();
	let dates = [];
	for (let d = 1; d <= totalDays; d++) {
		dates.push(forMatNum(d));
	};
	return dates;
}

function initPicker(start, end, mode = "date", step) {
	let initstartDate = new Date(start);
	let endDate = new Date(end);
	let startYear = initstartDate.getFullYear();
	let startMonth = initstartDate.getMonth();
	let endYear = endDate.getFullYear();
	let years = [],
		months = [],
		days = [],
		hours = [],
		minutes = [],
		seconds = [];
	let totalDays = new Date(startYear, startMonth, 0).getDate();
	for (let s = startYear; s <= endYear; s++) {
		years.push(s + '');
	};
	for (let m = 1; m <= 12; m++) {
		months.push(forMatNum(m));
	};
	for (let d = 1; d <= totalDays; d++) {
		days.push(forMatNum(d));
	}
	for (let h = 0; h < 24; h++) {
		hours.push(forMatNum(h));
	}
	for (let m = 0; m < 60; m += step * 1) {
		minutes.push(forMatNum(m));
	}
	for (let s = 0; s < 60; s++) {
		seconds.push(forMatNum(s));
	}
	switch (mode) {
		case "date":
			return {
				years,
				months,
				days
			}
			break;
		case "yearMonth":
			return {
				years,
				months
			}
			break;
		case "dateTime":
			return {
				years,
				months,
				days,
				hours,
				minutes,
				seconds
			}
			break;
		case "time":
			return {
				hours,
				minutes,
				seconds
			}
			break;
	}
}

function getDate(type) {
	const date = new Date();
	let year = date.getFullYear();
	if (type === 'start') {
		year = year - 60;
	} else if (type === 'end') {
		year = year + 2;
	}
	return `${year}`;
}

function formatTime(time) {
	if (typeof time !== 'number' || time < 0) {
		return time
	}

	var hour = parseInt(time / 3600)
	time = time % 3600
	var minute = parseInt(time / 60)
	time = time % 60
	var second = time

	return ([hour, minute, second]).map(function(n) {
		n = n.toString()
		return n[1] ? n : '0' + n
	}).join(':')
}

function formatLocation(longitude, latitude) {
	if (typeof longitude === 'string' && typeof latitude === 'string') {
		longitude = parseFloat(longitude)
		latitude = parseFloat(latitude)
	}

	longitude = longitude.toFixed(2)
	latitude = latitude.toFixed(2)

	return {
		longitude: longitude.toString().split('.'),
		latitude: latitude.toString().split('.')
	}
}
var dateUtils = {
	UNITS: {
		'年': 31557600000,
		'月': 2629800000,
		'天': 86400000,
		'小时': 3600000,
		'分钟': 60000,
		'秒': 1000
	},
	humanize: function(milliseconds) {
		var humanize = '';
		for (var key in this.UNITS) {
			if (milliseconds >= this.UNITS[key]) {
				humanize = Math.floor(milliseconds / this.UNITS[key]) + key + '前';
				break;
			}
		}
		return humanize || '刚刚';
	},
	format: function(dateStr) {
		var date = this.parse(dateStr)
		var diff = Date.now() - date.getTime();
		if (diff < this.UNITS['天']) {
			return this.humanize(diff);
		}
		var _format = function(number) {
			return (number < 10 ? ('0' + number) : number);
		};
		return date.getFullYear() + '/' + _format(date.getMonth() + 1) + '/' + _format(date.getDay()) + '-' +
			_format(date.getHours()) + ':' + _format(date.getMinutes());
	},
	parse: function(str) { //将"yyyy-mm-dd HH:MM:ss"格式的字符串,转化为一个Date对象
		var a = str.split(/[^0-9]/);
		return new Date(a[0], a[1] - 1, a[2], a[3], a[4], a[5]);
	}
};

function formatDate(value, fmt) {
	let regPos = /^\d+(\.\d+)?$/;
	if (regPos.test(value)) {
		//如果是数字
		let getDate = new Date(value);
		let o = {
			'M+': getDate.getMonth() + 1,
			'd+': getDate.getDate(),
			'h+': getDate.getHours(),
			'm+': getDate.getMinutes(),
			's+': getDate.getSeconds(),
			'q+': Math.floor((getDate.getMonth() + 3) / 3),
			'S': getDate.getMilliseconds()
		};
		if (/(y+)/.test(fmt)) {
			fmt = fmt.replace(RegExp.$1, (getDate.getFullYear() + '').substr(4 - RegExp.$1.length))
		}
		for (let k in o) {
			if (new RegExp('(' + k + ')').test(fmt)) {
				fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k])
					.length)))
			}
		}
		return fmt;
	} else {
		//TODO
		value = value.trim();
		return value.substr(0, fmt.length);
	}
}
//获取当前的平台(终端类型 1 android 2 ios 3 h5 4 微信小程序 5 web)
function getPlatform() {
	//默认web
	let platform = 5;
	//#ifdef APP-PLUS || APP-NVUE
	const system = uni.getSystemInfoSync();
	if (system.platform === "ios") {
		platform = 1;
	} else {
		platform = 2;
	}
	//#endif

	//#ifdef H5
	platform = 3;
	//#endif

	//#ifdef MP-WEIXIN
	platform = 4;
	//#endif
	return platform;
};

//判断浏览器是否是微信浏览器
function checkIsWechatBrowser() {
	let platform = getPlatform();
	if (platform === 3) {
		return (
			navigator.userAgent.toLowerCase().match(/MicroMessenger/i) ==
			"micromessenger"
		);
	} else {
		return false;
	}
};
module.exports = {
	formatTime: formatTime,
	formatLocation: formatLocation,
	dateUtils: dateUtils,
	getDate: getDate,
	initPicker: initPicker,
	forMatNum: forMatNum,
	initDays: initDays,
	getPlatform: getPlatform,
	checkIsWechatBrowser: checkIsWechatBrowser,
	debounce: debounce,
	throttle: throttle,
	formatDate: formatDate
}