const extend = function extend(target) {
	var sources = Array.prototype.slice.call(arguments, 1)

	for (var i = 0; i < sources.length; i += 1) {
		var source = sources[i]
		for (var key in source) {
			if (source.hasOwnProperty(key)) {
				target[key] = source[key]
			}
		}
	}

	return target
}

/**
 * 获取当前时间戳
 */
const getTimestamp = (date) => {
	date = date || new Date()
	return Math.round(date / 1000)
}

/**
 * 保留指定小数位
 */
const toDecimal = (float, num) => {
	if (typeof float !== 'number') float = parseFloat(float)
	return parseFloat(float.toFixed(num))
}

/**
 * 时间戳转 yyyy-MM-dd hh:mm
 */
export function formatDate(timestamp, format) {
	const date = timestamp ? new Date(timestamp * 1000) : new Date();
	const data = {
		'M+': date.getMonth() + 1,
		'd+': date.getDate(),
		'h+': date.getHours(),
		'm+': date.getMinutes(),
		's+': date.getSeconds(),
		'q+': Math.floor((date.getMonth() + 3) / 3),
		'S+': date.getMilliseconds()
	}
	if (/(y+)/i.test(format)) {
		format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
	}
	for (var key in data) {
		if (new RegExp('(' + key + ')').test(format)) {
			format = format.replace(RegExp.$1, RegExp.$1.length == 1 ?
				data[key] : ('00' + data[key]).substr(('' + data[key]).length))
		}
	}

	return format
}

/**
 * 分钟、小时、天前的处理
 */
const timeAgo = function(timestamp, format) {
	const minute = 1000 * 60 // 把分，时，天，周，半个月，一个月用毫秒表示
	const hour = minute * 60
	const day = hour * 24
	const now = new Date().getTime() // 获取当前时间毫秒
	const spreadTime = now - timestamp * 1000 // 时间差
	if (spreadTime < 0) {
		return
	}


	const minC = spreadTime / minute
	const hourC = spreadTime / hour
	const dayC = spreadTime / day
	let result

	if (spreadTime >= 0 && spreadTime <= minute) {
		result = '刚刚'
	} else if (minC >= 1 && minC <= 59) {
		result = parseInt(minC) + '分钟前'
	} else if (hourC >= 1 && hourC <= 23) {
		result = parseInt(hourC) + '小时前'
	} else if (dayC >= 1 && dayC < 3) {
		result = parseInt(dayC) + '天前'
	} else if (dayC >= 3 && dayC <= 7) {
		result = '3天前'
	} else {
		result = formatDate(timestamp, format)
	}

	return result
}

/**
 * param 将要转为URL参数字符串的对象
 * key URL参数字符串的前缀 
 * encode true/false 是否进行URL编码,默认为true
 *
 * return URL参数字符串
 */
const urlEncode = (param, key, encode) => {
	if (param == null) return ''
	const t = typeof(param)
	let paramStr = ''
	if (t === 'string' || t === 'number' || t === 'boolean') {
		paramStr += '&' + key + '=' + ((encode == null || encode) ? encodeURIComponent(param) : param)
	} else {
		for (let i in param) {
			let k = key == null ? i : key + (param instanceof Array ? '[' + i + ']' : '[' + i + ']')
			paramStr += urlEncode(param[i], k, encode)
		}
	}

	return paramStr
}

/**
 * return
 */
const urlDecode = (query) => {
	if (!query) return null
	let hash, object = {}
	const hashes = query.slice(query.indexOf('?') + 1).split('&')
	for (let i = 0; i < hashes.length; i++) {
		hash = hashes[i].split('=')
		object[hash[0]] = hash[1]
	}

	return object;
}

/**
 * 对象合并
 */
const deepAssign = (origin, source) => {
	for (let key in source) {
		if (source.hasOwnProperty(key)) {
			if (source[key] instanceof Object) {
				deepAssign(origin[key], source[key])
			} else {
				origin[key] = source[key]
			}
		}
	}
}

/**
 * 状态数据
 */
const display = {
	toast: false, // 无用
	modal: false,
	loading: false,
}

// 显示消息提示
const showToast = function(text, icon) {
	wx.showToast({
		title: text || '加载中',
		icon: icon || 'none',
		mask: true,
		duration: 2000
	})
}

// 隐藏消息提示
const hideToast = function() {
	wx.hideToast()
}

// 显示 loading
const showLoading = function(text) {
	if (!display.loading) {
		display.loading = true
		wx.showLoading({
			title: text || '加载中',
			mask: true
		})
	}
}

// 隐藏 loading
const hideLoading = function() {
	if (display.loading) {
		display.loading = false
		wx.hideLoading()
	}
}

// 显示失败提示
const showModal = (title, content) => {
	if (display.toast) hideToast()
	if (display.loading) hideLoading()

	if (!display.modal) {
		title = title || '信息提示'
		content = content || '未知错误' // content 为 null 时会报错
		display.modal = true
		wx.showModal({
			title,
			content: typeof content === 'object' ? JSON.stringify(content) : content,
			showCancel: false,
			confirmColor: '#3B99FC',
			complete: function(e) {
				display.modal = false
			}
		})
	}
}

export function buildPageUrl(page, options) {
	let pageUrl = page;
	if (options) {
		let params = urlEncode(options)
		pageUrl += '?' + params.substring(1, params.length);
	}

	return pageUrl;
}

export function encodeRedirectUrl(page, options) {
	return encodeURIComponent(buildPageUrl(page, options));
}

export function decodeRedirectUrl(url) {
	return decodeURIComponent(url);
}

/**
 * 处理富文本里的图片宽度自适应
 * 1.去掉img标签里的style、width、height属性
 * 2.img标签添加style属性：max-width:100%;height:auto
 * 3.修改所有style里的width属性为max-width:100%
 * 4.去掉<br/>标签
 * 
 * @param html
 * @returns {void|string|*}
 */
export function formatRichText(html) {
	let newContent = html.replace(/<img[^>]*>/gi, function(match, capture) {
		match = match.replace(/style="[^"]+"/gi, '').replace(/style='[^']+'/gi, '');
		match = match.replace(/width="[^"]+"/gi, '').replace(/width='[^']+'/gi, '');
		match = match.replace(/height="[^"]+"/gi, '').replace(/height='[^']+'/gi, '');
		return match;
	});
	newContent = newContent.replace(/style="[^"]+"/gi, function(match, capture) {
		match = match.replace(/width:[^;]+;/gi, 'max-width:100%;').replace(/width:[^;]+;/gi, 'max-width:100%;');
		return match;
	});
	newContent = newContent.replace(/<br[^>]*\/>/gi, '');
	newContent = newContent.replace(/\<img/gi, '<img style="max-width:100%;height:auto;display:block;margin:10px 0;"');
	return newContent;
}

function strlen(value) {
	//中文、中文标点、全角字符按1长度，英文、英文符号、数字按0.5长度计算
	let cnReg = /([\u4e00-\u9fa5]|[\u3000-\u303F]|[\uFF00-\uFF60])/g;
	let mat = value.match(cnReg);
	let length = 0;
	if (mat) {
		return (length = mat.length + (value.length - mat.length) * 0.5);
	} else {
		return (length = value.length * 0.5);
	}
}

/**
 *
 *  判断是否在微信浏览器 true是
 */
function isWeiXinBrowser() {
	// #ifdef H5
	let ua = window.navigator.userAgent.toLowerCase()
	if (ua.match(/MicroMessenger/i) == 'micromessenger') {
		return true
	} else {
		return false
	}
	// #endif
	return false
}


/**
 * 获取url参数
 * @param {*} name
 * @param {*}
 * @returns
 */
function getQueryString(name, url) {
	var url = url || window.location.href
	var reg = new RegExp('(^|&|/?)' + name + '=([^&|/?]*)(&|/?|$)', 'i')
	var r = url.substr(1).match(reg)
	if (r != null) {
		return r[2]
	}
	return null
}

//路径转化
function getPath(path) {
	return path ? path.split('?').shift() : path;
}

//复制内容
function uniCopy({
	content,
	success,
	error
}) {

	content = typeof content === 'string' ? content : content.toString() // 复制内容，必须字符串，数字需要转换为字符串

	/**
	 * 小程序端 和 app端的复制逻辑
	 */
	//#ifndef H5
	uni.setClipboardData({
		data: content,
		success: function() {
			success("复制成功~")
		},
		fail: function() {
			error("复制失败~")
		}
	});
	//#endif

	/**
	 * H5端的复制逻辑
	 */
	// #ifdef H5
	if (!document.queryCommandSupported('copy')) { //为了兼容有些浏览器 queryCommandSupported 的判断
		// 不支持
		error('浏览器不支持')
	}
	let textarea = document.createElement("textarea")
	textarea.value = content
	textarea.readOnly = "readOnly"
	document.body.appendChild(textarea)
	textarea.select() // 选择对象
	textarea.setSelectionRange(0, content.length) //核心
	let result = document.execCommand("copy") // 执行浏览器复制命令
	if (result) {
		success("复制成功~")
	} else {
		error("复制失败，请检查h5中调用该方法的方式，是不是用户点击的方式调用的，如果不是请改为用户点击的方式触发该方法，因为h5中安全性，不能js直接调用！")
	}
	textarea.remove()
	// #endif
}


//设置缓存
function setDb(name, value, db_time = 7200) {
	let time = (new Date()).getTime();
	let data = {
		value: value,
		time: time,
		db_time: db_time
	}
	uni.setStorageSync(name, data);
}
//获取缓存
function getDb(name) {
	try {
		let res = uni.getStorageSync(name);
		if (!res) {
			return '';
		}
		let time = (new Date()).getTime();
		if ((time - res.time) / 1000 >= res.db_time) {
			uni.removeStorageSync(name);
			return '';
		}
		return res.value;
	} catch (e) {
		//TODO handle the exception
		return '';
	}
}

/**
 * 下载图片
 */
function getCachedImage(image_url) {
	return new Promise((resolve, reject) => {
		let arr = image_url.split('/');
		let image_name = arr[arr.length - 1];
		var u = getDb('cms' + image_name);
		if (u) {
			resolve(u);
		} else {
			// 本地没有缓存 需要下载
			uni.downloadFile({
				url: image_url,
				success: res => {
					if (res.statusCode === 200) {
						uni.saveFile({
							tempFilePath: res.tempFilePath,
							success: function(res) {
								setDb('cms' + image_name, res.savedFilePath)
								resolve(res.savedFilePath);
							}
						});
					} else {
						reject('下载失败');
					}
				},
				fail: function() {
					reject('下载失败');
				}
			});
		}
	});
}
/**
 * 重设tabbar
 * @param {Object} tablist
 */
function setTabbar(tablist) {
	tablist.list.forEach((item, index) => {
		uni.setTabBarItem({
			index: index,
			text: item.text,
			iconPath: item.image,
			selectedIconPath: item.selectedImage,
			pagePath: item.path
		})
	})
	uni.setTabBarStyle({
		color: tablist.color,
		selectedColor: tablist.selectColor,
		backgroundColor: tablist.bgColor,
		borderStyle: 'black'
	})
}


export default {
	extend,
	toDecimal,
	getTimestamp,
	formatDate,
	timeAgo,
	urlEncode,
	urlDecode,
	deepAssign,
	showToast,
	hideToast,
	showLoading,
	hideLoading,
	showModal,
	formatRichText,
	strlen,
	isWeiXinBrowser,
	getQueryString,
	getPath,
	uniCopy,
	setDb,
	getDb,
	getCachedImage,
	setTabbar
}