import createPop from "./createPop";
import regulatorBox from "../components/PopWindow/regulatorBox.vue";
import valveWell from "../components/PopWindow/valveWell.vue";
import flowMeter from "../components/PopWindow/flowMeter.vue";
import pipelineView from "../components/PopWindow/pipelineView.vue";
import lineInfoWindow from "../components/PopWindowGis/lineInfoWindow.vue";
import markerInfoWindow from "../components/PopWindowGis/markerInfoWindow.vue";
import removeLineInfoWindow from "../components/PopWindowGis/removeLineInfoWindow.vue";
import markerInfoWindowWarn from "../components/PopWindowGis/markerInfoWindowWarn.vue";
import troubleInfoWindowWarn from "../components/PopWindowGis/troubleInfoWindowWarn.vue";
import lineInfoWindowWarn from "../components/PopWindowGis/lineInfoWindowWarn.vue";
import { delDeviceInfo } from "@/api/device/deviceInfo";

import workerManInfowindow from "../components/PopWindowGis/workerManInfowindow.vue";
import workerManView from "../components/PopWindowGis/workerManView.vue";
import videoView from "../components/PopWindowGis/videoView.vue";
import videoInfowindow from "../components/PopWindowGis/videoInfowindow.vue";

import { getArray } from "@/utils/gassafety.js";
import { lineColor, mapStyle } from "./mapCommon.js";
import { delPipe } from "@/api/device/pipe.js";
import vue from "../main";
import { Card } from "element-ui";
let defaultCenter = "石家庄";
export let map;
export const DEVICE_TYPE = {
  PIPEPLINE: "1",
  REGEULATORBOX: "2",
  VALUEWELL: "3",
  FLOWMETER: "4",
  DUTYPERSON: "5",
  WORKORDER: "6",
  PRESSUREGAGE: "7",
  INSPECTOR: "8",
  SMALLINSPECTOR: "workPoint",
  TROUBLE: "trouble",
  VIDEO: "10"
};

class gaodeMap {
  // 所有线的数组
  polyLines = [];
  //值班人员的单独数组,轨迹的时候使用
  workerManArr = [];
  troubles = [];
  // 摄像头
  cameras = [];
  // 值班人员对象的arr
  workerManMarkArr = [];
  // 是否开启新增
  lineType = 0;
  // 创建一个新的lineObj
  newLineObj = null;
  // onceFlag=false;
  lineFlag = false;
  mouseTool = null;
  myMap = null;
  showInfoWindow = null;
  // 工人轨迹用的窗口
  markerPassedPolylineInfoWindow = null;
  view = null;
  handleInfoWindowOpenFunc = null;
  onceFlag = false;
  // 用来判断点击左边抽屉列表的时候移动才消失
  leftListClick = false;
  //构造函数中设置中央点默认值
  constructor(center) {
    this.markers = [];
    this.center = center ? center : defaultCenter;
    map = new AMap.Map("container", {
      //mask: addMask(result.districtList[0].boundaries),
      center: [114.72995, 38.37417],
      // resizeEnable: true,
      disableSocket: true,
      viewMode: "3D",
      showLabel: true,
      // labelzIndex: 110,
      pitch: 8,
      zoom: 9,
      //mapStyle: 'amap://styles/darkblue',
      mapStyle
    });
    this.myMap = map;
    this.myMap.on("mousedown", e => {
      console.log(e);
      // if (this.lineType !=1 || this.lineFlag) return;
      this.closeInfoWindow();
      this.polyLinesColorClear();

      this.domAllShow();
      if (this.lineType != 1 || this.lineFlag) return;
      // 除了这里,还要利用vue页面的window事件辅助,当组件出来的时候,就得利用window事件
      if (this.newLineObj) {
        vue
          .$confirm("是否重新画管道")
          .then(() => {
            this.newLineObj.polyEditor.close();
            map.remove(this.newLineObj);
            this.newLineObj = null;
            this.lineFlag = false;
            this.createNewLine();
            //console.log("map点击事件新建");
          })
          .catch(() => {});
      }
      // //console.log("抬起来了");
    });
    // 地图开始平移删除infowindow
    this.myMap.on("movestart", () => {
      // console.log("地图平移");
      // 如果这个值为真,下面都不执行,trac用的,第一额值班人员的infowindow显示的时候被消掉了
      if (this.tracMoveFlag) return;
      if (this.leftListClick) {
        console.log("moveStart");
        this.closeInfoWindow();
      }
      // this.closeInfoWindow();
    });

    // 地图开始缩放删除infowindow
    this.myMap.on("zoomstart", () => {
      // console.log("缩放开始")
      this.domAllShow();
      // 如果这个值为真,下面都不执行,trac用的,第一额值班人员的infowindow显示的时候被消掉了
      if (this.tracMoveFlag) return;
      this.closeInfoWindow();
      this.polyLinesColorClear();
    });
    this.myMap.on("moveend", () => {
      this.tracMoveFlag = false;

      if (this.handleInfoWindowOpenFunc) {
        this.handleInfoWindowOpenFunc();
        this.handleInfoWindowOpenFunc = null;
        this.leftListClick = false;
      }

      // 刚进入页面的时候只调用一次,让左侧的抽屉在地图移动完之后显示
      if (!this.onceFlag) {
        this.onceFlag = true;
        this.view.backFlag = false;
        // 让抽屉不在隐身
        this.view.drawerOpacity = true;
      }

      // 每次地图移动结束,就让地图可以缩放
      let options = this.myMap.getStatus();
      options.scrollWheel = true;
      this.myMap.setStatus(options);
    });
    this.districtBoundaries();
  }
  changeMap(bool) {
    // 卫星图
    if (!bool) {
      if (this.satellite) return;
      this.satellite = new AMap.TileLayer.Satellite();
      this.myMap.addLayer(this.satellite);
    } else {
      if (this.satellite) {
        this.myMap.removeLayer(this.satellite);
        this.satellite = null;
      }
    }
  }
  // 地图移动结束

  /**
   * 获取map
   * @returns {AMap.Map}
   */
  get getMap() {
    return this.map;
  }

  /**
   * 重新设置中央点
   * @param value
   */
  set setCenter(value) {
    this.center = value;
    this.districtBoundaries();
  }

  resetMapCenter(value) {
    map.setCenter(value);
  }

  /**
   * 设置城市边界
   */

  districtBoundaries() {
    let that = this;
    let opts = {
      subdistrict: 0,
      extensions: "all",
      level: "city"
    };
    let district = new AMap.DistrictSearch(opts);
    district.search(that.center, function(status, result) {
      if (status == "complete") {
        let defaultCenter = [];
        defaultCenter.push(result.districtList[0].center.lng);
        defaultCenter.push(result.districtList[0].center.lat);
        map.setCenter(defaultCenter);
        let bounds = result.districtList[0].boundaries;
        for (let i = 0; i < bounds.length; i += 1) {
          new AMap.Polyline({
            path: bounds[i],
            strokeColor: "#0088ff",
            strokeWeight: 5,
            strokeOpacity: 7,
            map: map
          });
        }
      }
    });
  }
  // 地图中点平移
  panTo(lnglat) {
    this.myMap.panTo(lnglat);
  }
  /**
   * 添加Market
   * @param markerType
   * @param lnglats
   */
  addMarker(markerType, data) {
    let that = this;
    that.markerType = markerType;
    let infoWindow = new AMap.InfoWindow({
      isCustom: true,
      offset: new AMap.Pixel(24, -38),
      anchor: "left-top"
    });
    infoWindow.on("mouseover", function() {
      let options = map.getStatus();
      options.scrollWheel = false;
      map.setStatus(options);
    });
    infoWindow.on("mouseout", function() {
      let options = map.getStatus();
      options.scrollWheel = true;
      map.setStatus(options);
    });
    // this.infoWindowMove(infoWindow);

    let marker = new AMap.Marker({
      position: [data.longitude, data.latitude],
      map: map,
      offset: new AMap.Pixel(0, 5)
    });
    this.setMarkerIcon(marker);

    // 值班人员的marker
    if (
      DEVICE_TYPE.INSPECTOR == markerType ||
      DEVICE_TYPE.SMALLINSPECTOR == markerType
    ) {
      // 存值
      const {
        createTime,
        locationId,
        longitude,
        latitude,
        userId,
        type
      } = data;
      marker.setExtData({
        createTime,
        locationId,
        pos: [longitude, latitude],
        deviceType: type,
        userId
      });

      marker.markerType = markerType;
      marker.data = data;
      marker.infoWindow = infoWindow;
      marker.on("mouseover", this.wokerManOpen);
      marker.on("mouseout", e => {
        e.target.infoWindow.close();
        this.domAllShow();
      });

      marker.on("mousedown", e => {
        // console.log(data);
        that.closeInfoWindow();
        if (marker.workerPoint) return;
        that.workerManView({
          title: "值班人员轨迹回放",
          target: marker,
          userId
        });
      });
      // workerPoint不加入数组
      if (!marker.workerPoint) {
        this.workerManMarkArr.push(marker);
      }
    }
    // 隐患
    if (DEVICE_TYPE.TROUBLE == markerType) {
      marker.markerType = markerType;
      marker.data = data;
      marker.infoWindow = infoWindow;
      marker.on("mousedown", this.troubleOpen);
      marker.setExtData(data);
      this.troubles.push(marker);
    }
    // 摄像头
    if (DEVICE_TYPE.VIDEO == markerType) {
      // 摄像头
      const {
        longitude,
        latitude,
        videoName,
        videoManagerId,
        resourceId,
        videoAddress,
        type
      } = data;
      marker.setExtData({
        videoManagerId,
        videoName,
        videoAddress,
        resourceId,
        pos: [longitude, latitude],
        deviceType: type
      });
      marker.markerType = markerType;
      marker.data = data;
      marker.infoWindow = infoWindow;
      marker.on("mouseover", this.videoOpen);
      marker.on("mouseout", e => {
        e.target.infoWindow.close();
        this.domAllShow();
      });
      marker.on("mousedown", e => {
        that.closeInfoWindow();
        that.videoView({
          title: "监控",
          target: marker,
          videoManagerId,
          resourceId
        });
      });
      // marker.setExtData(data);
      this.cameras.push(marker);
    }

    if (
      DEVICE_TYPE.WORKORDER != markerType &&
      DEVICE_TYPE.INSPECTOR != markerType &&
      DEVICE_TYPE.SMALLINSPECTOR != markerType &&
      DEVICE_TYPE.TROUBLE != markerType &&
      DEVICE_TYPE.VIDEO != markerType
    ) {
      // marker.content = this.getMarketContent(data, markerInfoWindow);
      marker.infoWindow = infoWindow;
      marker.on("mousedown", that.infoOpen);
      marker.on("mouseout", infoClose);
      marker.setExtData(data);
      that.deviceType = markerType;

      marker.on("click", function(e) {
        if ("edit" == that.mapOperateType) {
          // let editWindow = that.createInfowindow("编辑");
          // editWindow.fileArr =
          //   data.iconUrl != "" && data.iconUrl != undefined
          //     ? [{ url: data.iconUrl }]
          //     : [];
          // editWindow.obj = marker;
          // editWindow.gaoMap = that;
          // editWindow.map = map;
          // editWindow.form = e.target.getExtData();
          // editWindow.show();
        } else if ("delete" == that.mapOperateType) {
          let diviceType = {
            "2": "调压箱",
            "3": "阀门井",
            "4": "流量计",
            "7": "压力表"
          };
          vue
            .$confirm(
              '是否删除名称为"' +
                e.target.getExtData().deviceName +
                '"的' +
                diviceType[markerType] +
                " ?",
              "提示",
              {
                type: "warning"
                // center: true
              }
            )
            .then(() => {
              map.remove(marker);
              that.deleteMarker(markerType, data.deviceId);
            })
            .catch(() => {
              vue.$message({
                type: "info",
                // center:true,
                offset: 100,
                message: "已取消删除"
              });
            });
        } /*else {
          //map.setZoomAndCenter(13, e.target.getPosition());
          let infoWindow = new AMap.InfoWindow({
            isCustom: true,
            offset: new AMap.Pixel(24, -38),
            anchor: "left-top"
          });
          infoWindow.setContent(e.target.content);
          infoWindow.open(map, e.target.getPosition());
        }*/
      });
      marker.on("dragend", function(e) {
        editWindow.form.longitude = e.lnglat.lng;
        editWindow.form.latitude = e.lnglat.lat;
      });
    }

    // 如果这个值为false说明不是workerpoint,就push进去
    if (!marker.workerPoint) {
      this.markers.push(marker);
      map.setZoom("11");
    }
    //map.setFitView();

    function infoClose(e) {
      let options = map.getStatus();
      options.scrollWheel = true;
      map.setStatus(options);
      //infoWindow.close(map, e.target.getPosition());
    }

    // function infoOpen(e) {}

    return marker;
  }
  // 值班人员
  wokerManOpen = e => {
    this.markerType = e.target.markerType;
    e.target.content = this.getMarketContent(e.target.data);
    e.target.infoWindow.setContent(e.target.content);
    e.target.infoWindow.setOffset(new AMap.Pixel(24, -38));
    e.target.infoWindow.open(map, e.target.getExtData().pos);
    this.boxCollision(e.target.infoWindow.dom);
    this.workerManInfoWindow = e.target.infoWindow;
  };
  // 隐患
  troubleOpen = e => {
    this.markerType = e.target.markerType;
    e.target.content = this.getMarketContent(e.target.data);
    e.target.infoWindow.setContent(e.target.content);
    e.target.infoWindow.open(map, e.target.getPosition());
    this.boxCollision(e.target.infoWindow.dom);
    this.workerManInfoWindow = e.target.infoWindow;
  };
  //摄像头
  videoOpen = e => {
    this.markerType = e.target.markerType;
    e.target.content = this.getMarketContent(e.target.data);
    e.target.infoWindow.setContent(e.target.content);
    e.target.infoWindow.setOffset(new AMap.Pixel(24, -38));
    e.target.infoWindow.open(map, e.target.getExtData().pos);
    this.boxCollision(e.target.infoWindow.dom);
    this.workerManInfoWindow = e.target.infoWindow;
  };

  // 鼠标移入设备时候实行的函数
  infoOpen = e => {
    if (e.target.getExtData().alarmState == 1) {
      if (e.target.getExtData().deviceType == 4) {
        this.markerType = "7";
      } else if (e.target.getExtData().deviceType <= 3) {
        this.markerType = +e.target.getExtData().deviceType + 1 + "";
      }
      // console.log("this.markerType", this.markerType);
      // 警告状态这样就要换infowindow
      e.target.content = this.getMarketContent(
        e.target.getExtData(),
        markerInfoWindowWarn
      );
    } else {
      // 初始化为1的时候是没有的,所以需要判断一下
      // that.markerType =
      //   e.target.getExtData().deviceType + "" == 1
      //     ? "2"
      //     : e.target.getExtData().deviceType + "";
      // 上图状态跟后台状态不统一,所以需要判断一下
      if (e.target.getExtData().deviceType == 4) {
        this.markerType = "7";
      } else if (e.target.getExtData().deviceType <= 3) {
        this.markerType = +e.target.getExtData().deviceType + 1 + "";
      }
      console.log("this.markerType");
      e.target.content = this.getMarketContent(
        e.target.getExtData(),
        markerInfoWindow
      );
    }

    let options = map.getStatus();
    options.scrollWheel = false;
    map.setStatus(options);
    e.target.infoWindow.setContent(e.target.content);
    e.target.infoWindow.open(map, e.target.getPosition());

    // 检测是否碰到底部的bottomData
    this.boxCollision(e.target.infoWindow.dom);
    // that.addCloneDome(e.target, infoWindow);
    // infoWindow.close();

    this.markerInfoWindow = e.target.infoWindow;
  };
  /**
   * marker添加拖拽事件
   */
  addMarkerDragg() {
    for (var i = 0; i < this.markers.length; i++) {
      this.markers[i].setDraggable(true);
    }
  }
  /**
   * marker移除拖拽事件
   */
  removeMarkerDragg() {
    for (var i = 0; i < this.markers.length; i++) {
      this.markers[i].setDraggable(false);
    }
  }

  /**
   * 添加marker信息
   * @param data
   * @returns {string}
   */
  getMarketContent(Data, markerInfoWindow) {
    let data = { ...Data };
    data.class = this;
    // console.log("this.markerType", this.markerType);
    switch (this.markerType) {
      case DEVICE_TYPE.REGEULATORBOX: {
        const dom = createPop(markerInfoWindow, {
          title: "调压箱",
          data: data,
          map: map
        });
        const html = dom.$el;
        dom.remove();
        return html;
      }
      case DEVICE_TYPE.VALUEWELL: {
        const dom = createPop(markerInfoWindow, {
          title: "阀门井",
          data: data,
          map: map
        });
        const html = dom.$el;
        dom.remove();
        return html;
      }
      case DEVICE_TYPE.FLOWMETER: {
        const dom = createPop(markerInfoWindow, {
          title: "流量计",
          data: data,
          map: map
        });
        const html = dom.$el;
        dom.remove();
        return html;
      }
      case DEVICE_TYPE.PRESSUREGAGE: {
        const dom = createPop(markerInfoWindow, {
          title: "压力表",
          data: data,
          map: map
        });
        const html = dom.$el;
        dom.remove();
        return html;
      }
      case DEVICE_TYPE.INSPECTOR: {
        const dom = createPop(workerManInfowindow, {
          title: "值班人员",
          data: data,
          map: map
        });
        const html = dom.$el;
        dom.remove();
        return html;
      }
      //值班人员的轨迹的点
      case DEVICE_TYPE.SMALLINSPECTOR: {
        const dom = createPop(workerManInfowindow, {
          title: "值班人员",
          data: data,
          map: map
        });
        const html = dom.$el;
        dom.remove();
        return html;
      }
      case DEVICE_TYPE.TROUBLE: {
        const dom = createPop(troubleInfoWindowWarn, {
          title: "隐患",
          data: data,
          map: map
        });
        const html = dom.$el;
        dom.remove();
        return html;
      }
      case DEVICE_TYPE.VIDEO: {
        console.log("DEVICE_TYPE.VIDEODEVICE_TYPE.VIDEO", DEVICE_TYPE.VIDEO);
        const dom = createPop(videoInfowindow, {
          title: "video",
          data: data,
          map: map
        });
        const html = dom.$el;
        dom.remove();
        return html;
      }
    }
  }

  /**
   * 删除marker
   * @param delType
   * @param deviceId
   */
  deleteMarker(delType, deviceId) {
    if (
      DEVICE_TYPE.REGEULATORBOX == delType ||
      DEVICE_TYPE.VALUEWELL == delType ||
      DEVICE_TYPE.FLOWMETER == delType ||
      DEVICE_TYPE.PRESSUREGAGE == delType
    ) {
      delDeviceInfo(deviceId);
    }
  }

  /**
   * 设置设备图标
   * @param marker
   */
  setMarkerIcon(marker) {
    switch (this.markerType) {
      case DEVICE_TYPE.REGEULATORBOX: {
        let icon = new AMap.Icon({
          //size: new AMap.Size(51, 23),
          image: require("../assets/images/tiaoyaxiang.svg")
        });
        marker.setIcon(icon);
        break;
      }
      case DEVICE_TYPE.VALUEWELL: {
        let icon = new AMap.Icon({
          //size: new AMap.Size(51, 23),
          image: require("../assets/images/famenjing.svg")
        });
        marker.setIcon(icon);
        break;
      }
      case DEVICE_TYPE.FLOWMETER: {
        let icon = new AMap.Icon({
          //size: new AMap.Size(51, 23),
          image: require("../assets/images/liuliangji.svg")
        });
        marker.setIcon(icon);
        break;
      }
      case DEVICE_TYPE.DUTYPERSON: {
        let icon = new AMap.Icon({
          //size: new AMap.Size(51, 23),
          image: require("../assets/images/zhibanrenyuan.svg")
        });
        marker.setIcon(icon);
        break;
      }
      case DEVICE_TYPE.WORKORDER: {
        let icon = new AMap.Icon({
          //size: new AMap.Size(51, 23),
          image: require("../assets/images/zhibanrenyuan.svg")
        });
        marker.setIcon(icon);
        break;
      }
      case DEVICE_TYPE.PRESSUREGAGE: {
        let icon = new AMap.Icon({
          //size: new AMap.Size(51, 23),
          image: require("../assets/images/yalibiao.svg")
        });
        marker.setIcon(icon);
        break;
      }
      case DEVICE_TYPE.INSPECTOR: {
        let icon = new AMap.Icon({
          //size: new AMap.Size(51, 23),
          image: require("../assets/images/zhibanrenyuan.jpg")
        });
        marker.setIcon(icon);
        break;
      }
      case DEVICE_TYPE.SMALLINSPECTOR: {
        let icon = new AMap.Icon({
          opacity: 0.1,
          image: require("../assets/images/zhibanrenyuan.svg")
        });
        marker.workerPoint = true;
        marker.setIcon(icon);
        break;
      }
      //隐患
      case DEVICE_TYPE.TROUBLE: {
        let icon = new AMap.Icon({
          opacity: 0.1,
          image: require("../assets/images/trouble.png")
        });
        marker.setIcon(icon);
        break;
      }
      // 摄像头
      case DEVICE_TYPE.VIDEO: {
        let icon = new AMap.Icon({
          opacity: 0.1,
          image: require("../assets/images/shexiangtou.svg")
        });
        marker.setIcon(icon);
        break;
      }
    }
  }
  changeMarkIcon(marker, iconUrl) {
    let icon = new AMap.Icon({
      opacity: 0.1,
      image: iconUrl
    });
    marker.setIcon(icon);
  }
  workerManView(options) {
    // const {} =options;
    const notice = createPop(workerManView, {
      ...options,
      gaodeMap: this
    });
    notice.show();
  }
  videoView(options) {
    // const {} =options;
    const notice = createPop(videoView, {
      ...options,
      gaodeMap: this
    });
    notice.show();
  }

  //
  trackBack(marker, arr, data) {
    this.tracMoveFlag = true;
    // 飞过去
    this.panTo(arr[0]);
    // 放大
    this.myMap.setZoom(13);
    // 值班人员轨迹回放
    AMap.plugin("AMap.MoveAnimation", () => {
      let lineArr = arr;
      // 各种属性清空
      this.workerManAttrRemove(marker);
      let icon = new AMap.Icon({
        //size: new AMap.Size(51, 23),
        opacity: 0.1,
        image: require("../assets/images/zhibanrenyuan.png")
      });
      marker.moveMarker = new AMap.Marker({
        map: map,
        position: lineArr[0],
        icon,
        offset: new AMap.Pixel(-13, -26)
      });

      marker.polyline = new AMap.Polyline({
        map: map,
        path: lineArr,
        showDir: true,
        strokeColor: "#2EE7E7", //线颜色
        // strokeOpacity: 1,     //线透明度
        strokeWeight: 6 //线宽
        // strokeStyle: "solid"  //线样式
      });

      marker.passedPolyline = new AMap.Polyline({
        map: map,
        strokeColor: "#AF5", //线颜色
        cursor: "pointer",
        strokeWeight: 6 //线宽
      });

      // removeLineInfoWindow

      marker.passedPolyline.on("mousedown", e => {
        const dom = createPop(removeLineInfoWindow, {
          map: this,
          marker
        });
        marker.infoWindow = new AMap.InfoWindow({
          isCustom: true,
          autoMove: true,
          content: dom.$el,
          //信息船体偏移量
          // offset: new AMap.Pixel(20, 20),
          anchor: "left-top"
        });
        marker.infoWindow.setOffset(new AMap.Pixel(10, -20));
        marker.infoWindow.open(map, e.lnglat);
        // infoWindow.on("mousedown",(e)=>{
        //   e.stopPropagation();

        // })
        this.markerPassedPolylineInfoWindow = marker.infoWindow;
      });

      marker.moveMarker.on("moving", function(e) {
        marker.passedPolyline.setPath(e.passedPath);
      });
      // 刚开始的时候要立个点
      let workPoint = this.addMarker(DEVICE_TYPE.SMALLINSPECTOR, data[0]);
      this.wokerManOpen({
        target: workPoint,
        lnglat: workPoint.getExtData().pos
      });
      marker.pointArr.push(workPoint);
      marker.moveMarker.on("moveend", e => {
        // 如果不是最后一个点,就创建一个新的worderpoint,如果是就不创建,并且把自身删除
        let z = {};
        if (e.index == lineArr.length - 1) {
          z = {
            target: marker,
            lnglat: e.passedPos
          };
          map.remove(marker.moveMarker);
        } else {
          workPoint = this.addMarker(DEVICE_TYPE.SMALLINSPECTOR, data[e.index]);
          // workPoint.infoWindow.open(map,e.passedPos);
          z = {
            target: workPoint,
            lnglat: e.passedPos
          };
          marker.pointArr.push(workPoint);
        }
        this.wokerManOpen(z);
      });
      marker.moveMarker.on("moveAlong", () => {
        console.log("moveAlong", e);
      });
      marker.moveMarker.moveAlong(lineArr, {
        // 每一段的时长
        duration: 1200,
        // JSAPI2.0 是否延道路自动设置角度在 moveAlong 里设置
        autoRotation: false
      });
      // map.setFitView();
    });
  }
  workerManAttrRemove(marker) {
    marker.moveMarker && marker.moveMarker.stopMove();
    marker.moveMarker && map.remove(marker.moveMarker);
    marker.polyline && map.remove(marker.polyline);
    marker.passedPolyline && map.remove(marker.passedPolyline);
    if (marker.pointArr?.length > 0) {
      marker.pointArr.forEach(item => {
        map.remove(item);
      });
    }
    marker.pointArr = [];
  }

  /**
   * 添加折线
   * @param path
   */
  addPolyline(arr) {
    // this` polyLines = [];
    //console.log("包装的数组", arr);
    for (let i = 0; i < arr.length; i++) {
      const item = arr[i];
      let { coordinates, pipePressure } = item;
      console.log(pipePressure);
      // //console.log("coordinates",coordinates)
      // let path = coordinates ? getArray(coordinates) :[];
      // 字符串转二维数组
      let path = coordinates ? eval(coordinates) : [];
      let polyline = new AMap.Polyline({
        path,
        strokeColor: lineColor[pipePressure],
        strokeWeight: 4,
        strokeOpacity: 0.9,
        zIndex: 50,
        bubble: false,
        geodesic: true,
        cursor: "pointer",
        extData: {
          type: "line",
          //当前line状态 0:正常状态 1:正在编辑状态
          isState: 0,
          lineData: item,
          class: this
        }
      });

      this.polyLines.push(polyline);
      // 信息窗体
      this.newLineAddEvent(polyline);
      //添加事件
      polyline.on("mousedown", this.polylineMouseOver);
      polyline.on("mouseover", () => {
        // lineColor

        polyline.setOptions({ strokeColor: "#F7FE38" });
      });
      polyline.on("mouseout", e => {
        // console.log("polyline.getExtData().lineData.alarmState",polyline.getExtData().lineData.alarmState)
        if (polyline.getExtData().lineData.alarmState == 1) {
          polyline.setOptions({ strokeColor: "#ff0000" });
        } else {
          polyline.setOptions({ strokeColor: lineColor[pipePressure] });
        }
        // infoWindow.close();
      });
      // 计算info的位置
      // function infoPosition() {}
    }
    map.add(this.polyLines);
    // 缩放地图到合适的视野级别
    // map.setFitView();
  }
  // 鼠标移入线条执行
  polylineMouseOver = e => {
    let polyline = e.target;
    if (this.lineType == 1) return;
    // 生成infoWindow
    let infoWindow;
    // 警告状态时
    const item = e.target.getExtData().lineData;
    // console.log("item",item)
    if (e.target.getExtData().lineData.alarmState == 1) {
      infoWindow = this.lineMouseOver(polyline, lineInfoWindowWarn, item);
    } else {
      infoWindow = this.lineMouseOver(polyline, lineInfoWindow, item);
    }

    infoWindow.open(map, e.lnglat);
    // 如果是鼠标真正移入,则计算位置,如果不是鼠标真正移入,是人为执行出现infowindow,则不计算位置
    console.log("e.originEvent", e.originEvent);
    if (e.originEvent && 0) {
      // 上方导航的高
      const topBar = 81;
      // 坐标导航的宽
      const leftBar = 100;
      // 屏幕可视区的宽高
      const {
        clientWidth: windowClientWidth,
        clientHeight: windowClientHeight
      } = document.body;
      // 弹出的信息窗口的宽高

      const {
        offsetWidth: infoWindowWidth,
        offsetHeight: infoWindowHeight
      } = infoWindow.dom;
      // 鼠标碰到线后的位置
      const { clientX: mouseClientX, clientY: mouseClientY } = e.originEvent;
      // 鼠标到左边界的距离
      const offsetLeftX = mouseClientX - 100;
      // 鼠标到右边界的距离
      const offsetRightX = windowClientWidth - mouseClientX;
      const offsetTopY = mouseClientY - 81;
      const offsetBottomY = windowClientHeight - mouseClientY;

      const offsetY = mouseClientY - 80 - infoWindowHeight;
      let X = 20,
        Y = -20;
      if (offsetLeftX <= infoWindowWidth) {
        //console.log("靠左了");
        X = 20;
      } else if (offsetRightX <= infoWindowWidth) {
        //console.log("靠右了");
        X = -infoWindowWidth - 20;
      }
      if (offsetTopY <= infoWindowHeight) {
        //console.log("靠上了");
        Y = 20;
      } else if (offsetBottomY <= infoWindowHeight + 81) {
        //console.log("靠下了");
        Y = -infoWindowHeight - 20;
      }
      if (polyline.getExtData().lineData.alarmState == 1) {
        polyline.setOptions({ strokeColor: "#ff0000" });
      } else {
        polyline.setOptions({ strokeColor: "#FF5A67" });
      }
      infoWindow.setOffset(new AMap.Pixel(X, Y));
    } else {
      infoWindow.setOffset(new AMap.Pixel(20, -20));
      this.polyLinesColorClear(polyline);
      // polyline.setOptions({ strokeColor: "#F7FE38" });
    }

    this.boxCollision(infoWindow.dom);
    this.showInfoWindow = infoWindow;
    // const
  };
  // 所有的线的颜色归位,如果是报警的,就红色,不是就蓝色
  polyLinesColorClear(polyline) {
    this.polyLines.forEach(item => {
      if (item != polyline) {
        if (item.getExtData().lineData.alarmState == 1) {
          item.setOptions({ strokeColor: "#ff0000" });
        } else {
          const { pipePressure } = item.getExtData().lineData;
          item.setOptions({ strokeColor: lineColor[pipePressure] });
        }
      }
    });
  }

  lineMouseOver(polyline, lineInfoWindow, item) {
    let dom = createPop(lineInfoWindow, {
      obj: { a: 123, editorPage: true, ...item, polyline }
    });
    dom.$el.addEventListener("mouseover", () => {
      let options = this.myMap.getStatus();
      options.scrollWheel = false;
      this.myMap.setStatus(options);
    });
    dom.$el.addEventListener("mouseout", () => {
      let options = this.myMap.getStatus();
      options.scrollWheel = true;
      this.myMap.setStatus(options);
    });
    let infoWindow = new AMap.InfoWindow({
      isCustom: true,
      autoMove: true,
      content: dom.$el,
      //信息船体偏移量
      // offset: new AMap.Pixel(0, 0),
      anchor: "left-topr"
    });
    polyline.infoWindow = infoWindow;
    return infoWindow;
  }
  // 碰撞检测
  boxCollision(infowindowDom) {
    // gis地图页面的bottomdata组件
    const {
      Bottom: { $el: pageDomBottom },
      Right: { $el: pageDomRight }
    } = this.view.$refs;
    this.mathWho(infowindowDom, pageDomBottom, "bottomDataShow", "bottom");
    this.mathWho(infowindowDom, pageDomRight, "rightDataShow", "right");
  }
  // domAttr view里的属性
  //attr 存储在类里的值
  mathWho(infowindowDom, pageDom, domAttr, attr) {
    let {
      offsetTop: ay,
      offsetLeft: ax,
      offsetWidth: aw,
      offsetHeight: ah
    } = pageDom;
    let {
      y: by,
      x: bx,
      width: bw,
      height: bh
    } = infowindowDom.getBoundingClientRect();
    // 如果组件消失了ay回变成0,所以要记录一下,当它为0的时候取记录的值
    if (ay != 0) {
      // this.ay = ay;
      this[attr + "y"] = ay;
    } else {
      // ay = this.ay;
      ay = this[attr + "y"];
    }

    if (ax != 0) {
      // this.ax = ax;
      this[attr + "x"] = ax;
    } else {
      // ax = this.ax;
      ax = this[attr + "x"];
    }
    console.log("ay", ay);
    if (by + bh >= ay && bx + bw >= ax) {
      console.log("隐藏");
      this.view[domAttr] = false;
    } else {
      console.log("显示");
      this.view[domAttr] = true;
    }
  }
  domAllShow() {
    this.view.bottomDataShow = true;
    this.view.rightDataShow = true;
  }

  // 把map里的in佛window转化成vue里的dom
  addCloneDome(target, infoWindow) {
    target.cloneDom = infoWindow.dom.cloneNode(true);

    target.cloneDom.style.top = infoWindow.dom.offsetTop + 80 + "px";
    target.cloneDom.style.left = infoWindow.dom.offsetLeft + 100 + "px";
    // 先删除之前的,后增加现在的
    this.closeInfoWindow();

    document.body.appendChild(target.cloneDom);
    this.cloneDom = target.cloneDom;
    this.cloneDom.addEventListener("mousedown", e => {
      // e.stopPropagation();
      // console.log("this");
    });

    infoWindow.close();
  }
  closeInfoWindow() {
    this.removeCloneDom();
    this.showInfoWindow && this.showInfoWindow.close();
    // 删除浮动到线上的cloneDom
    this.markerInfoWindow && this.markerInfoWindow.close();
    this.workerManInfoWindow && this.workerManInfoWindow.close();
    // 工人的轨迹线条用的
    this.markerPassedPolylineInfoWindow &&
      this.markerPassedPolylineInfoWindow.close();
  }
  // infoWindow的拖拽
  infoWindowMove(infoWindow) {
    let disX, disY, dom;
    infoWindow.on("mousedown", e => {
      dom = e.target.dom;
      disX = e.originEvent.clientX - dom.offsetLeft;
      disY = e.originEvent.clientY - dom.offsetTop;
      console.log(disX, disY);
      window.addEventListener("mousemove", windowMove);
    });
    const windowMove = e => {
      const mouseX = e.clientX;
      const mouseY = e.clientY;
      const domTop = mouseY - disY;
      const domLeft = mouseX - disX;
      // console.log(domTop,domLeft)
      dom.style.top = domTop + "px";
      dom.style.left = domLeft + "px";
    };
    infoWindow.on("mouseup", () => {
      window.removeEventListener("mousemove", windowMove);
    });
  }
  // 关闭转化到vue的dom
  removeCloneDom() {
    // 线
    this.cloneDom && document.body.removeChild(this.cloneDom);
    // 设备
    // this.markerCloneDom && document.body.removeChild(this.markerCloneDom);
    // 值班人员
    // this.workerManCloneDom && document.body.removeChild(this.workerManCloneDom);

    // that.workerManInfoWindow = infoWindow;
    this.cloneDom = null;
    // 关闭以前的infowindow
    // this.markerCloneDom = null;
    // this.workerManCloneDom = null;
  }
  // 新建line增加编辑以及右键菜单

  // 创建一条新的线
  createNewLine() {
    map.remove(this.markerOverlays);
    this.mouseTool.polyline({
      // bubbles:false,
      strokeWeight: 4,
      strokeColor: "#80d8ff",
      extData: {
        type: "newLine",
        //当前line状态 0:正常状态 1:正在编辑状态
        isState: 0
      }
      //同Polyline的Option设置
    });
    // 让它不再等于null
    // this.newLineObj={a:123}
  }
  // 创建出来的新线归位,重置,当点击编辑跟删除的时候
  newLineReset() {
    this.lineFlag = false;
    if (this.mouserTool) {
      this.mouseTool.close();
    }
    if (this.newLineObj) {
      this.newLineObj.polyEditor.close();
      map.remove(this.newLineObj);
      this.newLineObj = null;
    }
  }

  // 新line与老line添加点击事件
  newLineAddEvent(obj) {
    obj.polyEditor = new AMap.PolyEditor(map, obj);
    // obj.polyEditor.on('adjust',(e)=>{
    //   //console.log("addnode")
    // })
    obj.on("mousedown", e => {
      //console.log(e.originEvent);
      //console.log("lineType", this.lineType);
      this.lineFlag = true;
      // 每次点击关闭然后再次激活
      // 如果是新线就关闭
      if (obj.getExtData().type == "newLine") {
        this.mouseTool.close();
      }
      // 删除
      if (this.lineType == 3) {
        this.lineDelete(obj);
        return;
      }
      // 获取当前状态 0普通状态,1是正编辑状态
      const { isState, type } = obj.getExtData();
      // 如果不是新线的时候并且没点编辑,点击是无效的
      if (type != "newLine" && this.lineType != 2) return;
      if (isState == 0) {
        // 如果是0,就打开编辑,变成编辑状态
        obj.polyEditor.open();
        let opstions = obj.getExtData();
        opstions.isState = 1;
        //console.log(opstions);
        obj.setExtData(opstions);
      } else {
        // 经纬度
        const lnglatsArr = obj.getPath().map(item => [item.lng, item.lat]);
        // 管道总长度
        const pipeLength = obj.getLength();
        // 传回来的数据 如果是新管道就是空
        const lineData = type == "newLine" ? {} : obj.getExtData().lineData;
        // const lineData =  obj.getExtData().lineData;
        //console.log("lineData===================>传入组件的数据", lineData);
        this.infoWindowPipelineView({
          target: obj,
          lineType: type,
          lnglatsArr,
          pipeLength,
          lineData
        });
      }
    });
  }
  // 隐藏所有管道
  lineShow(bool) {
    bool
      ? this.polyLines.forEach(item => item.show())
      : this.polyLines.forEach(item => item.hide());
    if (this.newLineObj) {
      bool ? this.newLineObj.show() : this.newLineObj.hide();
    }
  }
  markerShow(type, bool) {
    this.markers.forEach(item => {
      const { deviceType, troubleId } = item.getExtData();

      if (type == 8 && troubleId) {
        bool ? item.show() : item.hide();
      } else if (deviceType == type) {
        // 如果是值班人员,还要隐藏身上的线条以及marker
        if (type == 9) {
          if (bool) {
            item.moveMarker && item.moveMarker.show();
            item.polyline && item.polyline.show();
            item.passedPolyline && item.passedPolyline.show();
            if (item.pointArr?.length > 0) {
              item.pointArr.forEach(item => {
                item.show();
              });
            }
          } else {
            item.moveMarker && item.moveMarker.hide();
            item.polyline && item.polyline.hide();
            item.passedPolyline && item.passedPolyline.hide();
            if (item.pointArr?.length > 0) {
              item.pointArr.forEach(item => {
                item.hide();
              });
            }
          }
        }
        bool ? item.show() : item.hide();
      }
      // //console.log("deviceType",deviceType);
    });
  }
  lineDelete(obj) {
    const {
      lineData: { pipeName }
    } = obj.getExtData();
    vue
      .$confirm(`是否删除名称为"${pipeName}"的管道 ?`, "提示", {
        // confirmButtonText: "确定",
        // cancelButtonText: "取消",
        type: "warning"
        // center: true
      })
      .then(() => {
        const {
          lineData: { pipeId }
        } = obj.getExtData();
        //console.log(pipeId);
        delPipe(pipeId).then(res => {
          const index = this.polyLines.indexOf(obj);
          // 如果是老线,就要线删除原来的,然后重新包装一遍
          if (index >= 0) {
            this.polyLines.splice(index, 1);
            map.remove(obj);
          }
          vue.$message({
            type: "success",
            offset: 100,
            // center:true,
            message: "删除成功!"
          });
          // 关闭当前线条的infowindow
          // this.closeLineInfoWindow();
        });
      })
      .catch(() => {
        vue.$message({
          type: "info",
          // center:true,
          offset: 100,
          message: "已取消删除"
        });
      });
  }
  // 关闭所有已经上传的线的编辑状态
  linePolyEditorAllClose() {
    this.polyLines.forEach(item => {
      item.polyEditor.close();
      let opstions = item.getExtData();
      opstions.isState = 0;
      item.setExtData(opstions);
      let attr = item.getOptions();
      attr.strokeColor = "#2EE7E7";
      item.setOptions(attr);
    });
  }

  // 传进组件的会调 点确认的时候调
  lineOkCallBack(target, data) {
    target.polyEditor.close();
    const index = this.polyLines.indexOf(target);
    // 如果是老线,就要线删除原来的,然后重新包装一遍
    if (index >= 0) {
      this.polyLines.splice(index, 1);
    }
    //console.log("data999-=================>传回来的data", data);
    this.addPolyline([data]);
    map.remove(target);
    // //console.log('polyLines',this.polyLines)
  }
  // 上传服务器用的组件

  infoWindowPipelineView(options) {
    // const {} =options;
    const notice = createPop(pipelineView, {
      title: "管道",
      // 数据
      // lineData: options.lineData,
      // lnglatsArr:options.lnglatsArr,
      // pipeLength:options.pipeLength,
      // //线是新线还是老线
      // lineType: options.lineType,
      // target: options.obj,
      ...options,
      //把当前对象当作that传进去
      gaodeMap: this,
      lineOkCallBack: this.lineOkCallBack
    });
    notice.show();
  }

  /**
   * 添加鼠标事件
   */
  addMouseTool() {
    this.mouseTool = new AMap.MouseTool(map);
    //监听draw事件可获取画好的覆盖物
    this.overlays = [];
    let that = this;
    this.markerOverlays = [];
    this.mouseTool.on("draw", function(e) {
      if (e.obj.getExtData().type != "newLine") {
        map.remove(that.markerOverlays);
        const device = that.createInfowindow("新增");
        device.map = map;
        device.obj = e.obj;
        device.gaoMap = that;
        e.obj.on("click", function(aa) {
          let postion = aa.target._position;
          //兼容拖拽后单击事件,拖拽后点击事件返回位置为数组
          if (postion instanceof Array) {
            device.form.longitude = postion[0];
            device.form.latitude = postion[1];
          } else {
            device.form.longitude = postion.lng;
            device.form.latitude = postion.lat;
          }

          device.show();
        });
        e.obj.on("mouseover", function() {
          that.mouseTool.close();
        });

        e.obj.on("mouseout", function() {
          that.draw(that.deviceType);
        });

        that.markerOverlays.push(e.obj);
      }

      if (e.obj && e.obj.getExtData().type == "newLine") {
        //console.log("挂上事件");
        that.newLineAddEvent(e.obj);
        // 记录这条线
        // //console.log(e.obj.getPath().length)
        // 如果只有一个点,并没有连成线的时候就不close 大于一个点的时候才执行clse
        //console.log(that.lineType)
        if (e.obj.getPath().length > 1) {
          that.newLineObj = e.obj;
          that.mouseTool.close();
        } else {
          // that.newLineObj = null;
        }
        // 关闭
        // 创建一条新线,然后在点地图的时候删除原来的旧线
        // that.createNewLine();

        // 右键菜单
        // that.addEditorAndMenu(e.obj)
      }

      // if(e.obj.getExtData().type=="line"){
      //   return;
      // }
      //that.mouseTool.close();
      that.overlays.push(e.obj);
    });
  }

  /**
   * 创建弹框事件
   */
  createInfowindow(val) {
    switch (this.deviceType) {
      case DEVICE_TYPE.PIPEPLINE: {
        break;
      }
      case DEVICE_TYPE.REGEULATORBOX: {
        return createPop(regulatorBox, {
          title: val + "调压箱"
        });
      }
      case DEVICE_TYPE.VALUEWELL: {
        return createPop(valveWell, {
          title: val + "阀门井"
        });
      }
      case DEVICE_TYPE.FLOWMETER: {
        return createPop(flowMeter, {
          title: val + "流量计"
        });
      }
      case DEVICE_TYPE.PRESSUREGAGE: {
        return createPop(flowMeter, {
          title: val + "压力表"
        });
      }
    }
  }

  /**
   * 鼠标画图事件
   * @param deviceType 设备类型
   */
  draw(deviceType) {
    let that = this;
    that.deviceType = deviceType;
    if (
      DEVICE_TYPE.REGEULATORBOX == deviceType ||
      DEVICE_TYPE.VALUEWELL == deviceType ||
      DEVICE_TYPE.FLOWMETER == deviceType ||
      DEVICE_TYPE.PRESSUREGAGE == deviceType
    ) {
      that.mouseTool.marker({
        draggable: true
      });
    }
    if (DEVICE_TYPE.PIPEPLINE == deviceType) {
      that.mouseTool.polyline({
        strokeWeight: 9,
        strokeColor: "#80d8ff"
        //同Polyline的Option设置
      });
    }
  }

  /**
   * 添加地图控件
   */
  addMapControl() {
    AMap.plugin(
      [
        "AMap.ToolBar",
        "AMap.Scale",
        "AMap.HawkEye",
        "AMap.MapType",
        "AMap.Geolocation"
      ],
      function() {
        // 在图面添加工具条控件,工具条控件集成了缩放、平移、定位等功能按钮在内的组合控件
        //map.addControl(new AMap.ToolBar());

        // 在图面添加比例尺控件,展示地图在当前层级和纬度下的比例尺
        map.addControl(new AMap.Scale());

        // 在图面添加鹰眼控件,在地图右下角显示地图的缩略图
        map.addControl(new AMap.HawkEye({ isOpen: true }));

        // 在图面添加类别切换控件,实现默认图层与卫星图、实施交通图层之间切换的控制
        map.addControl(
          new AMap.MapType({ position: { top: "10px", left: "100px" } })
        );

        // 在图面添加定位控件,用来获取和展示用户主机所在的经纬度位置
        // map.addControl(new AMap.Geolocation());
      }
    );
  }

  searchTips(inputId) {
    let that = this;
    AMap.plugin(["AMap.AutoComplete", "AMap.PlaceSearch"], function() {
      //输入提示
      // var autoOptions = {
      //   input: inputId
      // };
      // let auto = new AMap.AutoComplete(autoOptions);
      that.placeSearch = new AMap.PlaceSearch({
        map: map
      });
      //构造地点查询类
      // auto.on("select", function(e) {
      //   that.searchSelectAdcode = e.poi.adcode;
      //   that.searchSelectName = e.poi.name;
      // });
    });
  }

  closeAddMarker() {
    this.mouseTool.close();
    map.remove(this.markerOverlays);
  }
}
export default gaodeMap;