<template>
	<view class="map-box">
		<search ref="searchRef" @handleSearch="handleSearch" v-if="showMap" />

		<tiandituMap ref="tiandituMapRefs" @handleSearch="$refs.searchRef.onSearchFocus()" @clickMap="handleClickMap"
			@moveMap="moveMapSearch" @onLoadTianDiTu="initMaps" @onSelect="selectPoint" :apiKey="apiKey"
			@handleMapSite="handleMapSite">
		</tiandituMap>


		<Touchbox ref="TouchboxRef" :maxHeight="0.8" v-if="showMap && siteListArr && siteListArr.length > 0"
			:zIndex="1001" @currentHeight="e => TouchHeight = e">
			<scroll-view :style="{'height':TouchHeight - 15  +'px' }" scroll-y="true" :show-scrollbar="false">
				<template v-for="item in siteListArr">
					<siteListModel :info="item" @checkSiteDetails="checkSiteDetails" />
				</template>
			</scroll-view>
		</Touchbox>

		<siteDetails ref="siteDetailsRef" />
	</view>
</template>
<script>
	import tools from '@/components/tiandituMap/tools.js'
	import search from "./model/search.vue"
	import siteListModel from "./model/siteList.vue";
	import { getMapCenterPoint_Api, getMapList_Api } from "@/api/map.js"
	import siteDetails from "./model/siteDetails.vue"
	import $config from "@/config/index.js"
	import { EventBus } from "@/utils/vueBus.js"
	import { getLocation } from "@/utils/tool.js"
	export default {
		name: 'tdtmap',
		components: {
			search,
			siteListModel,
			siteDetails
		},
		data() {
			return {
				searchDot: false,
				showMap: false,
				longitude: undefined,
				latitude: undefined,
				apiKey: $config.tianKey,
				winWidth: 0,
				winHeight: 0,
				winTop: 0,
				datalist: [],
				startY: 0,
				selectItem: {},
				iStatusBarHeight: 0,


				siteListArr: [],
				TouchHeight: 0,
			}
		},
		created() {
			getLocation();

			this.getMapCenterPoint()
		},
		mounted() {
			this.disableScroll()
		},
		beforeDestroy() {
			try {
				document.removeEventListener('touchmove');
				document.body.removeEventListener('mousewheel');
				document.body.removeEventListener('DOMMouseScroll');
				document.removeEventListener('onmousewheel', function() {
					window.event.returnValue = false;
				});
			} catch (error) {
				//TODO handle the exception
			}
		},
		watch: {
			siteListArr: {
				handler(newArr) {
					try {
						this.$refs.tiandituMapRefs.clearIcon().then(res => {
							this.$nextTick(() => {
								(newArr || []).forEach((el, index) => {
									const { longitude, latitude, mapTypeIcon } = el
									this.$refs.tiandituMapRefs.setIcon(longitude, latitude, false,
										mapTypeIcon,
										el);
									if (index === 0 && this.searchDot) {
										this.$refs.tiandituMapRefs.Trenderjs.SelectedDot(el, true)
									}
								})


							})
						});
					} catch (error) {}

				},
				deep: true
			}
		},
		methods: {
			disableScroll() {
				if (typeof window.addEventListener === 'function') {
					document.addEventListener('touchmove', function(e) {
						e.preventDefault();
					}, { passive: false });
					document.body.addEventListener('mousewheel', function(e) {
						e.preventDefault();
					});
					document.body.addEventListener('DOMMouseScroll', function(e) {
						e.preventDefault();
					});
				} else {
					document.attachEvent('onmousewheel', function() {
						window.event.returnValue = false;
					});
				}
			},
			// 点击地图
			handleClickMap() {
				if (this.$refs.TouchboxRef) {
					this.$refs.TouchboxRef.concealList()
				}
			},
			// 点击地图标注点位
			handleMapSite(parmas = {}) {
				const { Lng, Lat } = parmas;
				const item = (this.siteListArr || []).find(el => el.longitude == Lng && el.latitude == Lat);
				this.checkSiteDetails(item)
			},
			// 查看点位详情
			checkSiteDetails(info) {
				if (info) {
					this.$refs.tiandituMapRefs.Trenderjs.SelectedDot(info, true)
					// EventBus.$emit('TianDiTuSite', info)
					this.handleClickMap();
					this.$refs.siteDetailsRef.openDetails(info)
				}
			},
			// 获取地图中心点
			getMapCenterPoint() {
				uni.showLoading()
				this.showMap = false;
				getMapCenterPoint_Api().then(res => {
					const { longitude, latitude, mapTypeIcon } = res || {};
					this.longitude = longitude;
					this.latitude = latitude;
					this.open(longitude, latitude, mapTypeIcon);
				}).catch(err => { this.open(null, null) }).finally(() => {
					uni.hideLoading()
				})
			},
			moveMapSearch(parms) {
				const { Lng, Lat } = parms;
				this.longitude = Lng;
				this.latitude = Lat;
				this.$refs.searchRef.onSearchFocus()
				// console.log("moveMapSearch", Lng, Lat)
			},
			handleSearch(val = {}) {
				const parms = {
					...val,
					longitude: this.longitude,
					latitude: this.latitude,
					radius: 5000
				};
				// 判断是否通过收索
				this.searchDot = parms.search
				// 如果存在收索条件，则去掉 范围 和 中心点
				if (parms.locationName || parms.mapTypeId || parms.areaCode) {
					delete parms.radius
					delete parms.latitude
					delete parms.longitude
				}
				delete parms.search
				console.log('parms  ', parms)
				getMapList_Api(parms).then(res => {
					if (!res || res.length === 0) {
						uni.showToast({
							title: "当前区域无办理点位",
							icon: 'none'
						})
					}
					this.siteListArr = res || [];
				}).catch(err => {
					this.siteListArr = [];
				}).finally(() => {
					clearTimeout(this.SearchTimeout)
					this.SearchTimeout = null;
				})
			},
			// //普通搜索
			// handleSearch(val = {}) {
			// 	const parms = {
			// 		...val,
			// 		longitude: this.longitude,
			// 		latitude: this.latitude,
			// 		radius: 5000
			// 	};
			// 	getMapList_Api(parms).then(res => {
			// 		if (!res || res.length === 0) {
			// 			uni.showToast({
			// 				title: "当前区域无办理点位",
			// 				icon: 'none'
			// 			})
			// 		}
			// 		this.siteListArr = res || [];
			// 	}).catch(err => {
			// 		this.siteListArr = [];
			// 	})
			// },
			open(lon, lat, mapTypeIcon) {
				if (lon && lat) {
					this.$nextTick(() => {
						this.$refs.tiandituMapRefs.initCharts(lon, lat, mapTypeIcon)
						this.showMap = true;
					})
				} else {
					uni.showModal({
						title: '提示',
						content: '地图中心点获取错误，请联系管理员！',
						success: res => {
							// console.log("showModal == ", res)
							if (res.confirm) {}
						}
					})
				}

			},
			close() {
				this.visible = false
			},
			onConfirm() {
				if (Object.keys(this.selectItem).length) {
					this.visible = false
					this.$emit('onSelect', this.selectItem)
				} else {
					tools.createMessage('请选择位置')
				}
			},
			upDateLonLat(lon, lat) {
				if (lon && lat) {
					this.$refs.tiandituMapRefs.upDataCharts(lon, lat)
				} else {
					console.error('请传入lon, lat')
				}
			},
			tianidtuSearch(value) {
				if (value.city) {
					this.cityInfoSearch(value)
				} else {
					this.infoSearch(value)
				}
			},
			async infoSearch(value) { // 地理编码查询
				let params = {
					ds: {
						"keyWord": value.keyword,
					},
					tk: this.apiKey,
				}
				let resData = await tools.createRequest('https://api.tianditu.gov.cn/geocoder', params, true)
				if (resData.status === '0') {
					const location = resData.location
					const formateOne = tools.formatterAdressLocation(resData, 3)
					this.datalist = [formateOne]
					this.selectItem = datalist
					this.$refs.tiandituMapRefs.upDataCharts(location.lon, location.lat)
				}
			},
			async cityInfoSearch(value) { // 地名搜索2.0
				let params = {
					postStr: {
						"keyWord": value.keyword,
						"queryType": 12,
						"start": 0,
						"count": 10,
						"specify": value.city.value
					},
					type: 'query',
					tk: this.apiKey,
				}
				let resData = await tools.createRequest('https://api.tianditu.gov.cn/v2/search', params, true)
				if (resData.status.infocode === 1000) {
					const {
						pois: aPoints,
						count
					} = resData
					if (count === '0' || !aPoints || !aPoints.length) {
						return tools.createMessage('没有找到该地址')
					}
					const {
						pois,
						keyWord,
						lonlat
					} = aPoints[0]
					const formateData = aPoints.map((item) => tools.formatterAdressLocation(item, 2))
					this.datalist = formateData
					this.selectItem = formateData[0]
					const [lon, lat] = lonlat.split(',')
					this.$refs.tiandituMapRefs.upDataCharts(lon, lat)
				} else {
					tools.createMessage('数据异常', 1000, false, 'error')
				}
			},
			selectListItem(item) {
				this.$refs.tiandituMapRefs.upDataCharts(item.location.lon, item.location.lat)
			},
			selectPoint(e) {
				this.domMinHeight = '0vh'
				this.datalist = [e]
				this.selectItem = e
			},
			initMaps() {
				console.warn('--------天地图加载完成--------');
				this.$emit('onLoad')
			},
			// start(e) {
			// 	const clientY = e.changedTouches[0].clientY
			// 	this.startY = clientY
			// },
			// end(e) {
			// 	const transformY = e.changedTouches[0].clientY - this.startY;
			// 	switch (true) {
			// 		case transformY > 50:
			// 			console.log('下划')
			// 			this.domMaxHeight = '20vh'
			// 			this.domMinHeight = '0vh'
			// 			break;
			// 		case transformY < -50:
			// 			console.log('上划')
			// 			this.domMaxHeight = '50vh'
			// 			this.domMinHeight = '50vh'
			// 			break;
			// 		default:
			// 			break;
			// 	}

			// },
			selectCard(item) {
				this.domMaxHeight = '20vh'
				this.domMinHeight = '0vh'
				this.selectItem = item
				this.selectListItem(item)
			},



			setTouchHeight(val) {
				// console.log('setScrollHeight = ', val)
				// 实时返回的滑动组件高度
				this.TouchHeight = val;
			},
			setScrollMaxHeight(val) {
				//最大高度
				this.scrollMaxHeight = val;
			},


		}
	}
</script>



<style scope>
	.map-box {
		width: 100vw;
		height: 100vh;
		/* 		position: fixed;
		left: 0;
		top:0;
		right: 0;
		bottom: 0; */
	}



	.mask {
		/* overflow: hidden; */
		position: fixed;
		left: 0;
		background-color: #FFFFFF;
		z-index: 399;
	}

	/* footer */
	.list-boxd {
		position: absolute;
		bottom: 0;
		left: 0;
		z-index: 401;
		right: 0;
		border-radius: 14px 14px 0 0;
		background: #FFFFFF;
		transition: all 1s;
	}

	.list-header {
		height: 20px;
		position: relative;
		border-bottom: 1px solid #f3f4f6;
		cursor: pointer;
	}

	.list-header::after {
		position: absolute;
		left: 50%;
		top: 50%;
		transform: translate(-50%, -50%);
		content: '';
		height: 6px;
		width: 60px;
		border-top: 1px solid #e8e8e8;
		border-bottom: 1px solid #e8e8e8;
	}

	.list-content {
		max-height: 50vh;
		overflow-y: scroll;
	}

	.card {
		min-height: 44px;
		padding: 12px;
		position: relative;
		display: flex;
		justify-content: space-between;
		align-items: center;

	}

	.card-left {
		display: flex;
		flex-direction: column;
		justify-content: center;
	}

	.card-right {
		padding-right: 10px;
	}

	.arrow {
		border-top: 2px solid #666666;
		border-right: 2px solid #666666;
		width: 10px;
		height: 10px;
		transform: rotate(45deg);
	}


	.card:active {
		background-color: #f3f4f6;
	}


	.card::after {
		position: absolute;
		content: '';
		bottom: 0;
		height: 1px;
		background-color: #e8e8e8;
		width: 90%;
	}

	.card:last-child::after {
		height: 0;
		background-color: #FFFFFF;
	}

	.card-title {
		font-size: 18px;
	}

	.card-text {
		color: #e8e8e8;
		font-size: 13px;
	}
</style>