<template>
  <Bg1 class='RoadAndEvents'>
    <div class="tabs">
      <div class="tabs-item" :class="layer.title === active ? 'tabs-active' : ''" v-for="layer in layerData"
        :key="layer.title" @click="handleClick(layer)">
        {{ layer.title }}
      </div>
    </div>

    <!-- group -->
    <div name="fade-group" tag="div" class="tabs-content">
      <div class="device-item" v-for="(item, index) in tabContentData" :key="item.id" @click="handleDevice(item)"
        :style="getStart(index)">
        <div class="device-icon"
          :style="{ backgroundImage: `url(${require(`@screen/images/layer/${active}/${item.title}${item.status}.svg`)})`, '--bgColor': `rgba(0, 209, 255, ${item.status ? 0.3 : 0})` }" />
        <span>{{ item.title }}</span>
      </div>
    </div>

    <div class="bottom">
      <div class="cleared-btn" @click="handleCleared">
        <img src="@screen/images/clearLayer.svg" />
        <span>清空图层</span>
      </div>
    </div>

    <!-- 摄像机设备 控制 弹窗  球机 可打开-->
    <!-- 摄像机 G35 K094+079 下行(可控) 枪机 可打开-->
    <!-- <Camera :data="dialogConfig.data" :visible="dialogConfig.visibleType === 1" /> -->
    <component :dialogData="dialogConfig.data" visible :selectedDevice="dialogConfig.data" :is="dialogConfig.component"
      @change="handleCameraChange" @update:visible="handleCameraChange" />
  </Bg1>
</template>

<script>
import { getLayerData } from "./utils/layerImages";
import { debounce } from "lodash";
import { eventMap, cacheRemoveFunc, getHandleDeviceType } from "./utils/buttonEvent";

import Bg1 from "@screen/components/Decorations/bg-1.vue"
import InfoBoard from "./../InfoBoard/index.vue"

import DrivingGuidance from "./../Dialogs/DrivingGuidance/index.vue"
import Camera from "./../Dialogs/Camera/index.vue";
import Broadcast from "./../Dialogs/Broadcast/index.vue";
import TrafficIncidents from "./../Dialogs/TrafficIncidents/index.vue";
import PerceiveEvent from "./../Dialogs/PerceiveEvent/index.vue";
import SmartDevice from "./../Dialogs/SmartDevice/index.vue";
import Intermodulation from "./../Dialogs/Intermodulation/index.vue";

export default {
  name: 'RoadAndEvents',
  components: {
    // ControlCamera,
    Camera,
    DrivingGuidance,
    Bg1,
    InfoBoard,
    Broadcast,
    TrafficIncidents,
    PerceiveEvent,
    SmartDevice,
    Intermodulation
  },
  data() {
    return {
      // testData:{
      //   visible:true,
      //   device: {
      //     "id": 904,
      //     "iotDeviceId": "81221-65535",
      //     "groupId": null,
      //     "productId": 0,
      //     "stakeMark": "k59+289",
      //     "direction": "1",
      //     "deviceName": "大学城入口站前板",
      //     "deviceType": 2,
      //     "installationDate": null,
      //     "productionDate": null,
      //     "durableYears": null,
      //     "installationSite": null,
      //     "useState": null,
      //     "otherConfig": "{\"screenSize\":\"160*80\"}",
      //     "remark": null,
      //     "createTime": "2024-01-10T15:48:59.000+08:00",
      //     "updateTime": null
      //   }
      // },
      layerData: [],
      active: "事件专题",
      tabContentData: [],

      // 路测设备-摄像机
      dialogConfig: {
        // 0 有 可控(球机) ControlCamera | 1 ⽆ 不可控(枪机) Camera
        component: void 0,
        data: void 0,
        // component: "SmartDevice",
        data: {
          "searchValue": null,
          "createBy": null,
          "createTime": "2024-07-23 14:18:58",
          "updateBy": null,
          "updateTime": null,
          "remark": null,
          "params": {},
          "id": 11,
          "stakeMark": "k103+900",
          "direction": "1",
          "deptId": null,
          "warningState": 1,
          "warningTime": null,
          "userId": null,
          "warningSource": 1,
          "warningLevel": null,
          "warningType": 1,
          "warningSubclass": null,
          "warningTitle": null,
          "otherConfig": null,
          "sectionName": null,
          "number": 0,
          "type": null,
          "sectionId": null,
          "longitude": "116.493888",
          "latitude": "36.291145"
        }
      }
    }
  },
  inject: ['getMap'],
  created() {
    const defaultActive = 0;

    const layerData = getLayerData();
    this.layerData = layerData;
    this.tabContentData = layerData[defaultActive].children || [];
    this.active = layerData[defaultActive].title;

    this.minLayers = 3;
  },
  mounted() {
    // 获取原始 Layer
    const getMinMapLayers = (time = 0) => {
      setTimeout(() => {
        const { mapIns } = this.getMap();

        if (!mapIns) return getMinMapLayers(150);

        this.minLayers = mapIns.getLayers().length - 1;
      }, time);
    }

    getMinMapLayers();
  },
  methods: {
    setFilterData(data) {
      this.filterData = data;

      this.layerData[1].children.forEach(item => {
        if (!item.status) return;

        this.handleDeviceImmediate(item);
        this.handleDeviceImmediate(item);
      })
    },
    handleClick(item) {
      this.active = item.title;
      this.tabContentData = item.children;
    },
    handleDeviceImmediate(item) {
      const key = getHandleDeviceType(item) || `${this.active}/${item.title}`;

      const status = item.status;

      item.status = item.status ? "" : "_active";

      console.log("%c [ key ]-102-「index.vue」", "font-size:15px; background:#9d63e9; color:#e1a7ff;", key);

      if (!eventMap[`${key}${status ? "_close" : ""}`]) return this.$emit("onClickItem", item);

      eventMap[`${key}${status ? "_close" : ""}`]?.call(this, item, this.filterData);
    },
    handleDevice: debounce(function (item) {
      this.handleDeviceImmediate(item);
    }, 360),
    handleCleared() {
      const { mapIns } = this.getMap();

      this.layerData.forEach(({ children }) => {
        children.forEach(item => item.status = "")
      });

      if (!mapIns) return;

      for (const key in cacheRemoveFunc) {
        cacheRemoveFunc[key]?.();
      }

      // mapIns.clearMap();
      mapIns.getLayers().forEach((layer, index) => index > this.minLayers && mapIns.remove(layer))
    },

    // 摄像机 可控 不可控 弹窗 回调
    handleCameraChange() {
      this.dialogConfig = {
        // 0 有 可控(球机)ControlCamera | 1 ⽆ 不可控(枪机)Camera
        component: null,
        data: null
      }
    },
    getStart(index) {
      const columns = 5;

      return {
        gridRowStart: Math.floor(index / columns) + 1,
        gridColumnStart: (index % columns) + 1,
      }
    }
  }
}
</script>

<style lang='scss' scoped>
.fade-enter-active,
.fade-leave-active {
  transition: opacity .24s;
}

.fade-enter,
.fade-leave-to {
  opacity: 0;
}

.fade-group-enter-active,
.fade-group-leave-active {
  transition: all 0.24s ease;
}

.fade-group-enter-from,
.fade-group-leave-to {
  opacity: 0;
}

.RoadAndEvents {
  width: 100%;
  // background: url("~@screen/images/bg/box_bg_002.png") no-repeat;
  // clip-path: polygon(13% 0, 87% 0, 100% 14%, 100% 85%, 85% 100%, 11% 100%, 0 87%, 0 15%);
  // background-size: 100% 100%;
  position: relative;
  display: flex;
  flex-direction: column;
  padding: 24px 18px;
  padding-bottom: 15px;
  overflow: hidden;
  max-height: min-content;

  .tabs-content {
    margin-top: 15px;
    margin-bottom: 6px;
    display: grid;
    grid-template-columns: repeat(5, 1fr);
    grid-auto-rows: 60px;
    flex: 1;
    max-height: 100%;
    overflow: auto;
    position: relative;
    gap: 6px;
    transition: all .24s linear;

    .device-item {
      // position: absolute;
      position: relative;
      width: 70px;
      cursor: pointer;
      display: flex;
      flex-direction: column;
      align-items: center;
      --height-svg: 24px;
      --gap: 12px;
      transition: all .15s linear;
      padding-top: calc(var(--height-svg) + var(--gap));

      .device-icon {
        display: flex;
        align-items: center;
        justify-content: center;
        position: absolute;
        transition: all .15s linear;
        top: 0;
        height: 33px;
        width: 100%;
        background-repeat: no-repeat;
        background-size: auto;
        background-position: center;
        transition: all .18s linear;

        &::before {
          content: "";
          position: absolute;
          width: 33px;
          height: 33px;
          border: 1px solid rgba(0, 209, 255, .5);
          background-color: var(--bgColor);
          border-radius: 50%;
          z-index: -1;
        }
      }

      span {
        display: block;
        text-align: center;
        font-size: 13px;
        font-family: PingFang SC, PingFang SC;
        font-weight: 500;
        color: #ffffff;
        line-height: 15px;
        min-height: 27px;
      }
    }
  }

  .tabs {
    display: flex;
    overflow: hidden;
    gap: 24px;

    .tabs-item {
      display: flex;
      justify-content: center;
      align-items: center;
      cursor: pointer;
      // width: 128px;
      flex: 1;
      height: 36px;
      background: url("~@screen/images/bg/box_bg_005.png") no-repeat;
      background-size: 100% 100%;
      font-size: 15px;
      font-family: PingFang SC, PingFang SC;
      font-weight: 500;
      color: #ffffff;
      transition: all .3s linear;
    }

    .tabs-active {
      color: #00d1ff;
      background: url("~@screen/images/bg/box_bg_005_active.png") no-repeat;
      background-size: 100% 100%;
    }
  }

  .bottom {
    display: flex;
    justify-content: end;

    .cleared-btn {
      // position: absolute;
      cursor: pointer;
      width: 98px;
      height: 31px;
      border-radius: 20px;
      border: 1px solid #25d8ff;
      font-size: 12px;
      font-family: PingFang SC, PingFang SC;
      font-weight: 500;
      color: #ffffff;
      display: flex;
      align-items: center;

      img {
        width: 16px;
        height: 16px;
        display: inline-block;
        margin: 0 10px;
      }
    }
  }
}
</style>