<template>
  <div ref="containerRef" class="map-container">
    <div ref="mapRef" id="YztMap" class="map-container2" />
  </div>
</template>

<script setup lang="ts">
import 'ol/ol.css';
import mmJson from '@/assets/json/mm2.json';
import { olMap } from '@/utils/olMap/olMap';
import {getPointInfoList} from '@/api/globalMap';
import { getDictLabel } from '@/utils/dict';
import { methodList, titleList } from '../data';
import { pointDetailTemplate } from '@/components/Map/mapData';
import useMapStore from '@/store/modules/map';

const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { point_type } = toRefs<any>(proxy?.useDict('point_type'));
const mapStore = useMapStore();
const emits = defineEmits(['handleShowWarehouse', 'handleShowVideo', 'handleShowPeople', 'closeDetailDialog', 'resize']);

const mapRef = ref(null);
const containerRef = ref();
let map, mapUtils;

const mapList = reactive({
  satellite2: [
    { layer: 'map', layerType: 'WMTS', code: 'YZT1708679726700', zIndex: '-100', visible: true },
    { layer: 'map', layerType: 'WFS', code: 'YZT1712111943104', zIndex: '-99', visible: true },
    { layer: 'annotation', layerType: 'WMTS', code: 'YZT1695608158269', zIndex: '-98', visible: true }
  ],
  satellite3: [
    { layer: 'map', layerType: 'WMTS', code: 'YZT1708679726700', zIndex: '-99', visible: true },
    { layer: 'annotation', layerType: 'WMTS', code: 'YZT1695608158269', zIndex: '-98', visible: true }
  ],
  imageMap: [
    { layer: 'map', layerType: 'WMTS', code: 'YZT1640925052482', zIndex: '-99' },
    { layer: 'annotation', layerType: 'WMTS', code: 'YZT1695608158269', zIndex: '-98', visible: true }
  ],
  imageMap2: [
    { layer: 'map', layerType: 'JSON', code: 'gd', zIndex: '-99', visible: true },
    { layer: 'annotation', layerType: 'WMTS', code: 'YZT1695608158269', zIndex: '-98', visible: true }
  ]
});
// 监听地图类型变化
watch(
    () => mapStore.activeMap,
    () => {
      if (!mapUtils) return;
      mapUtils.replaceLayers(mapList[mapStore.activeMap]);
    }
);
watch(
    () => mapStore.showMask,
    () => {
      if (mapStore.showMask) {
        mapUtils.createVecByJson2(mmJson, { strokeWeight: 2 });
      } else {
        mapUtils.removeMask3(true);
      }
    }
);
const init = () => {
  mapStore.setMapLoaded(false);
  mapUtils = new olMap({
    dom: mapRef.value,
    id: mapList[mapStore.activeMap],
    center: mapStore.mapState.center,
    zoom: mapStore.mapState.zoom,
    minZoom: mapStore.mapState.minZoom,
    maxZoom: mapStore.mapState.maxZoom,
    showScale: true,
    drawTool: {
      use: true
    },
    // 加载完成事件
    onLoadCompleted: (YztMap) => {
      map = YztMap;
      mapStore.setMapLoaded(true);
      map.getView().on('change:resolution', () => {
        mapStore.setZoom(map.getView().getZoom().toFixed(2));
      });
      if (mapStore.showMask) {
        mapUtils.createVecByJson2(mmJson, { strokeWeight: 2 });
      }
      // let drawTool = new DrawTool({ mapUtils, map });
      handleResize();
    },
    onMarkerClick: (data) => {
      // 多点位
      if (data.type === '1') {
        let path = [];
        mapStore.pointType.forEach((item) => {
          path.push(item.component);
        });
        getPointInfoList({
          option: path.toString(),
          longitude: data.longitude.toString(),
          latitude: data.latitude.toString()
        }).then((res) => {
          const data2 = res.data.list;
          let content = document.createElement('div');
          // content.style.cssText = 'transform: scale(' + containerScale().scaleX + ');';
          content.className = 'point-info';
          let content2 = '';
          content2 += '<div class="title-box"><div class="gradient-text">多点位信息</div></div>';
          content2 += '<div class="icon1"></div>';
          content2 += '<div class="icon2"></div>';
          content2 += '<div class="icon3"></div>';
          content2 += '<div class="icon4"></div>';
          content.innerHTML = content2;
          let tableBox = document.createElement('div');
          tableBox.className = 'table-box';
          let table = document.createElement('div');
          table.className = 'table';
          table.innerHTML = '<div class="point-item"><div class="td3">主题</div><div class="td3">名称</div></div>';
          data2.forEach((item) => {
            item.longitude = data.longitude;
            item.latitude = data.latitude;
            const div = document.createElement('div');
            div.className = 'point-item point-item-hover';
            div.innerHTML =
                '<div class="td4">' + getDictLabel(point_type.value, item.dataType.toString()) + '</div><div class="td4">' + item.name + '</div>';
            div.addEventListener('click', () => {
              handlePointDetails(item);
            });
            table.appendChild(div);
          });
          tableBox.appendChild(table);
          content.appendChild(tableBox);
          let closeBtn = document.createElement('div');
          closeBtn.className = 'close';
          closeBtn.onclick = () => mapUtils.hideInfo(true);
          content.appendChild(closeBtn);
          mapUtils.showInfo(content, [data.longitude, data.latitude], true);
        });
      } else {
        handlePointDetails(data);
      }
    }
  });
};
const handlePointDetails = (data) => {
  let method = methodList[data.dataType];
  let title = !!titleList[data.dataType] ? titleList[data.dataType] : '信息';
  if (!method) return;
  method(data.id).then((res) => {
    if (!!pointDetailTemplate[data.dataType]) {
      let div = document.createElement('div');
      div.className = 'point-info';
      let titleDom = document.createElement('div');
      titleDom.className = 'title-box';
      titleDom.innerHTML = '<div class="gradient-text">' + title + '</div></div>';
      div.appendChild(titleDom);
      const objs = {
        '2': {
          title: '物资详情',
          method: 'handleShowWarehouse'
        },
        '41': {
          title: '人员列表',
          method: 'handleShowPeople'
        },
        '43': {
          title: '历史轨迹',
          method: 'handleShowTrack'
        }
      };
      let obj = objs[data.dataType];
      if ([4, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58].includes(data.dataType)) {
        obj = {
          title: '附近视频',
          method: 'handleShowVideo'
        };
      }
      if (!!obj) {
        let btnBox = document.createElement('div');
        let btn = document.createElement('div');
        btnBox.className = 'flex';
        btn.className = 'btn';
        btn.innerHTML = '<div class="video-icon"></div>' + obj.title + '<div></div>';
        btn.onclick = () => {
          emits(obj.method, data);
        };
        btnBox.appendChild(btn);
        div.appendChild(btnBox);
      }
      let icon1 = document.createElement('div');
      icon1.className = 'icon1';
      let icon2 = document.createElement('div');
      icon2.className = 'icon2';
      let icon3 = document.createElement('div');
      icon3.className = 'icon3';
      let icon4 = document.createElement('div');
      icon4.className = 'icon4';
      div.appendChild(icon1);
      div.appendChild(icon2);
      div.appendChild(icon3);
      div.appendChild(icon4);
      let table = document.createElement('div');
      table.className = 'table-box';
      let content = '';
      content += '<div class="table">';
      const newData = filterTd(res.rows[0], data.dataType);
      newData.forEach((item) => {
        if (item.type === 'shortText') {
          content += '<div class="tr">';
          item.data.forEach((item2) => {
            content += '<div class="point-item">';
            content += '<div class="td1">' + item2.label + '</div><div class="td2">' + item2.value + '</div>';
            content += '</div>';
          });
          content += '</div>';
        } else {
          content += '<div class="point-item2">';
          content += '<div class="td1">' + item.data[0].label + '</div><div class="td2">' + item.data[0].value + '</div>';
          content += '</div>';
        }
      });
      content += '</div>';
      table.innerHTML = content;
      div.appendChild(table);
      let closeBtn = document.createElement('div');
      closeBtn.className = 'close';
      closeBtn.onclick = () => {
        mapUtils.hideInfo(true);
        emits('closeDetailDialog', data);
      };
      div.appendChild(closeBtn);
      mapUtils.showInfo(div, [data.longitude, data.latitude], -data.scale * data.size[1], true);
    } else if (data.dataType === 'video') {
      emits('handleShowVideoDetail', res.data, true);
    }
  });
};
const filterTd = (obj, dataType) => {
  let data = [];
  let tempData = {};
  let i = 0;
  const pointDetailTemplateObj = pointDetailTemplate[dataType];
  Object.keys(pointDetailTemplateObj).forEach((key) => {
    let keyLabel = pointDetailTemplateObj[key];
    if (!!keyLabel) {
      if (i === 2) {
        i = 0;
      }
      const value = !!obj && !!obj[key] ? obj[key] : '';
      if (value && value.length > 8) {
        if (i === 0) {
          data.push({ type: 'longText', data: [{ label: keyLabel, value: value }] });
          i = 0;
        } else {
          tempData = { type: 'longText', data: [{ label: keyLabel, value: value }] };
        }
      } else {
        if (i === 0) {
          data.push({ type: 'shortText', data: [{ label: keyLabel, value: value }] });
        } else {
          data[data.length - 1].data.push({ label: keyLabel, value: value });
        }
        i++;
        if (!!tempData && JSON.stringify(tempData) !== '{}') {
          data.push(tempData);
          tempData = {};
          i = 0;
        }
      }
    }
  });
  if (!!tempData && JSON.stringify(tempData) !== '{}') {
    data.push(tempData);
  }
  if (data[data.length - 1].data && data[data.length - 1].data.length === 1 && data[data.length - 1].type === 'shortText') {
    data[data.length - 1].type = 'longText';
  }
  return data;
};
const addMarker = (points) => {
  mapUtils.addMarker(points);
};
const clearMarker = () => {
  mapUtils.clearMarker();
};

let inverseScale = ref({
  inverseScaleX: 1,
  inverseScaleY: 1
});
const handleResize = () => {
  if (!containerRef.value) return;
  map.updateSize();
  nextTick(() => {
    emits('resize');
  });
};
const getMap = () => {
  return map;
};
const getMapUtils = () => {
  return mapUtils;
};
const getDrawTool = () => {
  return mapUtils.getDrawTool();
};
const addSearchMarker = (item) => {
  return mapUtils.addSearchMarker(item);
};
// 加载事件
onMounted(() => {
  init();
  window.addEventListener('resize', handleResize);
});
// 卸载事件
onUnmounted(() => {
  window.removeEventListener('resize', handleResize);
});
defineExpose({ getMap, getMapUtils, addSearchMarker, getDrawTool, addMarker, clearMarker });
</script>

<style scoped>
@import '../map.scss';
.map-container2 {
  width: 100%;
  height: 100%;
  position: relative;
  overflow: hidden;
}
.map-container {
  width: 100%;
  height: 100%;
  position: relative;
  :deep(.ol-scale-line) {
    left: unset;
    bottom: 16px;
    right: 48px;
    background-color: transparent;
  }
  :deep(.ol-scale-line-inner) {
    color: #ffffff;
    border: 1px solid #fff;
    border-top: none;
  }
}
</style>
