<template>
  <div class="map-container">
    <div class="input-search" ref="targetElement">
      <div class="search-box">
        <input
          type="text"
          v-model="searchQuery.carPlate"
          placeholder="请输入正确的车牌号"
        />
        <i
          class="el-icon-error icon-close"
          v-show="searchQuery.carPlate"
          @click="inputClear()"
        ></i>
        <div class="search-btn" @click="handleSearch()">搜索</div>
      </div>
      <el-collapse-transition>
        <div v-show="show" class="search-list">
          <div
            class="list-item"
            v-for="item in searchList"
            :key="item.carId"
            @click="handelLookCar(item)"
          >
            {{ item.carName }}
          </div>
        </div>
      </el-collapse-transition>
    </div>
    <mars-map @mapLoad="mapLoad" :options="options"></mars-map>
    <div class="multiple">
      <div
        @click="toggleSelection(item)"
        :class="{ checkbox: true, checked: isSelected(item) }"
        v-for="(item, index) in multipleList"
        :key="index"
      >
        <img
          :src="
            isSelected(item)
              ? require(`../assets/images/${item}-active.png`)
              : require(`../assets/images/${item}.png`)
          "
          alt=""
          class="btn-icon"
        />
        {{ item }}
      </div>
    </div>
  </div>
</template>

<script>
import MarsMap from "@/components/mars-map";

import { getCarPoint, getCarByCarplate } from "@/api/yunkun/yunkun.js";
export default {
  data() {
    const basePathUrl = window.basePathUrl || "";
    return {
      searchList: [],
      searchQuery: {
        carPlate: undefined, //车牌
        plateColor: undefined, //车辆颜色
      },
      carQuery: {
        teamId: "", //该参数表示获取指定车队下所有层级子车队的车辆定位，该参数优先级别高于carIds参数,
        carIds: "", //车辆id 多个用逗号分开，优先级低于teamId
      },
      list: [],
      multipleList: ["营运线路", "维护线路", "临时任务"],
      selectedItems: [],
      graphicLayer: null,
      baseUrl: basePathUrl + "lib/geoJson/tileset.json",
      carUrl: basePathUrl + "lib/qiche.gltf",
      map: null,
      options: {
        scene: {
          // center: {
          //   lat: 31.754913,
          //   lng: 117.248572,
          //   alt: 6220,
          //   heading: 357,
          //   pitch: -31,
          // },
          center: {
            lat: 31.212805,
            lng: 120.607156,
            alt: 5096.4,
            heading: 357.9,
            pitch: -31.5,
          },
          fog: false,
          fxaa: false,
          removeDblClick: true,
          requestRenderMode: false,
          scene3DOnly: false,
          sceneMode: 3,
          shadows: false,
          showMoon: false,
          showSkyAtmosphere: false,
          showSkyBox: false,
          showSun: false,
        },

        control: {
          contextmenu: { preventDefault: false, hasDefault: false },
        },
        basemaps: [
          // {
          //   name: "mapbox影像图",
          //   icon: "img/basemaps/mapboxSatellite.png",
          //   type: "mapbox",
          //   username: "sharealex",
          //   styleId: "cly5i21fn00e901prgq643t4r",
          //   token:
          //     "pk.eyJ1Ijoic2hhcmVhbGV4IiwiYSI6ImNsaXNhZmRjbTFhbnczZmxib3h1OW05YXYifQ.PhlKv60ar3K359d8x2yBPw",
          //   tilesize: 256,
          //   scaleFactor: false,
          //   show: false,
          // },
        ],
      },
      show: false,
      showVideo: true,
    };
  },
  components: { MarsMap },
  beforeDestroy() {
    clearInterval(this.timer);
    // 在组件销毁之前移除事件监听，防止内存泄漏
    document.removeEventListener("click", this.handleClickOutside);
  },
  mounted() {
    // 在mounted钩子中添加全局点击事件监听
    document.addEventListener("click", this.handleClickOutside);
  },
  methods: {
    /**输入框清除 */

    inputClear() {
      this.map.flyHome();
      if (this.timer) clearInterval(this.timer);
      this.searchList = [];
      this.searchQuery.carPlate = undefined;
      this.carQuery.carIds = undefined;
      this.show = false;
      this.getCarPoint();
    },

    /**根据车牌号查询车辆实时定位 */
    async handleSearch() {
      if (!this.searchQuery.carPlate) return;
      // 清除轮询定时器
      if (this.timer) clearInterval(this.timer);
      const result = await getCarByCarplate(this.searchQuery);
      this.searchList = result.list;
      this.show = true;
    },

    handelLookCar(item) {
      this.list = [item];
      this.carQuery.carIds = item.carId;
      this.map.flyToPoint(
        new mars3d.LngLatPoint(parseFloat(item.lng), parseFloat(item.lat))
      );
      this.createCar("active");
      this.show = false;
    },

    /**
     * 获取车辆实时定位（可查全部）
     */
    async getCarPoint() {
      this.list = await this.carPoint();
      this.createCar();
    },

    async carPoint() {
      let res = await getCarPoint(this.carQuery);
      res.list = res.list.filter(
        (item) =>
          item.carPlate.includes("苏E") ||
          (item.carPlate.includes("苏U") && item.stateCn.includes("在线-行驶"))
      );
      return res.list.slice(0, 50);
    },

    /**
     * 创建车辆图标
     */
    createCar(type) {
      let _this = this;
      this.graphicLayer.clear();
      this.graphicLayer.enabledEvent = false; // 关闭事件，大数据addGraphic时影响加载时间
      // 设置动态位置
      for (let i = 0; i < this.list.length; i++) {
        const item = this.list[i];
        let graphic = new mars3d.graphic.ModelPrimitive({
          id: item.carId,
          style: {
            url: this.carUrl,
            scale: 3,
            minimumPixelSize: 20,
            silhouette: true,
            silhouetteColor: "#0084ff",
            silhouetteSize: 2,
            pitch: 0,
            roll: 0,
            label: {
              text: item.carName,
              font_size: 14,
              color: "#ffffff",
              outline: true,
              outlineColor: "#000000",
              pixelOffsetY: -30,
              visibleDepth: false,
              distanceDisplayCondition: true,
              distanceDisplayCondition_far: 50000,
              distanceDisplayCondition_near: 0,
            },
          },
          // autoMiddleDynamicPosition: true, //如果中间缺少数据时是否自动添加中间点
          frameRateHeight: 30, // 控制贴模型的效率，多少帧计算一次
        });
        this.graphicLayer.addGraphic(graphic);
        this.graphicLayer.enabledEvent = true; // 恢复事件

        if (type) {
          graphic.openHighlight({
            scale: 5,
            silhouette: true,
            silhouetteColor: "#FAAC51",
            silhouetteSize: 2,
            label: {
              outlineColor: "#FAAC51",
            },
          });
        }
        graphic.on(mars3d.EventType.click, function (e) {
          _this.$router.push({
            path: "/carInfo",
            query: { carId: e.target.id },
          });
        });
      }
      this.changePosition(0);
      // 定时更新动态位置（setInterval为演示）
      const interval = 15;
      this.changePosition(interval);
      this.time = setInterval(() => {
        this.changePosition(interval);
      }, interval * 1000);
    },

    // 改变位置
    async changePosition(interval) {
      let list = await this.carPoint();
      this.graphicLayer.eachGraphic((graphic) => {
        let carItam = list.filter((car) => car.carId == graphic.id);
        if (carItam.length > 0) {
          let position = Cesium.Cartesian3.fromDegrees(
            parseFloat(carItam[0].lng),
            parseFloat(carItam[0].lat),
            30
          );
          graphic.addDynamicPosition(position, interval); // 按time秒运动至指定位置
        }
      });
    },
    handleClickOutside(event) {
      // 判断点击的元素是否在目标元素外部
      if (this.show && !this.$refs.targetElement.contains(event.target)) {
        this.show = false;
      }
    },
    toggleSelection(item) {
      // 切换选中状态
      if (this.isSelected(item)) {
        this.selectedItems = this.selectedItems.filter(
          (selectedItem) => selectedItem !== item
        );
      } else {
        this.selectedItems.push(item);
      }
    },
    isSelected(item) {
      // 检查某个项是否被选中
      return this.selectedItems.includes(item);
    },

    mapLoad(map) {
      this.map = map;
      this.graphicLayer = new mars3d.layer.GraphicLayer();
      map.addLayer(this.graphicLayer);
      // this.initTilesetLayer();
      this.getCarPoint();
    },

    /**
     * 加载姑苏区三维图层
     */
    initTilesetLayer() {
      let _this = this;
      // 添加参考三维模型;
      const tiles3dLayer = new mars3d.layer.TilesetLayer({
        name: "姑苏区建筑物",
        url: "https://www.jichuanglanhai.com:88/3dtiles/yunkun/tileset.json",
        maximumScreenSpaceError: 16,
        maximumMemoryUsage: 1024 / 2,
        dynamicScreenSpaceError: false,
        skipLevelOfDetail: true,
        preferLeaves: true,
        flyTo: false,
        style: {
          color: {
            conditions: [["true", `color("rgba(42, 160, 224, 1)")`]],
          },
        },
      });
      this.map.addLayer(tiles3dLayer);
      if (process.env.NODE_ENV === "production") this.chkShadows(true);
      tiles3dLayer.on(mars3d.EventType.load, function (event) {
        _this.getCarLocation();
      });
    },
    chkShadows(val) {
      let _this = this;
      this.map.viewer.shadows = val;
      if (val) {
        setTimeout(function () {
          // 光照沿着相机方向
          _this.map.scene.shadowMap._lightCamera = _this.map.scene.camera;
        }, 1500);
      }
    },
  },
};
</script>

<style lang="scss" scoped>
.input-search {
  position: absolute;
  top: 23px;
  left: 50%;
  transform: translateX(-50%);
  z-index: 100;

  .search-box {
    position: relative;
    display: flex;
    align-items: center;
    height: 32px;
    .icon-close {
      cursor: pointer;
      position: absolute;
      left: 260px;
      font-size: 14px;
      color: #0084ff;
    }
  }
  .search-btn {
    cursor: pointer;
    line-height: 32px;
    background: #0084ff;
    color: #ffffff;
    font-size: 14px;
    padding: 0 10px;
    height: 100%;
    border-radius: 0 3px 3px 0;
  }

  input {
    font-size: 14px;
    width: 280px;
    height: 100%;
    border: 1px solid #0084ff;
    border-right: 0;
    background: #032b57;
    padding-left: 6px;
    color: #ffffff;
  }
  input::placeholder {
    color: #7c91a8;
  }
  input:focus-visible {
    outline: none;
  }
  .search-list {
    width: 280px;
    background: #032b57;
    color: #fff;
    border: 1px solid #0084ff;
    border-top: 0;
    & > div {
      cursor: pointer;
      font-size: 14px;
      padding: 10px;
    }
    & > div:hover {
      background: #0084ff;
    }
  }
}
.video-list {
  position: absolute;
  bottom: 25px;
  left: 50%;
  transform: translateX(-50%);
  z-index: 50;
  padding: 10px;
  display: flex;
  align-items: center;
  border: 1px solid #415367;
  border-radius: 10px;
  background: rgba(28, 31, 34, 0.6);
}
.multiple {
  position: absolute;
  bottom: 0;
  left: 50%;
  transform: translateX(-50%);
  z-index: 50;
  width: 880px;
  height: 80px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  background: url("../assets/images/multipleList.png");
  background-size: 100% 100%;
  padding: 0 230px;
  .checkbox {
    cursor: pointer;
    width: 112px;
    height: 32px;
    line-height: 32px;
    text-align: center;
    font-size: 14px;
    color: #ffffff;
    background: linear-gradient(180deg, #072853 0%, #0079ff 100%);
    // border-radius: 16px;
    border: 1px solid #0084ff;
    border-radius: 16px;
    display: flex;
    align-items: center;
    justify-content: center;
  }
  .checked {
    background: #fd873f;
    color: #612500;
    border: 0;
    font-weight: bold;
    border: 1px solid #f7c75d;
  }
  .btn-icon {
    width: 15px;
    height: 16px;
    margin-right: 10px;
  }
}
</style>
