let systemInfo = uni.getSystemInfoSync();
/**
 * 更新小程序
 */
function updateMiniapp() {
	const updateManager = uni.getUpdateManager();

	updateManager.onCheckForUpdate(function(res) {
		// 请求完新版本信息的回调
	});

	updateManager.onUpdateReady(function(res) {
		uni.showModal({
			title: "更新提示",
			content: "新版本已经准备好，是否重启应用？",
			success(res) {
				if (res.confirm) {
					// 新的版本已经下载好，调用 applyUpdate 应用新版本并重启
					updateManager.applyUpdate();
				}
			},
		});
	});

	updateManager.onUpdateFailed(function(res) {
		// 新的版本下载失败
	});
}

/**
 * 获取AppInfo
 */

async function getAppInfo() {
	const accountInfo = await uni.getAccountInfoSync();
	const appId = await accountInfo.miniProgram.appId;
	return appId;
}

/**
 * 获取code
 */
async function getCode() {
	return new Promise((resolve, reject) => {
		uni.getProvider({
			service: "oauth",
			success: (res) => {
				//  平台来源
				uni.login({
					provider: res.provider[0],
					scopes: ["auth_base"],
					success(loginRes) {
						let code = loginRes.code;
						resolve(code);
					},
					fail(err) {
						uni.showModal({
							title: err.errMsg,
							showCancel: false,
						});
					},
					complete() {},
				});
			},
		});
	});
}

//校验手机号有效性
const checkPhoneNumber = mobile => {
	//验证手机号真实性
	if (mobile == null || mobile == undefined) {
		wx.showToast({
			title: '手机号不能为空',
			icon: 'none'
		})
		return false
	}
	// 匹配所有号码（手机卡 + 数据卡 + 上网卡）
	if (!(/^(?:\+?86)?1(?:3\d{3}|5[^4\D]\d{2}|8\d{3}|7(?:[01356789]\d{2}|4(?:0\d|1[0-2]|9\d))|9[01356789]\d{2}|6[2567]\d{2}|4(?:[14]0\d{3}|[68]\d{4}|[579]\d{2}))\d{6}$/
			.test(mobile))) {
		wx.showToast({
			title: '手机号格式错误',
			icon: 'none'
		})
		return false
	}
	return true
}

let m_checkProv = (val) => {
	var pattern = /^[1-9][0-9]/;
	var provs = {
		11: "北京",
		12: "天津",
		13: "河北",
		14: "山西",
		15: "内蒙古",
		21: "辽宁",
		22: "吉林",
		23: "黑龙江 ",
		31: "上海",
		32: "江苏",
		33: "浙江",
		34: "安徽",
		35: "福建",
		36: "江西",
		37: "山东",
		41: "河南",
		42: "湖北 ",
		43: "湖南",
		44: "广东",
		45: "广西",
		46: "海南",
		50: "重庆",
		51: "四川",
		52: "贵州",
		53: "云南",
		54: "西藏 ",
		61: "陕西",
		62: "甘肃",
		63: "青海",
		64: "宁夏",
		65: "新疆",
		71: "台湾",
		81: "香港",
		82: "澳门"
	};
	if (pattern.test(val)) {
		if (provs[val]) {
			return true;
		}
	}
	return false;
};
let m_checkDate = (val) => {
	var pattern = /^(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)$/;
	if (pattern.test(val)) {
		var year = val.substring(0, 4);
		var month = val.substring(4, 6);
		var date = val.substring(6, 8);
		var date2 = new Date(year + "-" + month + "-" + date);
		if (date2 && date2.getMonth() == (parseInt(month) - 1)) {
			return true;
		}
	}
	return false;
};
let m_checkCode = (val) => {
	var p = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
	var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
	var parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];
	var code = val.substring(17);
	if (p.test(val)) {
		var sum = 0;
		for (var i = 0; i < 17; i++) {
			sum += val[i] * factor[i];
		}
		if (parity[sum % 11] == code.toUpperCase()) {
			return true;
		}
	}
	return false;
};

function m_by_checkID(val = '') {
	if (m_checkCode(val) && val) {
		var date = val.substring(6, 14);
		if (m_checkDate(date)) {
			if (m_checkProv(val.substring(0, 2))) {
				return true;
			}
		}
	}
	return false;
};

function trim(str, pos = 'both') {
	if (pos == 'both') {
		return str.replace(/^\s+|\s+$/g, "");
	} else if (pos == "left") {
		return str.replace(/^\s*/, '');
	} else if (pos == 'right') {
		return str.replace(/(\s*$)/g, "");
	} else if (pos == 'all') {
		return str.replace(/\s+/g, "");
	} else {
		return str;
	}
}
/**
 * 样式转换
 * 对象转字符串，或者字符串转对象
 * @param {Object | String} 需要转换的目标
 * @param {String} 转换的目的，object-转为对象，string-转为字符串
 */
function addStyle(customStyle, target = 'object') {
	// 字符串转字符串，对象转对象情形，直接返回
	if (uni.$u.test.empty(customStyle) || typeof(customStyle) === 'object' && target === 'object' || target ===
		'string' &&
		typeof(customStyle) === 'string') {
		return customStyle
	}
	// 字符串转对象
	if (target === 'object') {
		// 去除字符串样式中的两端空格(中间的空格不能去掉，比如padding: 20px 0如果去掉了就错了)，空格是无用的
		customStyle = trim(customStyle)
		// 根据";"将字符串转为数组形式
		const styleArray = customStyle.split(';')
		const style = {}
		// 历遍数组，拼接成对象
		for (let i = 0; i < styleArray.length; i++) {
			// 'font-size:20px;color:red;'，如此最后字符串有";"的话，会导致styleArray最后一个元素为空字符串，这里需要过滤
			if (styleArray[i]) {
				const item = styleArray[i].split(':')
				style[trim(item[0])] = trim(item[1])
			}
		}
		return style
	}
	// 这里为对象转字符串形式
	let string = ''
	for (const i in customStyle) {
		// 驼峰转为中划线的形式，否则css内联样式，无法识别驼峰样式属性名
		const key = i.replace(/([A-Z])/g, '-$1').toLowerCase()
		string += `${key}:${customStyle[i]};`
	}
	// 去除两端空格
	return trim(string)
}

// 导航栏高度
function navbarHeight(height = '') {
	// #ifdef APP-PLUS || H5
	return height ? height : 44;
	// #endif
	// #ifdef MP
	// 小程序特别处理，让导航栏高度 = 胶囊高度 + 两倍胶囊顶部与状态栏底部的距离之差(相当于同时获得了导航栏底部与胶囊底部的距离)
	// 此方法有缺陷，暂不用(会导致少了几个px)，采用直接固定值的方式
	// return menuButtonInfo.height + (menuButtonInfo.top - this.statusBarHeight) * 2;//导航高度
	let he = systemInfo.platform == 'ios' ? 44 : 48;
	return height ? height : he;
	// #endif
}

// 导航栏高度
function navbarHeight(height = '') {
	// #ifdef APP-PLUS || H5
	return height ? height : 44;
	// #endif
	// #ifdef MP
	// 小程序特别处理，让导航栏高度 = 胶囊高度 + 两倍胶囊顶部与状态栏底部的距离之差(相当于同时获得了导航栏底部与胶囊底部的距离)
	// 此方法有缺陷，暂不用(会导致少了几个px)，采用直接固定值的方式
	// return menuButtonInfo.height + (menuButtonInfo.top - this.statusBarHeight) * 2;//导航高度
	let he = systemInfo.platform == 'ios' ? 44 : 48;
	return height ? height : he;
	// #endif
}

function getAge(identityCard) {
	var len = (identityCard + "").length;
	if (len == 0) {
		return '';
	} else {
		if ((len != 15) && (len != 18)) //身份证号码只能为15位或18位其它不合法
		{
			return '';
		}
	}
	var strBirthday = "";
	if (len == 18) //处理18位的身份证号码从号码中得到生日和性别代码
	{
		strBirthday = identityCard.substr(6, 4) + "/" + identityCard.substr(10, 2) + "/" + identityCard.substr(
			12, 2);
	}
	if (len == 15) {
		strBirthday = "19" + identityCard.substr(6, 2) + "/" + identityCard.substr(8, 2) + "/" + identityCard
			.substr(10, 2);
	}
	//时间字符串里，必须是“/”
	var birthDate = new Date(strBirthday);
	var nowDateTime = new Date();
	var age = nowDateTime.getFullYear() - birthDate.getFullYear();
	//再考虑月、天的因素;.getMonth()获取的是从0开始的，这里进行比较，不需要加1
	if (nowDateTime.getMonth() < birthDate.getMonth() || (nowDateTime.getMonth() == birthDate.getMonth() &&
			nowDateTime.getDate() < birthDate.getDate())) {
		age--;
	}
	return age;
}
module.exports = {
	getAge,
	updateMiniapp,
	getAppInfo,
	getCode,
	checkPhoneNumber,
	m_by_checkID,
	addStyle,
	navbarHeight
};
