<template>
  <div class="pc-container">
    <NavigationBar></NavigationBar>
    <foldpanelLeft :title="xiaoquIntroduce.deptName + '简介'">
      <IndexModelLeft />
    </foldpanelLeft>
    <foldpanelRight>
      <IndexModelRight />
    </foldpanelRight>
    <mars-map @mapLoad="mapLoad" :options="options" ref="map">
      <template #select>
        <div class="select-search">
          <el-select
            v-model="community"
            placeholder="选择社区"
            clearable
            @change="handleChange"
            :popper-append-to-body="false"
          >
            <el-option
              v-for="dict in communityList"
              :key="dict.dept_id"
              :label="dict.dept_name"
              :value="dict.dept_id"
            >
            </el-option>
          </el-select>

          <el-select
            style="margin-left: 10px"
            v-model="xiaoqu"
            placeholder="选择小区"
            clearable
            v-show="xiaoquList.length > 0"
            :popper-append-to-body="false"
            @change="goXiaoqu"
          >
            <el-option
              v-for="dict in xiaoquList"
              :key="dict.xiaoqu_id"
              :label="dict.dept_name"
              :value="dict.xiaoqu_id"
            >
            </el-option>
          </el-select>
        </div>
      </template>
    </mars-map>
  </div>
</template>

<script>
import MarsMap from "@/components/mars-map";
import NavigationBar from "@/components/NavigationBar/index.vue";
import { mapGetters } from "vuex";
import {
  foldpanelLeft,
  IndexModelLeft,
  foldpanelRight,
  IndexModelRight,
} from "@/views/components/index.js";
import { getCommunitylist, getXiaoqulist } from "@/api/taicangpop/data.js";

export default {
  name: "Index",
  computed: {
    ...mapGetters(["dept", "xiaoquIntroduce"]),
  },
  components: {
    MarsMap,
    NavigationBar,
    foldpanelLeft,
    IndexModelLeft,
    foldpanelRight,
    IndexModelRight,
  },
  data() {
    const basePathUrl = window.basePathUrl || "";
    return {
      options: {
        scene: {
          center: {
            lat: 31.344002,
            lng: 121.120196,
            alt: 21247.4,
            heading: 355.1,
            pitch: -53.8,
          },
          showSun: false,
          showMoon: false,
          showSkyBox: false,
          showSkyAtmosphere: false,
          fog: false,
          backgroundColor: "rgba(0,0,0,0)",
          backgroundImage: `url(${require("../assets/images/ui/index_bg.jpg")})`,
          orderIndependentTranslucency: false,
          contextOptions: { webgl: { antialias: mars3d.Util.isPCBroswer() } },
          globe: {
            show: false, // 不显示地球
            showGroundAtmosphere: false,
            enableLighting: false,
          },
          clock: {
            currentTime: "2023-11-01 12:00:00", // 固定光照时间
          },
          cameraController: {
            zoomFactor: 1.5,
            minimumZoomDistance: 0.1,
            maximumZoomDistance: 200000,
            enableCollisionDetection: false, // 允许进入地下
          },
        },
      },
      community: 100,
      communityList: [],
      xiaoqu: "",
      xiaoquList: [],
      map: null,
      mapLayer: {},
      streetUrl: basePathUrl + "lib/geoJson/loujiangjiedao.json",
      shequUrl: basePathUrl + "lib/geoJson/shequ.json",
      xiaoquUrl: basePathUrl + "lib/geoJson/xiaoqu.json",
      roaduUrl: basePathUrl + "lib/geoJson/road.json",
      roaduNameUrl: basePathUrl + "lib/geoJson/road-name.json",
      riveruUrl: basePathUrl + "lib/geoJson/river.json",
      riverNameUrl: basePathUrl + "lib/geoJson/river-name.json",
    };
  },

  created() {
    if (this.$auth.hasRoleNet("network")) {
      this.$router.replace("/xiaoqu");
      return;
    }
    this.getCommunity();
    this.$store.dispatch("GetYjtotal");
    this.$store.dispatch("GetXiaoquInfo", this.dept.deptId);
    this.$store.dispatch("getThreeCell");
    this.$store.dispatch("GetcolorList");
  },
  methods: {
    goXiaoqu(id) {
      if (id == 260 || id == 254 || id == 257) {
        this.$modal.msgWarning("该小区功能暂未开放!");
        return;
      }

      this.$router.push({ path: "/xiaoqu", query: { xiaoquId: id } });
    },

    mapLoad(map) {
      let _this = this;
      this.map = map;

      map.setSceneOptions({
        cameraController: {
          // enableZoom: false,
          // enableTranslate: true,
          // enableRotate: false,
          enableTilt: false,
        },
      });

      map.on(mars3d.EventType.wheel, function (e) {
        _this.zoomChange();
      });

      this.addLayer();
      this.addstreet();
      this.addShequ();
      this.addXiaoqu();
      this.addRoad();
      this.addRiver();
    },
    zoomChange() {
      let level = this.map.level;
      this.mapLayer.shequ.eachGraphic((graphic) => {
        if (graphic.isPrivate) {
          return;
        }
        if (level >= 14) {
          // graphic.openHighlight(
          //   {
          //     label: {
          //       opacity: 0,
          //     },
          //   },
          //   false
          // );
        } else {
          graphic.closeHighlight();
        }
      });
      if (level >= 14) {
        this.mapLayer.xiaoqu.show = true;
      } else {
        this.mapLayer.xiaoqu.show = false;
      }
    },
    //河 - 河名
    addRiver() {
      mars3d.Util.fetchJson({ url: this.riveruUrl }).then((res) => {
        const arr = mars3d.Util.geoJsonToGraphics(res);
        arr.map((item, index) => {
          const graphic = new mars3d.graphic.PolylineEntity({
            positions: item.positions,
            style: {
              visibleDepth: false,
              addHeight: 10,
              width: 2,
              color: "#33816D",
              opacity: 0.8,
            },
          });
          this.mapLayer.river.addGraphic(graphic);
        });
      });
      mars3d.Util.fetchJson({ url: this.riverNameUrl }).then((res) => {
        const arr = mars3d.Util.geoJsonToGraphics(res);
        arr.map((item, index) => {
          const graphic = new mars3d.graphic.LabelEntity({
            name: "贴地文字",
            position: item.position,
            style: {
              addHeight: 11,
              visibleDepth: false,
              text: item.attr.TextString,
              font_size: 12,
              color: "#fff",
              outline: true,
              outlineColor: "#33816D",
              outlineOpacity: 1,
              outlineWidth: 4,
              hasPixelOffset: true,

              // 视距的设置
              scaleByDistance: true,
              scaleByDistance_far: 20000000,
              scaleByDistance_farValue: 0.1,
              scaleByDistance_near: 1000,
              scaleByDistance_nearValue: 1,
            },
          });
          this.mapLayer.river.addGraphic(graphic);
        });
      });
    },
    //路 - 路名
    addRoad() {
      mars3d.Util.fetchJson({ url: this.roaduUrl }).then((res) => {
        const arr = mars3d.Util.geoJsonToGraphics(res);
        arr.map((item, index) => {
          const graphic = new mars3d.graphic.PolylineEntity({
            positions: item.positions,
            style: {
              visibleDepth: false,
              addHeight: 1,
              width: 3,
              color: "#9D6E00",
              opacity: 0.8,
            },
          });
          this.mapLayer.road.addGraphic(graphic);
        });
      });
      mars3d.Util.fetchJson({ url: this.roaduNameUrl }).then((res) => {
        const arr = mars3d.Util.geoJsonToGraphics(res);
        arr.map((item, index) => {
          const graphic = new mars3d.graphic.LabelEntity({
            name: "贴地文字",
            position: item.position,
            style: {
              visibleDepth: false,
              text: item.attr.name,
              font_size: 12,
              color: "#fff",
              outline: true,
              outlineColor: "#9D6E00",
              outlineOpacity: 1,
              outlineWidth: 4,
              hasPixelOffset: true,

              // 视距的设置
              scaleByDistance: true,
              scaleByDistance_far: 20000000,
              scaleByDistance_farValue: 0.1,
              scaleByDistance_near: 1000,
              scaleByDistance_nearValue: 1,
            },
          });
          this.mapLayer.road.addGraphic(graphic);
        });
      });
    },
    //小区
    addXiaoqu() {
      mars3d.Util.fetchJson({ url: this.xiaoquUrl }).then((res) => {
        let _this = this;
        const arr = mars3d.Util.geoJsonToGraphics(res);
        arr.map((item, index) => {
          let id = item.attr.Id;
          if (
            id == 245 ||
            id == 251 ||
            id == 248 ||
            id == 254 ||
            id == 257 ||
            id == 260
          )
            return;
          const polygonEntity = new mars3d.graphic.PolygonEntity({
            id: item.id,
            positions: item.positions,
            style: {
              addHeight: 10,
              fill: false,
              outline: true,
              fill: true,
              color: "#ffeb3b",
              opacity: 0.3,
              outlineWidth: 2,
              outlineColor: "#ffeb3b",
              label: {
                opacity: 1,
                text: item.attr.name,
                position: "center",
                font_size: 15,
                font_weight: "bold",
                color: "#ffeb3b",
                outline: true,
                outlineColor: "#111",
                outlineOpacity: 1,
                outlineWidth: 4,
                hasPixelOffset: true,
                pixelOffsetY: -2,
                // 视距的设置
                scaleByDistance: true,
                scaleByDistance_far: 20000000,
                scaleByDistance_farValue: 0.1,
                scaleByDistance_near: 1000,
                scaleByDistance_nearValue: 1,
              },
            },
          });
          this.mapLayer.xiaoqu.addGraphic(polygonEntity);

          polygonEntity.on(mars3d.EventType.click, function (e) {
            // console.log(e.id);
            _this.goXiaoqu(e.id);
          });
        });
      });
    },
    // 社区
    addShequ() {
      mars3d.Util.fetchJson({ url: this.shequUrl }).then((res) => {
        const arr = mars3d.Util.geoJsonToGraphics(res);
        arr.map((item, index) => {
          const polygonEntity = new mars3d.graphic.PolygonEntity({
            id: `shequ${item.id}`,
            positions: item.positions,
            style: {
              fill: true,
              color: "#057BEB",
              outline: true,
              outlineWidth: 2,
              outlineColor: "#6ED2FB",
              label: {
                opacity: 1,
                text: item.attr.COMNAME,
                position: "center",
                font_size: 15,
                font_weight: "bold",
                color: "#fff",
                outline: true,
                outlineColor: "#111",
                outlineOpacity: 0.5,
                outlineWidth: 3,
                hasPixelOffset: true,
                pixelOffsetY: -2,
                visibleDepth: false,
                // 视距的设置
                scaleByDistance: true,
                scaleByDistance_far: 20000000,
                scaleByDistance_farValue: 0.1,
                scaleByDistance_near: 1000,
                scaleByDistance_nearValue: 1,
              },
            },
          });
          this.mapLayer.shequ.addGraphic(polygonEntity);
        });
      });
    },
    //创建图层到map
    addLayer() {
      this.mapLayer.river = new mars3d.layer.GraphicLayer();
      this.map.addLayer(this.mapLayer.river);

      this.mapLayer.road = new mars3d.layer.GraphicLayer();
      this.map.addLayer(this.mapLayer.road);

      this.mapLayer.xiaoqu = new mars3d.layer.GraphicLayer({ show: false });
      this.map.addLayer(this.mapLayer.xiaoqu);

      this.mapLayer.shequ = new mars3d.layer.GraphicLayer();
      this.map.addLayer(this.mapLayer.shequ);

      this.mapLayer.street = new mars3d.layer.GraphicLayer();
      this.map.addLayer(this.mapLayer.street);
    },

    /**
     * 加载社区底图面
     */
    addstreet() {
      mars3d.Util.fetchJson({ url: this.streetUrl }).then((res) => {
        const arr = mars3d.Util.geoJsonToGraphics(res);

        arr.map((item, index) => {
          const wall = new mars3d.graphic.WallPrimitive({
            positions: item.positions[0],
            style: {
              setHeight: -2000,
              diffHeight: 2000, // 墙高
              width: 10,
              materialType: mars3d.MaterialType.Image2,
              materialOptions: {
                image: require("../assets/images/ui/fence-top.png"),
                color: "#4CE2F5",
              },
            },
          });
          this.mapLayer.street.addGraphic(wall);
        });
      });
    },

    handleChange(e) {
      if (!e) return;
      let _this = this;
      this.$store.dispatch("GetXiaoquInfo", e);
      this.xiaoqu = "";
      this.xiaoquList = this.communityList.filter(
        (item) => item.dept_id == e
      )[0].children;

      if (e == 100) {
        e = undefined;
        this.map.flyHome({
          duration: 1,
        });
        setTimeout(() => {
          this.zoomChange();
        }, 1200);
      } else {
        let shequItem = this.mapLayer.shequ.getGraphicByAttr(`shequ${e}`);
        this.map.flyToPoint(
          new mars3d.LngLatPoint(
            shequItem.centerPoint._lng,
            shequItem.centerPoint._lat
          ),
          {
            radius: 2776.4,
            duration: 1,
            complete: function () {
              if (_this.xiaoquList.length == 0) {
                shequItem.openHighlight({
                  outlineColor: "#ffeb3b",
                  outlineWidth: 5,
                });
              } else {
                _this.zoomChange();
              }
            },
          }
        );
      }
      this.$store.dispatch("GetYjtotal", {
        shequId: e,
      });
      this.$store.commit("SET_QUERY_PARAMS", { shequId: e });
      this.$store.dispatch("getThreeCell", {
        shequId: e,
      });
      this.$store.dispatch("GetcolorList", {
        shequId: e,
      });
    },

    getCommunity() {
      let community = new Promise((resolve, reject) => {
        getCommunitylist().then((res) => {
          res.data["社区list集合"].unshift({
            dept_name: "全部社区",
            dept_id: this.dept.deptId,
          });
          resolve(res.data["社区list集合"]);
        });
      });

      let xiaoqu = new Promise((resolve, reject) => {
        getXiaoqulist().then((res) => {
          resolve(res.data["小区list集合"]);
        });
      });

      Promise.all([community, xiaoqu]).then((res) => {
        this.communityList = res[0].map((item) => {
          item.children = [];
          res[1].forEach((it) => {
            if (item.dept_id == it.shequ_id) item.children.push(it);
          });
          return item;
        });
      });
    },
  },
};
</script>

<style scoped lang="scss">
.pc-container {
  position: relative;
  height: 100%;
  box-sizing: border-box;
  // background: url("~@/assets/images/ui/index_bg.jpg");
  background-size: 100% 100%;
  overflow: hidden;
}

::v-deep .select-search {
  position: absolute;
  left: 410px;
  top: 110px;

  .el-select {
    width: 160px;
    .el-input {
      background: transparent;
    }
    .el-input__inner {
      height: 45px;
      line-height: 45px;
      color: #fff;
      background: url("~@/assets/images/ui/img_btn_search.png");
      background-size: 100% 100%;
      border: 0px !important;
    }
    .el-input__inner::placeholder,
    .el-select__caret {
      color: #fff;
    }
  }
}
</style>
