import Config from './config.js'
import store from '@/store/index.js'
import Http from './http.js'

export default {
	/**
	 * 页面跳转
	 * @param {string} to 跳转链接 /pages/idnex/index
	 * @param {Object} param 参数 {key : value, ...}
	 * @param {string} mode 模式 
	 */
	redirectTo(to, param, mode) {
		let url = to;
		let tabbarList = ['/pages/index/index', '/pages/goods/category', '/pages/goods/cart',
			'/pages/member/index'
		]
		if (param != undefined) {
			Object.keys(param).forEach(function(key) {
				if (url.indexOf('?') != -1) {
					url += "&" + key + "=" + param[key];
				} else {
					url += "?" + key + "=" + param[key];
				}
			});
		}
		for (let i = 0; i < tabbarList.length; i++) {
			if (url.indexOf(tabbarList[i]) == 0) {
				uni.switchTab({
					url
				})
				return;
			}
		}
		switch (mode) {
			case 'tabbar':
				// 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面。
				uni.switchTab({
					url
				})
				break;
			case 'redirectTo':
				// 关闭当前页面,跳转到应用内的某个页面。
				uni.redirectTo({
					url
				});
				break;
			case 'reLaunch':
				// 关闭所有页面,打开到应用内的某个页面。
				uni.reLaunch({
					url
				});
				break;
			default:
				// 保留当前页面,跳转到应用内的某个页面
				uni.navigateTo({
					url
				});
		}
	},
	/**
	 * 图片路径转换
	 * @param {String} img_path 图片地址
	 * @param {Object} params 参数,针对商品、相册里面的图片区分大中小,size: big、mid、small
	 */
	img(img_path, params) {
		var path = "";
		if (img_path != undefined && img_path != "") {
			if (img_path.split(',').length > 1) {
				img_path = img_path.split(',')[0];
			}
			if (params && img_path != this.getDefaultImage().goods) {
				// 过滤默认图
				let arr = img_path.split(".");
				let suffix = arr[arr.length - 1];
				arr.pop();
				arr[arr.length - 1] = arr[arr.length - 1] + "_" + params.size.toUpperCase();
				arr.push(suffix);
				img_path = arr.join(".");
			}
			if (img_path.indexOf("http://") == -1 && img_path.indexOf("https://") == -1) {
				path = Config.imgDomain + "/" + img_path;
			} else {
				path = img_path;
			}
			// 处理商品助手的图片路径
			path = path.replace("addons/NsGoodsAssist/", "").replace("shop/goods/", "");
		}
		// path += '?t=' + parseInt(new Date().getTime() / 1000);
		return path;
	},
	/**
	 * 时间戳转日期格式
	 * @param {Object} timeStamp
	 */
	timeStampTurnTime(timeStamp, type = "") {
		if (timeStamp != undefined && timeStamp != "" && timeStamp > 0) {
			var date = new Date();
			date.setTime(timeStamp * 1000);
			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 (type) {
				if (type == 'yearMonthDay') {
					return y + '年' + m + '月' + d + '日';
				}
				return y + '-' + m + '-' + d;
			} else {
				return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second;
			}

		} else {
			return "";
		}
	},
	/**
	 * 日期格式转时间戳
	 * @param {Object} timeStamp
	 */
	timeTurnTimeStamp(string) {
		var f = string.split(' ', 2);
		var d = (f[0] ? f[0] : '').split('-', 3);
		var t = (f[1] ? f[1] : '').split(':', 3);
		return (new Date(
			parseInt(d[0], 10) || null,
			(parseInt(d[1], 10) || 1) - 1,
			parseInt(d[2], 10) || null,
			parseInt(t[0], 10) || null,
			parseInt(t[1], 10) || null,
			parseInt(t[2], 10) || null
		)).getTime() / 1000;
	},
	/**
	 * 倒计时
	 * @param {Object} seconds 秒
	 */
	countDown(seconds) {
		let [day, hour, minute, second] = [0, 0, 0, 0]
		if (seconds > 0) {
			day = Math.floor(seconds / (60 * 60 * 24))
			hour = Math.floor(seconds / (60 * 60)) - (day * 24)
			minute = Math.floor(seconds / 60) - (day * 24 * 60) - (hour * 60)
			second = Math.floor(seconds) - (day * 24 * 60 * 60) - (hour * 60 * 60) - (minute * 60)
		}
		if (day < 10) {
			day = '0' + day
		}
		if (hour < 10) {
			hour = '0' + hour
		}
		if (minute < 10) {
			minute = '0' + minute
		}
		if (second < 10) {
			second = '0' + second
		}
		return {
			d: day,
			h: hour,
			i: minute,
			s: second
		};
	},
	/**
	 * 数值去重
	 * @param {Array} arr 数组
	 * @param {string} field 字段
	 */
	unique(arr, field) {
		const res = new Map();
		return arr.filter((a) => !res.has(a[field]) && res.set(a[field], 1));
	},
	/**
	 * 判断值是否在数组中
	 * @param {Object} elem
	 * @param {Object} arr
	 * @param {Object} i
	 */
	inArray: function(elem, arr) {
		return arr == null ? -1 : arr.indexOf(elem);
	},
	/**
	 * 获取某天日期
	 * @param {Object} day
	 */
	getDay: function(day) {
		var today = new Date();
		var targetday_milliseconds = today.getTime() + 1000 * 60 * 60 * 24 * day;
		today.setTime(targetday_milliseconds);

		const doHandleMonth = function(month) {
			var m = month;
			if (month.toString().length == 1) {
				m = "0" + month;
			}
			return m
		}

		var tYear = today.getFullYear();
		var tMonth = today.getMonth();
		var tDate = today.getDate();
		var tWeek = today.getDay();
		var time = parseInt(today.getTime() / 1000);
		tMonth = doHandleMonth(tMonth + 1);
		tDate = doHandleMonth(tDate);

		const week = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']
		return {
			't': time,
			'y': tYear,
			'm': tMonth,
			'd': tDate,
			'w': week[tWeek]
		};
	},

	//上传
	upload_file_server(tempFilePath, data, path, url = "", callback) {
		if (url) {
			var uploadUrl = Config.baseUrl + url
		} else {
			var uploadUrl = Config.baseUrl + '/api/upload/' + path
		}
		return new Promise((resolve, reject) => {
			uni.uploadFile({
				url: uploadUrl,
				filePath: tempFilePath,
				name: 'file',
				formData: data,
				success: function(res) {
					var path_str = JSON.parse(res.data);
					if (path_str.code >= 0) {
						resolve(path_str.data.pic_path);
						typeof callback == 'function' && callback(path_str.data.pic_path);
					} else {
						reject("error");
					}
				}
			});

		});

	},
	/**
	 * 复制
	 * @param {Object} message
	 * @param {Object} callback
	 */
	copy(value, callback) {
		// #ifdef H5
		var oInput = document.createElement('input'); //创建一个隐藏input(重要!)
		oInput.value = value; //赋值
		oInput.setAttribute("readonly", "readonly");
		document.body.appendChild(oInput);
		oInput.select(); // 选择对象
		document.execCommand("Copy"); // 执行浏览器复制命令
		oInput.className = 'oInput';
		oInput.style.display = 'none';
		uni.hideKeyboard();
		this.showToast({
			title: '复制成功'
		});

		typeof callback == 'function' && callback();
		// #endif

		// #ifdef MP || APP-PLUS
		uni.setClipboardData({
			data: value,
			success: () => {
				typeof callback == 'function' && callback();
			}
		});
		// #endif
	},

	/**
	 * 显示消息提示框
	 *  @param {Object} params 参数
	 */
	showToast(params = {}) {
		params.title = params.title || "";
		params.icon = params.icon || "none";
		// params.position = params.position || 'bottom';
		params.duration = params.duration || 1500;
		uni.showToast(params);
		if (params.success) params.success();
	},
	/**
	 * 检测苹果X以上的手机
	 */
	isIPhoneX() {
		let res = uni.getSystemInfoSync();
		if (res.model.search('iPhone X') != -1) {
			return true;
		}
		return false;
	},
	//判断安卓还是iOS
	isAndroid() {
		let platform = uni.getSystemInfoSync().platform
		if (platform == 'ios') {
			return false;
		} else if (platform == 'android') {
			return true;
		}
	},
	/**
	 * 深度拷贝对象
	 * @param {Object} obj
	 */
	deepClone(obj) {
		const isObject = function(obj) {
			return typeof obj == 'object';
		}

		if (!isObject(obj)) {
			throw new Error('obj 不是一个对象!')
		}
		//判断传进来的是对象还是数组
		let isArray = Array.isArray(obj)
		let cloneObj = isArray ? [] : {}
		//通过for...in来拷贝
		for (let key in obj) {
			cloneObj[key] = isObject(obj[key]) ? this.deepClone(obj[key]) : obj[key]
		}
		return cloneObj
	},

	/**
	 * 获取默认图
	 * @param {Object} link
	 */
	getDefaultImage() {
		let defaultImg = uni.getStorageSync('default_img');
		if (defaultImg) {
			defaultImg.goods = this.img(defaultImg.goods);
			defaultImg.head = this.img(defaultImg.head);
			defaultImg.store = this.img(defaultImg.store);
			defaultImg.article = this.img(defaultImg.article);
			return defaultImg;
		} else {
			return {
				goods: '',
				head: '',
				store: '',
				article: ''
			};
		}
	},
	/**
	 * 判断手机是否为iphoneX系列
	 */
	uniappIsIPhoneX() {
		let isIphoneX = false;
		let systemInfo = uni.getSystemInfoSync();
		// #ifdef MP
		if (systemInfo.model.search('iPhone X') != -1 || systemInfo.model.search('iPhone 11') != -1 || systemInfo.model
			.search('iPhone 12') != -1 || systemInfo.model.search('iPhone 13') != -1) {
			isIphoneX = true;
		}
		// #endif

		// #ifdef H5
		var u = navigator.userAgent;
		var isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
		if (isIOS) {
			if (systemInfo.screenWidth == 375 && systemInfo.screenHeight == 812 && systemInfo.pixelRatio == 3) {
				isIphoneX = true;
			} else if (systemInfo.screenWidth == 414 && systemInfo.screenHeight == 896 && systemInfo.pixelRatio == 3) {
				isIphoneX = true;
			} else if (systemInfo.screenWidth == 414 && systemInfo.screenHeight == 896 && systemInfo.pixelRatio == 2) {
				isIphoneX = true;
			}
		}
		// #endif
		return isIphoneX;
	},
	/**
	 * 判断手机是否为iphone11系列
	 */
	uniappIsIPhone11() {
		let isIphone11 = false;
		let systemInfo = uni.getSystemInfoSync();
		// #ifdef MP
		if (systemInfo.model.search('iPhone 11') != -1) {
			isIphone11 = true;
		}
		// #endif
		return isIphone11;
	},
	// #ifdef H5
	//判断该浏览器是否为safaria浏览器
	isSafari() {
		let res = uni.getSystemInfoSync();
		var ua = navigator.userAgent.toLowerCase();
		if (ua.indexOf('applewebkit') > -1 && ua.indexOf('mobile') > -1 && ua.indexOf('safari') > -1 &&
			ua.indexOf('linux') === -1 && ua.indexOf('android') === -1 && ua.indexOf('chrome') === -1 &&
			ua.indexOf('ios') === -1 && ua.indexOf('browser') === -1) {
			return true;
		} else {
			return false;
		}
	},
	// #endif
	numberFixed(e, f) {
		if (!f) {
			f = 0;
		}
		return Number(e).toFixed(f);
	},
	/**
	 * 获取url参数
	 */
	getUrlCode(callback) {
		var url = location.search;
		var theRequest = new Object();
		if (url.indexOf('?') != -1) {
			var str = url.substr(1);
			var strs = str.split('&');
			for (var i = 0; i < strs.length; i++) {
				theRequest[strs[i].split('=')[0]] = strs[i].split('=')[1];
			}
		}
		typeof callback == 'function' && callback(theRequest);
	},
	/**
	 * 获取当前页面路由
	 */
	getCurrRoute() {
		let routes = getCurrentPages(); // 获取当前打开过的页面路由数组
		return routes.length ? routes[routes.length - 1].route : '';
	},
	goBack(backUrl = '/pages/index/index') {
		if (getCurrentPages().length == 1) {
			this.redirectTo(backUrl);
		} else {
			uni.navigateBack();
		}
	},
	/**
	 * @param {Object} 转化时间字符串 (转化时分秒)
	 */
	getTimeStr(val) {
		var h = parseInt(val / 3600).toString();
		var m = parseInt((val % 3600) / 60).toString();
		if (m.length == 1) {
			m = '0' + m;
		}
		if (h.length == 1) {
			h = '0' + h;
		}
		return h + ':' + m;
	},
	/**
	 * 获取定位信息
	 */
	getLocation(param = {}) {
		uni.getLocation({
			type: param.type ?? 'gcj02',
			success: res => {
				store.commit('setLocation', res);
				typeof param.success == 'function' && param.success(res);
			},
			fail: res => {
				typeof param.fail == 'function' && param.fail(res);
			},
			complete: res => {
				typeof param.complete == 'function' && param.complete(res);
			}
		});
	},
	// 计算两个经纬度之间的距离
	getDistance(lat1, lng1, lat2, lng2) {
		var radLat1 = lat1 * Math.PI / 180.0;
		var radLat2 = lat2 * Math.PI / 180.0;
		var a = radLat1 - radLat2;
		var b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0;
		var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
			Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
		s = s * 6378.137; // EARTH_RADIUS;
		s = Math.round(s * 10000) / 10000;
		return s;
	},
	//记录分享人
	onSourceMember(source_member) {
		Http.sendRequest({
			url: '/api/Member/alterShareRelation',
			data: {
				share_member: source_member,
			},
			success: res => {
				if (res.code >= 0) {
					uni.removeStorage({
						key: 'source_member',
						success: res => {
							console.log('删除成功', res)
						}
					})
				}
			}
		})
	},
	/**
	 * 微信订阅消息
	 */
	subscribeMessage(string) {
		let keywords = string;
		Http.sendRequest({
			url: '/weapp/api/weapp/messagetmplids',
			data: {
				keywords: keywords
			},
			success: res => {
				if (res.data.length) {
					uni.requestSubscribeMessage({
						tmplIds: res.data,
						success: (res) => {
							console.log("res", res)
						},
						fail: (res) => {
							console.log('fail', res)
						}
					})
				}
			}
		})
	},
	/**
	 * 分享获取memberId,进行上下级绑定
	 */
	getMemberId() {
		return new Promise((resolve, reject) => {
			Http.sendRequest({
				url: "/api/member/id",
				success: res => {
					if (res.code >= 0) {
						resolve(res.data)
					} else {
						reject(res)
					}
				}
			});
		})
	},
	/**
	 * 获取小程序分享内容数据
	 */
	getMpShare(path) {
		//如果没有特别指定 则获取当前页面的路由
		if (!path) {
			let route = this.getCurrentRoute();
			path = route.path;
			if (path == '/pages/member/index') {
				return new Promise((resolve, reject) => {
					resolve({})
				});
			};
		}
		return new Promise((resolve, reject) => {
			Http.sendRequest({
				url: "/weapp/api/weapp/share",
				data: {
					path: path
				},
				success: res => {
					if (res.code >= 0) {
						let shareConfig = res.data.data;
						if (shareConfig) {
							//分享给好友
							let appMessageData = {
								title: shareConfig.title,
								path: shareConfig.path,
								imageUrl: shareConfig.imageUrl,
								success: res => {},
								fail: res => {}
							}
							//分享到朋友圈
							let query = '';
							if (shareConfig.path.indexOf('?') > 0) {
								query = shareConfig.path.split('?')[1];
							}
							let timeLineData = {
								title: shareConfig.title,
								query: shareConfig.path,
								imageUrl: shareConfig.imageUrl,
							}
							resolve({
								appMessage: appMessageData,
								timeLine: timeLineData,
							})
						} else {
							reject(res.data);
						}
					} else {
						reject(res.data)
					}
				}
			});
		})
	},

	//获取当前路由
	getCurrentRoute() {
		let currentRoutes = getCurrentPages(); // 获取当前打开过的页面路由数组
		let currentRoute = currentRoutes[currentRoutes.length - 1].route //获取当前页面路由
		let currentParam = currentRoutes[currentRoutes.length - 1].options; //获取路由参数
		// 拼接参数
		let param = [];
		for (let key in currentParam) {
			param.push(key + '=' + currentParam[key])
		}
		let currentPath = '/' + currentRoute;
		let currentQuery = param.join('&');
		if (currentQuery) currentPath += '?' + currentQuery;

		return {
			path: currentPath,
			query: currentQuery,
		}
	},
	//获取分享路由
	getCurrentShareRoute(member_id) {
		let route = this.getCurrentRoute();
		//去掉原来的分享人数据
		route.path = route.path.replace(/[?|&]source_member=\d+/, '');
		if (member_id) {
			//路径的处理
			if (route.path.indexOf('?') > 0) {
				route.path += '&';
			} else {
				route.path += '?';
			}
			route.path += 'source_member=' + member_id;
			//参数的处理
			if (route.query) {
				route.query += '&';
			}
			route.query += 'source_member=' + member_id;
		}
		return route;
	},
	/**
	 * 对象转style字符串
	 * @param {Object} obj
	 */
	objToStyle(obj) {
		let s = [];
		for (let i in obj) {
			s.push(i + ':' + obj[i]);
		}
		return s.join(';')
	},
	/**
	 * 颜色减值
	 * @param {Object} c1
	 * @param {Object} c2
	 * @param {Object} ratio
	 */
	colourBlend(c1, c2, ratio) {
		ratio = Math.max(Math.min(Number(ratio), 1), 0)
		let r1 = parseInt(c1.substring(1, 3), 16)
		let g1 = parseInt(c1.substring(3, 5), 16)
		let b1 = parseInt(c1.substring(5, 7), 16)
		let r2 = parseInt(c2.substring(1, 3), 16)
		let g2 = parseInt(c2.substring(3, 5), 16)
		let b2 = parseInt(c2.substring(5, 7), 16)
		let r = Math.round(r1 * (1 - ratio) + r2 * ratio)
		let g = Math.round(g1 * (1 - ratio) + g2 * ratio)
		let b = Math.round(b1 * (1 - ratio) + b2 * ratio)
		r = ('0' + (r || 0).toString(16)).slice(-2)
		g = ('0' + (g || 0).toString(16)).slice(-2)
		b = ('0' + (b || 0).toString(16)).slice(-2)
		return '#' + r + g + b
	},
	/**
	 * 生成贝塞尔曲线轨迹
	 * @param {Object} points
	 * @param {Object} times
	 */
	bezier(points, times) {
		var bezier_points = [];
		var points_D = [];
		var points_E = [];
		const DIST_AB = Math.sqrt(Math.pow(points[1]['x'] - points[0]['x'], 2) + Math.pow(points[1]['y'] - points[0][
			'y'
		], 2));
		// 邻控制BC点间距
		const DIST_BC = Math.sqrt(Math.pow(points[2]['x'] - points[1]['x'], 2) + Math.pow(points[2]['y'] - points[1][
			'y'
		], 2));
		// D每次在AB方向上移动的距离
		if (points[0]['x'] > points[2]['x']) {
			var EACH_MOVE_AD = -(DIST_AB / times);
			// E每次在BC方向上移动的距离
			var EACH_MOVE_BE = -(DIST_BC / times);
		} else {
			var EACH_MOVE_AD = +(DIST_AB / times);
			// E每次在BC方向上移动的距离
			var EACH_MOVE_BE = +(DIST_BC / times);
		}
		// 点AB的正切
		const TAN_AB = (points[1]['y'] - points[0]['y']) / (points[1]['x'] - points[0]['x']);
		// 点BC的正切
		const TAN_BC = (points[2]['y'] - points[1]['y']) / (points[2]['x'] - points[1]['x']);
		// 点AB的弧度值
		const RADIUS_AB = Math.atan(TAN_AB);
		// 点BC的弧度值
		const RADIUS_BC = Math.atan(TAN_BC);
		// 每次执行
		for (var i = 1; i <= times; i++) {
			// AD的距离
			var dist_AD = EACH_MOVE_AD * i;
			// BE的距离
			var dist_BE = EACH_MOVE_BE * i;
			// D点的坐标
			var point_D = {};
			point_D['x'] = dist_AD * Math.cos(RADIUS_AB) + points[0]['x'];
			point_D['y'] = dist_AD * Math.sin(RADIUS_AB) + points[0]['y'];
			points_D.push(point_D);
			// E点的坐标
			var point_E = {};
			point_E['x'] = dist_BE * Math.cos(RADIUS_BC) + points[1]['x'];
			point_E['y'] = dist_BE * Math.sin(RADIUS_BC) + points[1]['y'];
			points_E.push(point_E);
			// 此时线段DE的正切值
			var tan_DE = (point_E['y'] - point_D['y']) / (point_E['x'] - point_D['x']);
			// tan_DE的弧度值
			var radius_DE = Math.atan(tan_DE);
			// 地市DE的间距
			var dist_DE = Math.sqrt(Math.pow((point_E['x'] - point_D['x']), 2) + Math.pow((point_E['y'] - point_D['y']),
				2));
			// 此时DF的距离
			var dist_DF = (dist_AD / DIST_AB) * dist_DE;
			// 此时DF点的坐标
			var point_F = {};
			point_F['x'] = dist_DF * Math.cos(radius_DE) + point_D['x'];
			point_F['y'] = dist_DF * Math.sin(radius_DE) + point_D['y'];
			bezier_points.push(point_F);
		}
		return {
			'bezier_points': bezier_points
		};
	}
}