<script setup>
import { $c } from "ayin-color";
const { proxy } = getCtx();

import symbol from "./map/symbol.json";
import counter from "./map/map-counter.vue";
import { httpGetMap } from "@/api/api.js";


const state = reactive({
  map: {},
  colors: {
    pin_A: $c.cyl6,
    pin_B: $c.cbl6,
    font: $c.cbl3,
    fontHov: $c.wh,
    mapBG_A: $c.blA13,
    mapBG_B: $c.blA18,
    mapBG_hov_A: $c.cbA10,
    mapBG_hov_B: $c.blA15,
    mapBD_A: $c.cbA12,
    mapBD_B: $c.cbA13,
    mapGlow: $c.cbl7,
    visualMap: [$c.fade("cbA13", 0.7), $c.fade("blA19", 0.7)],
  },
  chartData: {
    alladcode: [],
    geoJson: {},
    dept: [{ code: 0, name: "liaoningMap" }],
    mapData: [],
    pointData: [],
    pinData: [],
    circleData: [],
    warningData: [],
    dangerData: [],
    sum: 0,
    maxData: 1000,
    minData: 0,
    maxPin: 90,
    minPin: 20,
    layoutCenter: ["50%", "53%"],
    layoutSize: "90%",
    visualMapPos: {
      right: "26.5%",
      bottom: "5%",
    },
  },
  chartInstance: "",
  chartOption: { update: false },
  clickData: {
    show: false,
    area: "北京",
    data: "325",
    info: "文字信息",
    x: 120,
    y: 120,
  },
});

const { colors, chartData, chartOption } = state;

const initChart = () => {
  state.chartData.geoJson.code = 0;
  state.chartData.geoJson.name = "liaoningMap";
  echarts.registerMap("liaoningMap", state.chartData.geoJson);
  state.chartInstance = echarts.init(proxy.$refs.map);

  getMapData();
};

const getMapData = () => {
  let mapData = [],
    pointData = [],
    pinData = [],
    circleData = [],
    warningData = [],
    dangerData = [],
    sum = 0,
    topIndex = [12, 8, 6, 7, 11, 14],
    warnIndex = [13, 5],
    dangerIndex = [3];

  state.chartData.geoJson.features.forEach((geo, i) => {
    if (geo.properties.name) {
      let value = proxy.randomNumber(1, chartData.maxData / 3);
      let maxValue = proxy.randomNumber(
        chartData.maxData / 2,
        chartData.maxData
      );

      if (geo.properties.center) {
        if (topIndex.includes(i)) {
          let pin = {
            name: geo.properties.name,
            value: [
              geo.properties.center[0],
              geo.properties.center[1],
              maxValue,
            ],
            cityCode: parseInt(geo.properties.adcode),
          };
          pinData.push(pin);
          pointData.push(pin);
        } else if (warnIndex.includes(i)) {
          warningData.push({
            name: geo.properties.name,
            value: [
              geo.properties.center[0],
              geo.properties.center[1],
              "warning",
              "区域数据触发异常告警",
            ],
            cityCode: parseInt(geo.properties.adcode),
          });
        } else if (dangerIndex.includes(i)) {
          dangerData.push({
            name: geo.properties.name,
            value: [
              geo.properties.center[0],
              geo.properties.center[1],
              "danger",
              "区域数据触发危急告警",
            ],
            cityCode: parseInt(geo.properties.adcode),
          });
        } else {
          if (value < 100) {
            value = 0;
          }
          let circle = {
            name: geo.properties.name,
            value: [geo.properties.center[0], geo.properties.center[1], value],
            cityCode: parseInt(geo.properties.adcode),
          };
          pointData.push(circle);
          circleData.push(circle);
        }
      }
      sum += value;
    }
  });
  state.chartData.mapData = mapData;
  state.chartData.pointData = pointData;
  state.chartData.pinData = pinData;
  state.chartData.circleData = circleData;
  state.chartData.warningData = warningData;
  state.chartData.dangerData = dangerData;
  state.chartData.sum = sum;

  processOption();
};

const processOption = (current) => {
  current = state.chartData.dept[0];
  const { visualMapPos, layoutCenter, layoutSize } = state.chartData;
  let tempOption = {
    title: {
      show: false,
      text: current.name,
      left: "center",
    },
    geo: {
      type: "map",
      map: current.name,
      roam: true,
      scaleLimit: {
        min: 0.5,
        max: 3,
      },
      //zoom :1.2,
      layoutCenter: layoutCenter,
      layoutSize: layoutSize,
      zlevel: 1,
      label: {
        show: true,
        color: colors.font,
        fontSize: 12,
        formatter: (p) => {
          return p.name;
        },
        //offset:[0,10],
      },

      itemStyle: {
        borderColor: new echarts.graphic.LinearGradient(
          0,
          0,
          0,
          1,
          [
            { offset: 0, color: colors.mapBD_A },
            { offset: 1, color: colors.mapBD_B },
          ],
          false
        ),
        borderWidth: 2,
        shadowColor: colors.mapGlow,
        shadowOffsetY: 0,
        shadowBlur: 10,
        areaColor: {
          x: 0,
          y: 0,
          x2: 0,
          y2: 1,
          colorStops: [
            { offset: 0, color: $c.fade(colors.mapBG_A, 0.5) },
            { offset: 1, color: $c.fade(colors.mapBG_B, 0.5) },
          ],
        },
      },
      select: {
        label: {
          show: true,
          color: colors.fontHov,
          fontSize: 14,
        },
        itemStyle: {
          areaColor: {
            x: 0,
            y: 0,
            x2: 0,
            y2: 1,
            colorStops: [
              { offset: 0, color: $c.lighten(colors.mapBG_hov_A, 0.2) },
              { offset: 1, color: $c.lighten(colors.mapBG_hov_B, 0.2) },
            ],
          },
        },
      },
      emphasis: {
        label: {
          color: colors.fontHov,
          fontSize: 14,
          show: true,
        },
        itemStyle: {
          areaColor: {
            x: 0,
            y: 0,
            x2: 0,
            y2: 1,
            colorStops: [
              { offset: 0, color: $c.fade(colors.mapBG_hov_A, 0.5) },
              { offset: 1, color: $c.fade(colors.mapBG_hov_B, 0.5) },
            ],
          },
        },
      },
    },
    series: [],
  };
  // tempOption.visualMap={

  //   type: "continuous",
  //   right:visualMapPos.right,
  //   bottom:visualMapPos.bottom,
  //   min:0,
  //   max:chartData.maxData,
  //   seriesIndex:0,
  //   orient:"horizontal",
  //   // backgroundColor: 'red',
  //   inRange:{
  //     color:colors.visualMap,
  //   },
  //   textStyle:{
  //     color:colors.font,
  //   },
  //   calculable: true
  // }

  for (let a in tempOption) {
    state.chartOption[a] = tempOption[a];
  }
  processMapData(current);
};

const processMapData = (current) => {
  const {
    mapData,
    pointData,
    pinData,
    circleData,
    warningData,
    dangerData,
    sum,
    dept,
    maxData,
    minData,
    maxPin,
    minPin,
  } = chartData;
  // let currentDept=dept[dept.length-1]
  // let seriesData=convertData(circleData['code'+currentDept.code],currentDept)
  let mapD = [];
  mapD.push(
    {
      data: pointData,
      geoIndex: 0,
      type: "map",
    },
    {
      symbolSize: 5,
      label: {
        position: "center",
        align: "center",
        show: false,
        color: colors.font,
        fontSize: 12,
        formatter: function (para) {
          return para.data.name;
        },
      },
      emphasis: {
        label: {
          show: false,
          fontSize: 14,
          color: colors.fontHov,
          fontWeight: "bold",
        },
      },
      symbolOffset: [0, 0],
      itemStyle: {
        color: "#fff",
      },
      name: "light",
      type: "scatter",
      coordinateSystem: "geo",
      zlevel: 2,
      data: pointData,
    },
    {
      type: "scatter",
      symbol: "circle",
      coordinateSystem: "geo",
      symbolOffset: [0, 0],
      large: true,
      label: {
        show: false,
      },
      emphasis: {
        label: {
          fontSize: 14,
          color: colors.fontHov,
          fontWeight: "bold",
        },
      },
      itemStyle: {
        color: colors.pin_A,
      },
      symbolSize: 20,
      data: circleData,
      zlevel: 2,
    },
    {
      type: "scatter",
      symbol: "pin",
      // type: 'effectScatter',
      // symbol: 'circle',
      coordinateSystem: "geo",
      // rippleEffect: { brushType: 'stroke' },
      // showEffectOn: 'render',
      symbolOffset: [0, 0],
      large: true,
      label: {
        show: true,
        position: "inside",
        //offset:[0 ,5],
        align: "center",
        color: $c.wh,
        fontSize: 14,
        formatter: (p) => {
          if (p.data.value[2].toString().length > 4) {
            return (p.data.value[2] / 10000).toFixed(0) + "万";
          } else {
            return p.data.value[2];
          }
        },
        // rich: { val:{ padding:[20,0,20,0], fontSize: 12, color:$c.re, }, cnNum: { fontSize: 12, color:$c.wh, } },
      },
      emphasis: {
        label: {
          fontSize: 18,
          color: colors.fontHov,
          fontWeight: "bold",
          // formatter: function(para) { return para.data.value[2] },//para.data.name +" : " +
        },
      },
      itemStyle: {
        color: {
          type: "radial",
          x: 0.3,
          y: 0.3,
          r: 0.5,
          colorStops: [
            { offset: 0, color: colors.pin_A },
            { offset: 1, color: colors.pin_B },
          ],
          global: false, // 缺省为 false
        },
      },
      symbolSize: (val) => {
        var a = (maxPin - minPin) / (maxData - minData);
        var b = maxPin - a * minData;
        b = maxPin - a * maxData;
        return a * val[2] + b * 1.3;
      },
      data: pinData,
      zlevel: 2,
    },
    {
      type: "scatter",
      symbol: symbol.icon,
      coordinateSystem: "geo",
      symbolOffset: [0, -10],
      label: { show: false },
      itemStyle: {
        color: {
          type: "radial",
          x: 0.3,
          y: 0.3,
          r: 0.5,
          colorStops: [
            { offset: 0, color: $c.yel1 },
            { offset: 1, color: $c.yel6 },
          ],
          global: false, // 缺省为 false
        },
      },
      symbolSize: 24,
      emphasis: { scale: 1.5 },
      data: warningData,
      zlevel: 2,
    },
    {
      type: "scatter",
      symbol: symbol.icon,
      coordinateSystem: "geo",
      symbolOffset: [0, -10],
      label: { show: false },
      itemStyle: {
        color: {
          type: "radial",
          x: 0.3,
          y: 0.3,
          r: 0.5,
          colorStops: [
            { offset: 0, color: $c.rel3 },
            { offset: 1, color: $c.rel5 },
          ],
          global: false, // 缺省为 false
        },
      },
      symbolSize: 24,
      emphasis: { scale: 1.5 },
      data: dangerData,
      zlevel: 2,
    }
  );
  state.chartOption.series = mapD;
  state.chartInstance.setOption(state.chartOption, true);
};

onMounted(() => {
  httpGetMap("/static/maps/", "nanjingCN.json").then((res) => {
    console.log("mapRes", res);
    state.chartData.alladcode = res;
    state.chartData.geoJson = res;
    initChart();
  });
});
</script>
<template>
  <div class="mapC-wrap">
    <counter></counter>
    <div ref="map" class="full-map"></div>
  </div>
</template>
<style scoped lang="less">
.mapC-wrap {
  .poa;
  .fullbox;

  .full-map {
    .poa;
    .fullbox;
    z-index: 5;
    .bgc(@tr);
  }
}
</style>
