<template>
  <div>
    <div class="map-box">
      <div class="map" ref="map" style="height: 400px" ></div>
      <div class="map-search">
        <div>
          <a-input-search id="place" v-model="searchValue" placeholder="请输入详细地址" enter-button @search="searchAddress(searchValue)" />
        </div>
        <div>
          <ul v-if="kwData.length">
            <li v-for="(item, index) in kwData" :key="index" @click="selectKeyword(item)">{{ item.address }}</li>
          </ul>
        </div>
      </div>
    </div>
  </div>
</template>
<script>
export default {
  name: 'TencentMapPicker',
  props: {
    latitude: {
      type: Number|String,
      default: 0
    },
    longitude: {
      type: Number|String,
      default: 0
    }
  },
  watch: {
    latitude(newVal, oldVal) {
      console.info(`newVal`,newVal,`oldVal`,oldVal)
      if (newVal) {
        this.form.latitude = newVal
        // this.$nextTick(()=>{
        //     this.map.setCenter(new window.TMap.LatLng(this.form.latitude, this.form.longitude));
        // })
      }
    },
    longitude(newVal, oldVal) {
      console.info(`newVal`,newVal,`oldVal`,oldVal)
      if (newVal) {
        this.form.longitude = newVal
        // this.$nextTick(()=>{
        //     this.map.setCenter(new window.TMap.LatLng(this.form.latitude, this.form.longitude));
        // })
      }
    }
  },
  data() {
    return {
      searchValue: '', //地图搜索
      form: {
        longitude: 116.397128,
        latitude: 39.916527
      },
      kwData:[]
    }
  },
  mounted() {
    let that = this
    if (that.script) return;
    that.script = document.createElement('script');
    that.script.type = 'text/javascript';
    that.script.src = `//map.qq.com/api/gljs?v=1.exp&libraries=service&key=DGFBZ-JU76M-34A63-6BU47-2FLJH-XLBCN`;
    document.head.appendChild(that.script);
    that.script.onload = () => {
      window.initMap = that.initMap;
      that.$nextTick(() => {
        that.initMap();
      });
    };
  },
  methods: {
    // 地图
    initMap() {
      // 搜索类
      this.searchEr = new window.TMap.service.Search({ pageSize: 15 });
      // 地图主类
      this.map = new window.TMap.Map(this.$refs.map, {
        backgroundColor: '#f7f7f7',
        mapStyleId: 'style1',
        zoom: 14,
        mapTypeControlOptions: {
          mapTypeIds: [],
        },
        draggableCursor: 'crosshair',
        center: new window.TMap.LatLng(this.form.latitude, this.form.longitude),
      });
      // 图层类
      this.markerLayer = new window.TMap.MultiMarker({
        map: this.map,
        geometries: [],
      });
      // 地址逆解析
      this.geocoder = new window.TMap.service.Geocoder();
      const setMarker = () => {
        const latlng = new window.TMap.LatLng(this.form.latitude, this.form.longitude);
        this.markerLayer.setGeometries([]);
        let geometries = this.markerLayer.getGeometries();
        geometries.push({
          id: '-1',
          position: latlng,
        });
        this.markerLayer.updateGeometries(geometries);
      };
      this.map.on('click', (e) => {
        this.form.longitude = e.latLng.getLng(); // 经度
        this.form.latitude = e.latLng.getLat(); // 纬度
        setMarker();
        this.getAddressFormat();
      });
      if (this.form.longitude) {
        this.map.setCenter(new window.TMap.LatLng(this.form.latitude, this.form.longitude));
        setMarker();
      }
    },
    selectKeyword(event){
      this.map.setCenter(new window.TMap.LatLng(event.location.lat, event.location.lng));
      this.kwData = []
    },
    // 地图搜索
    searchAddress(keyword = '') {
      if (!keyword) return;
      this.$jsonp('https://apis.map.qq.com/ws/place/v1/suggestion', {
        key: 'DGFBZ-JU76M-34A63-6BU47-2FLJH-XLBCN',
        output: 'jsonp',
        keyword: keyword,
      }).then((res) => {
        console.log(`res`,res)
        if (res.status === 0) {
          this.kwData = res.data
        } else {
          this.kwData = []
        }
      }).catch((e) => {
        console.log(e)
      })
      this.markerLayer.setGeometries([]);
      this.searchEr.searchRectangle({
        keyword,
        bounds: this.map.getBounds(),
      })
        .then((result) => {
          console.info(`result`,result)
          const { location = {} } = result.data[0] || {};
          const { lat = 39.916527, lng = 116.397128 } = location;
          this.map.setCenter(new window.TMap.LatLng(lat, lng));
          result.data.forEach((item, index) => {
            let geometries = this.markerLayer.getGeometries();
            // 点标注数据数组
            geometries.push({
              id: String(index),
              position: item.location,
            });
            // 绘制地点标注
            this.markerLayer.updateGeometries(geometries);
          });
        });
    },
    getAddressFormat() {
      const { longitude, latitude } = this.form;
      this.geocoder
        .getAddress({
          location: new window.TMap.LatLng(latitude, longitude),
        })
        .then((res) => {
          const {
            formatted_addresses: { recommend = '' },
          } = res.result || {};
          this.searchValue = recommend
          this.form.hotelDetailAddress = recommend;
          this.$emit('onLocationSelected', this.form);
          console.log(this.form);
        });
    },
  }
}
</script>
<style scoped>
.map-box {
  position: relative;

}
.map-search {
  z-index: 1000;
  display: flex;
  flex-direction: column;
  position: absolute;
  top: 20px;
  left: 20px;
  width: 300px;

}

button {
  border-radius: 0;
}

.icons {
  display: flex;
  align-items: center;
  justify-content: space-between;
}

.time {
  margin-top: 15px;
  width: 100%;
  font-size: 12px;
  flex-wrap: wrap;
  height: 70%;
}
ul{
  background: white;
  list-style-type: none;
  padding-left: 0px;
  height: 280px;
  overflow: scroll;
}
li{
  padding-left: 6px;
  font-size: 10px;
  text-align: left;
  height: 40px;
  line-height: 15px;
  display: flex;
  align-items: center;
}
li:hover{
  cursor: pointer;
  background: #f5f5f5;
}
</style>