import {
	showModelMessage
} from "./tools.js";
import * as api from "./api.js";
import config from "./config.js";

const imgPath = config.imgPath;

export const sdkKey = '1f8f159583f28dfba6eb06deb55e3b56';

export const getMap = (mapid, instance) => {
	return uni.createMapContext(mapid, {
		this: instance.proxy
	});
}
//获取当前定位
export const getLoalcation = (oMap, success, fail, nomove) => {
	uni.getLocation({
		type: 'gcj02', // 返回可以用于 wx.openLocation 的经纬度
		geocode: true,
		success(res) {
			const {
				latitude,
				longitude
			} = res;
			if (!nomove) {
				moveToLocation(oMap, longitude, latitude);
			}
			// if (markers) { //定位
			// 	const arrData = markers.value || [];
			// 	let index = arrData.findIndex((item) => {
			// 		return item.id == 0;
			// 	});
			// 	index = index == -1 ? arrData.length : index;
			// 	arrData[index] = addMarker(0, longitude, latitude, "dw.png");
			// 	markers.value = arrData;
			// }
			if (success) success({
				latitude,
				longitude
			});
		},
		fail(res) {
			if (fail) fail(res);
		}
	});
}

function test(a) {
	function b(d) {
		var e = c.requestConfig;
		wx.request({
			url: "https://restapi.amap.com/v3/geocode/regeo",
			data: {
				key: c.key,
				location: d,
				extensions: "all",
				s: e.s,
				platform: e.platform,
				appname: c.key,
				sdkversion: e.sdkversion,
				logversion: e.logversion
			},
			method: "GET",
			header: {
				"content-type": "application/json"
			},
			success: function(g) {
				if (g.data.status && "1" == g.data.status) {
					g = g.data.regeocode;
					var h = g.addressComponent,
						f = [],
						k = g.roads[0].name + "\u9644\u8fd1",
						m = d.split(",")[0],
						n = d.split(",")[1];
					if (g.pois &&
						g.pois[0]) {
						k = g.pois[0].name + "\u9644\u8fd1";
						var l = g.pois[0].location;
						l && (m = parseFloat(l.split(",")[0]), n = parseFloat(l.split(",")[1]))
					}
					h.provice && f.push(h.provice);
					h.city && f.push(h.city);
					h.district && f.push(h.district);
					h.streetNumber && h.streetNumber.street && h.streetNumber.number ? (f.push(h
						.streetNumber.street), f.push(h.streetNumber.number)) : f.push(g.roads[0].name);
					f = f.join("");
					a.success([{
						iconPath: a.iconPath,
						width: a.iconWidth,
						height: a.iconHeight,
						name: f,
						desc: k,
						longitude: m,
						latitude: n,
						id: 0,
						regeocodeData: g
					}])
				} else a.fail({
					errCode: g.data.infocode,
					errMsg: g.data.info
				})
			},
			fail: function(g) {
				a.fail({
					errCode: "0",
					errMsg: g.errMsg || ""
				})
			}
		})
	}
	var c = this;
	a.location ? b(a.location) : c.getWxLocation(a, function(d) {
		b(d)
	})
};

//逆解析地址
export const reverseGeocoder = (mapsdk, longitude, latitude, success, fail) => {
	
	mapsdk.getRegeo({
		location:`${longitude},${latitude}`,
		success: function(res) {
			const {
				name,
				regeocodeData
			} = res[0];
			const {
				addressComponent: {
					adcode,
					province,
					city,
					district
				},
				formatted_address
			} = regeocodeData
			if (success) success({
				name,
				formatted_address,
				adcode,
				province,
				city,
				district
			});
		},
		fail: function(info) {
			if (fail) fail(res);
		}
	})
	// mapsdk.reverseGeocoder({
	// 	location: {
	// 		latitude: latitude,
	// 		longitude: longitude
	// 	},
	// 	success: (res) => {
	// 		if (success) success(res.result);
	// 	},
	// 	fail: (res) => {
	// 		if (fail) fail(res);
	// 	}
	// })
}

//添加点
export const addMarker = (id, longitude, latitude, icon) => {
	return {
		id: id,
		latitude,
		longitude,
		width: 40,
		height: 40,
		zIndex: "100",
		iconPath: imgPath + "static/map/" + icon
	}
}

//添加线
export const addLine = (scolor, arrPoint) => {
	// let scolor = "";
	// switch (lx) {
	// 	case "add":
	// 		scolor = "#e50413";
	// 		break;
	// 	case "edit":
	// 		scolor = "#e58b04";
	// 		break;
	// 	default:
	// 		scolor = "#0473e5";
	// 		break
	// }
	return {
		points: arrPoint,
		color: scolor,
		width: 4
	}
}

//添加面
export const addPolygon = (scolor, fcolor, arrPolygonsPoits) => {
	/* let scolor = "",
		fcolor = "";
	switch (lx) {
		case "add":
			scolor = "#e50413";
			fcolor = "#f79bac73";
			break;
		case "edit":
			scolor = "#e58b04";
			fcolor = "#e58b0440";
			break;
		default:
			scolor = "#0473e5";
			fcolor = "#0473e540";
			break
	} */
	return {
		points: arrPolygonsPoits,
		fillColor: fcolor,
		strokeWidth: 3,
		strokeColor: scolor,
		zIndex: 11
	}
}

//添加圆
export const addCirle = (scolor, fcolor, longitude, latitude, radius) => {
	/* let scolor = "",
		fcolor = "";
	switch (lx) {
		case "add":
			scolor = "#e50413";
			fcolor = "#f79bac73";
			break;
		case "edit":
			scolor = "#e58b04";
			fcolor = "#e58b0440";
			break;
		default:
			scolor = "#0473e5";
			fcolor = "#0473e540";
			break
	} */
	return {
		latitude,
		longitude,
		radius,
		color: scolor,
		fillColor: fcolor,
		strokeWidth: 3
	}
}

//绘制多边形
export const drawPolygons = (obj, e) => {
	/* const {
		detail: {
			latitude,
			longitude
		}
	} = e;
	let {
		markers,
		polylines,
		polygons,
		arrPolygonsPoits,
		datacicle,
		circles
	} = obj
	if (datacicle) { //移除圆
		obj.datacicle = null;
		obj.circles.splice(circles.length - 1, 1);
	}
	const len = arrPolygonsPoits.length;
	arrPolygonsPoits.push({
		latitude,
		longitude
	});
	switch (len) {
		case 0:
			const marker = addMarker("add", 10000, latitude, longitude);
			markers.push(marker);
			break;
		case 1:
			polylines.push(addLine("add", arrPolygonsPoits));
			break;
		case 2:
			obj.polylines = [];
			polygons.push(addPolygon("add", arrPolygonsPoits));
			break;
		default:
			polygons[polygons.length - 1] = addPolygon("add", arrPolygonsPoits);
			console.log("333333333333", JSON.stringify(arrPolygonsPoits));
			break;
	} */
}

//移至中心点
export const moveToLocation = (oMap, longitude, latitude) => {
	const point = {
		latitude,
		longitude
	}
	oMap.moveToLocation(point);
}

//运营区
export function getOperation(zoneId, callback) {
	const params = {
		zoneId
	}
	api.callOperateApi("ebikeRegion/getOperation", params, "get").then((res) => {
		const {
			code,
			message,
			data
		} = res;
		if (code != 200) {
			showModelMessage(message);
			if (callback) callback(null);
			return;
		}
		const arrCircles = [];
		const arrPolygons = [];
		const arrRegionID = [];
		const arrCirclesData = [];
		const arrPolygonsData = [];
		data.map((item, index) => {
			const {
				shapeType,
				operationRegionId: regionId,
				radius,
				points
			} = item;
			if (!points) {
				console.log("getOperation坐标点未返回");
				return;
			}
			arrRegionID.push(regionId);
			const scolor = "#578FD4";
			const fcolor = "#c0daf54d";
			if (shapeType == 1) {
				const {
					longitude: lng,
					latitude: lat
				} = points[0];
				arrCirclesData.push(item);
				arrCircles.push(addCirle(scolor, fcolor, lng, lat, radius));
			} else if (shapeType == 2) {
				const arrPoint = points.map(p => {
					return {
						longitude: p.longitude,
						latitude: p.latitude
					}
				})
				arrPolygonsData.push(item);
				arrPolygons.push(addPolygon(scolor, fcolor, arrPoint));
			}

		});

		if (callback) {
			const resData = {
				arrRegionID,
				arrCircles,
				arrPolygons,
				arrData: data,
				arrCirclesData,
				arrPolygonsData
			}
			callback(resData);
		}

	})
};

//站点、停车区
export function getRegionData(arrRegionID, callback) {
	if (!arrRegionID || arrRegionID.length == 0) return;
	const arrMethods = [];
	arrRegionID.map(regionId => {
		const params = {
			regionId
		};
		arrMethods.push(api.callOperateApi("ebikeRegion/getRegion", params, "get"));
	});

	Promise.all(arrMethods).then(res => {
		const arrCircles = [];
		const arrPolygons = [];
		const arrData = [];
		const arrCirclesData = [];
		const arrPolygonsData = [];
		res.map(item => {
			const {
				code,
				message,
				data: arrRegion
			} = item;
			if (code != 200) return;
			arrRegion.map(data => {
				const {
					regionId,
					shapeType,
					radius,
					points
				} = data;
				arrData.push(data);
				const scolor = "#58d4c0";
				const fcolor = "#c1f5f138";
				if (shapeType == 1) {
					const {
						longitude: lng,
						latitude: lat
					} = points[0];
					arrCircles.push(addCirle(scolor, fcolor, lng, lat, radius));
					arrCirclesData.push(data);
				} else if (shapeType == 2) {
					if (!points) return;
					const arrPoint = points.map(p => {
						return {
							longitude: p.longitude,
							latitude: p.latitude
						}
					})
					arrPolygons.push(addPolygon(scolor, fcolor, arrPoint));
					arrPolygonsData.push(data);
				}
			})
		})
		if (callback) callback({
			arrData,
			arrCircles,
			arrPolygons,
			arrCirclesData,
			arrPolygonsData
		});
	})
}

//获取车辆数据
export const getBikeData = (arrRegionID, callback) => {
	if (!arrRegionID || arrRegionID.length == 0) return;
	const arrMethods = [];
	arrRegionID.map(regionId => {
		const params = {
			regionId
		};
		arrMethods.push(api.callOperateApi("ebikeRegion/getOperationBike", params, "get"));
	});
	Promise.all(arrMethods).then(arrRes => {
		const arrPoints = [];
		const arrData = [];
		let icnt = 0;
		let icnt_0 = 0;
		let icnt_2 = 0;
		arrRes.map(res => {
			const {
				code,
				message,
				data
			} = res;
			if (code != 200) {
				showModelMessage(message);
			} else {
				if (data.length > 0) arrData.push(...data);
				data.map(item => {
					item = {
						...item,
						soc: item.soc || 0
					}
					const {
						bikeId,
						longitude,
						latitude,
						state,
						soc
					} = item;
					const id = arrPoints.length;
					if (soc <= 20) {
						icnt_0++;
					} else if (soc <= 60) {
						icnt_2++;
					} else {
						icnt++;
					}
					arrPoints.push(addMarker_Q(id, item));
				})
			}
		});
		callback({
			arrData,
			arrPoints,
			icnt,
			icnt_0,
			icnt_2
		});
	})
}

//电量车辆点
export function addMarker_Q(id, data) {
	let {
		longitude,
		latitude,
		soc
	} = data;
	let icon = "bike_1.png";
	let clusterId = 1;
	if (soc <= 20) {
		icon = "bike_0.png";
		clusterId = 0;
	} else if (soc <= 60) {
		icon = "bike_2.png";
		clusterId = 2;
	}
	const systemInfo = uni.getSystemInfoSync();

	let oLabel = {
		content: soc + "%",
		color: "#FFF",
		anchorY: -25,
		fontSize: 9,
		textAlign: "center",
	};
	// 判断设备类型（iOS/Android）
	if (systemInfo.platform === 'android') {
		oLabel = {
			...oLabel,
			anchorX: -6
		}
	}
	return {
		id: id,
		latitude,
		longitude,
		width: 30,
		height: 30,
		iconPath: imgPath + "static/map/" + icon,
		joinCluster: true,
		label: oLabel
	}
}


//导航
export function direction({
	mapsdk,
	slng,
	slat,
	elng,
	elat,
	success,
	fail
}) {
	const options = {
		origin: `${slng},${slat}`,
		destination: `${elng},${elat}`,
		success: (res) => {
			let points = [];
			let distance = 0;
			if (res.paths && res.paths[0] && res.paths[0].steps) {
				let steps = res.paths[0].steps;
				distance = res.paths[0].distance;
				for (let i = 0; i < steps.length; i++) {
					let poLen = steps[i].polyline.split(';');
					for (let j = 0; j < poLen.length; j++) {
						points.push({
							longitude: parseFloat(poLen[j].split(',')[0]),
							latitude: parseFloat(poLen[j].split(',')[1])
						})
					}
				}
			}
			const cnt = (distance / 1000).toFixed(2);
			let sdistance = distance + "m";
			if (cnt >= 1) {
				sdistance = cnt + "km";
			}
			const data = {
				arrPoint: points,
				distance: sdistance
			}
			if (success) success(data);
		},
		fail: (res) => {
			if (fail) fail(res);
		}
	}
	mapsdk.getDrivingRoute(options)
	// const options = {
	// 	from: {
	// 		longitude: slng,
	// 		latitude: slat
	// 	},
	// 	to: {
	// 		longitude: elng,
	// 		latitude: elat
	// 	},
	// 	success: (res) => {
	// 		const {
	// 			polyline,
	// 			distance
	// 		} = res.result.routes[0];
	// 		let coors = polyline;
	// 		for (let i = 2; i < coors.length; i++) {
	// 			coors[i] = coors[i - 2] + coors[i] / 1000000
	// 		}
	// 		let arrPoint = [];
	// 		for (let i = 0; i < coors.length; i += 2) {
	// 			arrPoint.push({
	// 				latitude: coors[i],
	// 				longitude: coors[i + 1]
	// 			})
	// 		}
	// 		const cnt = (distance / 1000).toFixed(2);
	// 		let sdistance = distance + "m";
	// 		if (cnt >= 1) {
	// 			sdistance = cnt + "km";
	// 		}
	// 		const data = {
	// 			arrPoint,
	// 			distance: sdistance
	// 		}

	// 		if (success) success(data);
	// 	},
	// 	fail: (res) => {
	// 		fail(res);
	// 	}
	// }
	// mapsdk.direction(options);
}


// 判断点是否在多边形内（射线法）
export function checkPointInPolygon(longitude, latitude, polygon) {
	let x = longitude,
		y = latitude;
	let inside = false;
	for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
		const xi = polygon[i].longitude,
			yi = polygon[i].latitude;
		const xj = polygon[j].longitude,
			yj = polygon[j].latitude;

		// 检测边是否跨过射线
		const intersect = ((yi > y) !== (yj > y)) &&
			(x < (xj - xi) * (y - yi) / (yj - yi) + xi);
		if (intersect) inside = !inside;
	}
	return inside;
}

// 判断点(x,y)是否在圆心(cx,cy)半径r的圆内
export function isPointInCircle(longitude, latitude, center, radius) {
	const dx = longitude - center.lng; // 经度差
	const dy = latitude - center.lat; // 纬度差
	const distance = Math.sqrt(dx * dx + dy * dy);
	return distance <= radius;
}