<template>
  <div class="CommandDispatch" :style="{ '--row': row, height: '100%' }">
    <component
      :is="key"
      v-for="(_, key) in gridAreaMap"
      :key="key"
      :ref="key"
      :style="{ gridArea: gridAreaMap[key] }"
      @fullHeight="(opacityKey) => handleFullHeight(key, opacityKey)"
    />
  </div>
</template>

<script>
import request from "@/utils/request";

const files = require.context("./Cards", true, /[^/]+\/index\.vue$/);

const components = files.keys().reduce((components, key) => {
  components[key.match(/[^/]+/g)[1]] = files(key).default;

  return components;
}, {});

const originGridArea = {
  EventInformation: "1 / 1 / span 12 / 1", // 事件信息（左1）
  DispatchLiaison: "13 / 1 / span 8 / 2", // 调度联络（左2）13 / 1 / span 11 / 2
  TrafficControl: "21 / 1 / span 13 / 2", //交通管制（左3）24 / 1 / span 10 / 2
  CrowdnessIndicatorRankings: "1 / 2 / span 12 / 2", //地图 / 拥挤指数排名情况（中1）
  DisposalProcess: "13 / 2 / span 21 / 2", //处置过程（中2）
  RealTimeVideo: "1 / 3 / span 9 / 3", //实时视频（右1）
  ReleaseInformation: "10 / 3 / span 7 / 3", //信息发布（右2）
  DeviceControl: "17 / 3 / span 17 / 3", //设备管控（右3）
  // DisposalPlan: "17 / 1 / span 9 / 2", //处置预案（作废）
};

export default {
  name: "CommandDispatch",
  components: {
    ...components,
  },
  props: {
    detailId: {
      type: [String, Number],
      default: "162cb8824ea141f3a96a74ad81c22796",
    },
  },
  provide() {
    return {
      provideData: this.provideData,
    };
  },
  data() {
    return {
      gridAreaMap: {
        ...originGridArea,
      },
      row: 24,
      provideData: {
        detail: null,
      },
    };
  },
  created() {
    this.getDetail();
  },
  methods: {
    getDetail() {
      // 指挥调度 - 只有交通事件没有感知事件，感知事件完成后自动转为交通事件
      request({
        url: `/dc/system/event/${this.detailId}`,
        method: "GET",
      })
        .then((result) => {
          if (result.code != 200) return;
          result.data.longitude = '116.829275';
          result.data.dimension = '36.583156';
          this.provideData.detail = result.data;
          if (
            ["设备设施隐患", "非法上路", "施工建设", "服务区异常"].includes(
              result.data.eventName
            )
          ) {
            const gridArea = { ...originGridArea };
            // 第一列变化
            gridArea["DispatchLiaison"] = "13 / 1 / span 21 / 2";
            delete gridArea.TrafficControl;
            if (["设备设施隐患", "非法上路"].includes(result.data.eventName)) {
              // 第三列变化
              gridArea["RealTimeVideo"] = "1 / 3 / span 16 / 3";
              delete gridArea.ReleaseInformation;
            }

            this.gridAreaMap = gridArea;
          }
        })
        .catch((err) => {});
    },
    handleFullHeight(key, opacityKey) {
      // 还原图标
      if (this.gridAreaMap[key] !== originGridArea[key]) {
        this.gridAreaMap[key] = originGridArea[key];
        if (this.$refs[opacityKey]?.[0]) {
          this.$refs[opacityKey][0].$el.style.opacity = 1;
          this.$refs[opacityKey][0].$el.style.pointerEvents = "auto";
        }
      } else {
        let index = 0;
        if (this.$refs[opacityKey]?.[0]) {
          this.$refs[opacityKey][0].$el.style.opacity = 0;
          this.$refs[opacityKey][0].$el.style.pointerEvents = "none";
        }
        this.gridAreaMap[key] = originGridArea[key].replace(
          /[0-9]+/g,
          (num) => {
            try {
              return { 0: "1", 2: this.row + 1 }[index] || num;
            } catch (error) {
            } finally {
              index++;
            }
          }
        );
        this.gridAreaMap["DisposalProcess"] = "1 / 2 / span 33 / 2";
      }
    },
  },
};
</script>

<style lang="scss" scoped>
.CommandDispatch {
  padding: 24px 12px 21px 12px;
  display: grid;
  grid-template-columns: 1fr 2fr 1fr;
  grid-template-rows: repeat(var(--row), 1fr);
  gap: 18px;

  > div {
    transition: all 0.18s linear;
  }

  ::v-deep {
    .title-button {
      border-radius: 65px;
      font-size: 12px;
    }

    .special-button {
      border-radius: 3px !important;
      padding: 3px;
      height: 26px;
    }
  }
}
</style>
