<template>
  <div style="position: relative">

    <!-- 组织路由 -->
    <div class="div_top">
      <div class="router_line"></div>
      <div class="div_router">
        <span class="router_parents"
              v-for="(item,index) in runAgencyArray"
              @click="handleClickAgency(index)"
              :key="index">{{item.name}}<span class="arrow">></span></span>

        <span class="router_child">{{orgData.name}}</span>
      </div>
    </div>

    <people-search v-show="orgLevel==='search'"
                   @toSubAgency="toSubAgency"
                   ref="ref_search"></people-search>
    <people v-if="orgLevel==='people'"
            :uid="selUserId"
            ref="ref_people"></people>

    <div v-show="orgLevel!=='people' && orgLevel!=='search'"
         class="div_content">

      <basic-info-community v-show="orgLevel==='neighborHood'"
                            @toSubAgency="toSubAgency"
                            ref="ref_community"
                            @refreshInfoList="refreshInfoList"></basic-info-community>

      <div v-show="orgLevel!=='people' && orgLevel!=='search' && orgLevel!=='neighborHood'"
           class="div_map"
           id="map"
           ref="map">
        <!-- <div id="map"
             class="map"></div> -->
      </div>

      <div class="popup"
           ref="popup">
      </div>

      <div class="div_data">
        <div class="div_search">
          <el-input size="mini"
                    @focus="handleSearch"
                    WarningColor='warning'
                    placeholder="请输入姓名">
            <i slot="prefix"
               class="icon">
              <img src="../../../../assets/img/modules/visual/sousuo.png"
                   alt />
            </i>
          </el-input>

          <div class="btn"
               @click="handleSearch">搜索</div>

        </div>

        <div class="div_info">
          <el-scrollbar style="height:100%">
            <div class="info_tip">
              <img src="../../../../assets/img/shuju/title-tip.png"
                   alt />
              <div class="tip_title">分类列表</div>
            </div>

            <div class="info_list">
              <div v-for="(item,index) in listDatashow"
                   :key="index"
                   class="item">
                <div class="list_item">
                  <div v-for="(colItem,colIndex) in item"
                       :key="colIndex"
                       class="list_item_col">
                    <img :src="colItem.dataIcon"
                         alt />
                    <div class="item_content">
                      <div class="item_label">{{colItem.label}}</div>
                      <div class="item_count">{{colItem.count}}</div>
                    </div>

                  </div>
                </div>
                <div :class="['item_line',{'last_line':index==(listDatashow.length-1)}]"></div>
              </div>

            </div>
          </el-scrollbar>
        </div>

      </div>
    </div>

  </div>

</template>

<script>
import 'ol/ol.css'
import { Map, View } from 'ol'
import TileLayer from 'ol/layer/Tile.js';
import XYZ from 'ol/source/XYZ.js';
import VectorLayer from 'ol/layer/Vector.js';
import VectorSource from 'ol/source/Vector.js';
import GeoJSON from 'ol/format/GeoJSON.js';
import Point from "ol/geom/Point.js";
import Feature from "ol/Feature.js";
import Overlay from 'ol/Overlay';
import { defaults as defaultInteractions, Select, DoubleClickZoom } from 'ol/interaction.js';
import { getCenter, boundingExtent } from 'ol/extent.js';
import { Circle as CircleStyle, Icon, Fill, Stroke, Style, Text } from 'ol/style.js';
import { toStringHDMS } from 'ol/coordinate'

import { fromLonLat, toLonLat } from "ol/proj";
import { mapGetters } from "vuex";
import { Loading } from 'element-ui'; //引入Loading服务
import { requestPost } from "@/js/dai/request";
import BasicInfoCommunity from "./basicInfoCommunity";
import PeopleSearch from "./peopleSearch";
import People from "./people";


let loading;//加载动画

let x = 1500
let y = 700

let map;
let mapView;
let gaodeMapLayer;//背景地图图层
let polygonLayer;//变电站标注图层
let iconLayer; // icon标注图层
let iconSource; // icon
let polygonSource;//变电站标注多边形
let select;//选中标注


//url图标

let iconUrlArray = [
  'https://elink-esua-epdc.oss-cn-qingdao.aliyuncs.com/epmet/test/20211116/a219130b6bc74b0b80b5ddb0fce0892a.png',
  'https://elink-esua-epdc.oss-cn-qingdao.aliyuncs.com/epmet/test/20211116/a775d15e62374350b80e5cdf1912a4eb.png',
  'https://elink-esua-epdc.oss-cn-qingdao.aliyuncs.com/epmet/test/20211116/884efcf6d6b44224a7fda599dd1b14cb.png'
];
let textColorArray = [
  'rgba(236, 69, 4, 0.66)',
  'rgba(0, 146, 238, 0.75)',
  'rgba(238, 151, 0, 0.8)'
];
let polygonColorArray = [
  'rgba(210, 2, 2, 0.24)',
  'rgba(43, 231, 253, 0.25)',
  'rgba(183, 185, 0, 0.16)'
];
//变电站标注的文字样式
var createTextStyle = function (feature) {
  return new Text({
    textAlign: undefined,
    font: "18px Arial",
    //fontFamily: "Courier New, monospace",
    // fontWeight: "bold",
    text: feature.values_.name,
    backgroundFill: new Fill({
      // color: 'rgba(0, 146, 238, 0.75)'
      color: textColorArray[feature.values_.index - 1]
    }),
    padding: [4, 10, 4, 10],
    //text: "变电站名称",
    fill: new Fill({ color: "#ffffff" }),
    // stroke: new Stroke({ color: "#ffffff", width: 3 }),
    offsetY: -30,
    offsetX: -50,
    overflow: true,
  });
};

//变电站标注样式

var polygonStyleFunction = (function () {
  return function (feature) {
    return new Style({
      fill: new Fill({
        // color: [255, 255, 255, 0.3]
        color: polygonColorArray[feature.values_.index - 1]
      }),
      stroke: new Stroke({
        color: polygonColorArray[feature.values_.index - 1],
        width: 3
      }),

      text: createTextStyle(feature)
    });;
  };
})()

const vueGis = {
  name: 'HomeMap',
  data () {
    return {
      centerPoint: [],//中心点位置
      zoom: 14,//缩放范围：区14
      minZoom: 1,//最小缩放

      orgData: {},//当前组织对象
      orgId: '',
      orgLevel: '',

      subAgencyArray: [],//下拉框数据
      iconCoordinators: [],
      currentCoordinate: null,
      overlay: null,

      //右侧搜索
      searchName: "",

      //右侧列表
      listData: [],//得到的数据
      listDatashow: [],//处理成一行两列的数据

      //下钻层级记录
      runNum: 0,
      runAgencyArray: [],
      selUserId: '',


    }
  },
  async mounted () {
    //加载组织数据
    await this.loadOrgData()

    //初始化地图
    this.initMap()

    //添加标注图层
    this.addPolygonLayer()

    //添加icontuceng
    this.addIconLayer()

    //加载当前园区的标注
    this.loadPolygon(this.subAgencyArray)

    await this.loadList()

  },
  methods: {

    handleSearch () {

      this.toSubAgency('search')
    },

    //获取右侧infolist数据
    async loadList () {
      const url = "/epmetuser/statsresiwarn/list"
      // const url = "http://yapi.elinkservice.cn/mock/245/epmetuser/statsresiwarn/list"
      let params = {
        id: this.orgId,
        level: this.orgLevel
      }

      const { data, code, msg } = await requestPost(url, params)

      if (code === 0) {
        this.listData = data
        // this.listData = this.listData1
        this.listDatashow = []
        let itemArray = []
        this.listData.forEach((item, index) => {
          if (!item.dataIcon) {
            item.dataIcon = require('../../../../assets/img/modules/visual/dibao.png')
          }

          if (index % 2 === 0) {//偶数
            itemArray.push(item)
          } else {
            itemArray.push(item)
            this.listDatashow.push(itemArray)
            itemArray = []
          }

        });


      } else {
        this.$message.error(msg)
      }
    },

    //子组件点击房间，刷新右侧list
    refreshInfoList (selId, type) {
      this.orgId = houselIdseId
      this.level = ''
    },

    //下钻到下一级 type点击的类型:polygon 点击多边形（分为点击组织/小区）   search 点击搜索  people 点击详情
    async toSubAgency (type, e, searchName) {
      //点击小区neighborHood显示楼栋，点击非小区，进入下一级地图
      this.runNum++
      this.runAgencyArray.push(this.orgData)

      if (type === 'people') {
        this.orgLevel = 'people'
        this.selUserId = e
        this.orgId = ''
        this.orgData = {
          id: '',
          level: 'people',
          name: '人员档案'
        }
        this.searchName = searchName

      } else if (type === 'search') {
        this.orgLevel = 'search'
        this.orgId = ''
        this.orgData = {
          id: '',
          level: 'search',
          name: '搜索'
        }
        this.$nextTick(() => {
          this.$refs.ref_search.loadList();
        });

      } else {
        this.subAgencyArray.forEach(item => {
          if (item.id === e.selected[0].id_) {
            this.orgId = item.id
            this.orgLevel = item.level
            this.orgData = item
          }
        });

        if (this.orgLevel === 'neighborHood') {
          this.loadList()
          this.$nextTick(() => {

            // 小区id，小区名称
            this.$refs.ref_community.initData(this.orgData.id, this.orgData.name);
          });

        } else {
          this.refreshMap(true)
        }
      }


    },

    //刷新地图
    async refreshMap (isRefreshView) {

      //加载组织数据
      await this.loadOrgData()

      //加载当前园区的标注
      await this.loadPolygon(this.subAgencyArray)

      //重置地图中心点
      if (isRefreshView) {
        this.setMapLocation()
        mapView.setCenter(this.centerPoint);
        mapView.setZoom(this.zoom);
      }

      await this.loadList()

    },

    //返回所选组织
    handleClickAgency (index) {

      const cutNum = this.runAgencyArray.length - index//要减去的长度
      this.runNum = this.runNum - cutNum
      this.orgData = this.runAgencyArray[index]

      for (let i = 0; i < cutNum; i++) {
        this.runAgencyArray.pop()
      }

      this.orgId = this.orgData.id
      this.orgLevel = this.orgData.level

      if (this.orgLevel === 'people') {


      } else if (this.orgLevel === 'search') {
        this.$nextTick(() => {

          this.$refs.ref_search.loadByName(this.searchName);
        });

      } else if (this.orgLevel === 'neighborHood') {//显示小区

      } else {

        this.$nextTick(() => {
          this.refreshMap(true)
          this.$forceUpdate()
        });

      }

    },

    //加载组织数据
    async loadOrgData () {

      const url = "/gov/org/agency/maporg"
      let params = {
        orgId: this.orgId,
        level: this.orgLevel
      }

      const { data, code, msg } = await requestPost(url, params)

      if (code === 0) {

        this.orgData = data
        this.orgId = this.orgData.id
        this.orgLevel = this.orgData.level

        if (data.children && data.children.length > 0) {
          this.subAgencyArray = data.children
        } else {
          this.subAgencyArray = []
        }

      } else {
        this.$message.error(msg)
      }

    },

    //加载当前园区的标注
    loadPolygon (subAgencyArray) {
      polygonSource.clear()//清空变电站标注

      let featureData = []//标注数据
      if (subAgencyArray && subAgencyArray.length > 0) {//判断是否存在下级标注
        let oneData = {}

        subAgencyArray.forEach(agencyItem => {

          if (agencyItem.coordinates && agencyItem.coordinates !== '') {//如果有坐标
            let urlNum = this.getRndBetween(1, 3)

            oneData = {
              type: 'Feature',
              id: agencyItem.id,
              properties: {
                id: agencyItem.id,
                level: agencyItem.level,
                name: agencyItem.name,
                index: urlNum//颜色随机的索引
              },
              geometry: {
                type: 'Polygon',
                coordinates: [],
              },
            }
            let coorArray = agencyItem.coordinates.split(',')//坐标数组

            let itemArray = []//单个点位的[lon,lat]，数组
            let polygonArray = []//整个多边形的[[lon,lat],[lon,lat],[lon,lat]]数组

            coorArray.forEach((item, index) => {
              itemArray.push(item)
              if (index % 2 == 0) {//偶

              } else {//奇
                polygonArray.push(itemArray)
                itemArray = []
              }

            });
            oneData.geometry.coordinates.push(polygonArray)
            featureData.push(oneData)
          }

        });

      }

      if (featureData && featureData.length > 0) {
        var geojsonObject = {
          'type': 'FeatureCollection',
          'features': featureData
        };
        let feature = (new GeoJSON()).readFeatures(geojsonObject)

        polygonSource.addFeatures(feature)

        let iconFeatures = [];
        feature.forEach(oneIcon => {
          var extent = boundingExtent(oneIcon.getGeometry().getCoordinates()[0]); //获取一个坐标数组的边界，格式为[minx,miny,maxx,maxy]
          // var center = getCenter(extent);   //获取边界区域的中心位置
          //添加标注
          let x = (parseFloat(extent[0]) + parseFloat(extent[2])) / 2
          let y = (parseFloat(extent[1]) + parseFloat(extent[3])) / 2

          let oneArray = [x, y]
          this.iconCoordinators.push(oneArray)

          //视频监控样式
          let oneCctv = new Feature({
            geometry: new Point([x, y]),
            id: oneIcon.id,
            properties: {
              type: "icon",
              id: oneIcon.id
            }
          });

          console.log(oneIcon.values_)

          let iconStyle = new Style({
            image: new Icon({
              // anchor: [0.5, 0.5],
              // imgSize: [32, 32],
              scale: 0.5,
              // src: "/img/largeScreen/icon_camra.png"
              // src: "https://elink-esua-epdc.oss-cn-qingdao.aliyuncs.com/epmet/test/20211116/a219130b6bc74b0b80b5ddb0fce0892a.png"
              src: iconUrlArray[oneIcon.values_.index - 1]
            })
          });

          oneCctv.setStyle(iconStyle);
          iconFeatures.push(oneCctv);

        });
        console.log(iconFeatures)

        iconSource.clear(); //清空cctyv标注
        iconSource.addFeatures(iconFeatures);
      }

      // this.addGif()

    },
    //设置地图定位的中心点和缩放级别
    setMapLocation () {
      this.centerPoint = []

      if (this.orgData.longitude && this.orgData.latitude) {
        this.centerPoint.push(this.orgData.longitude)
        this.centerPoint.push(this.orgData.latitude)
      }

      this.setZoom(this.orgData.agencyLevel)
    },

    //根据组织层级设置缩放级别
    setZoom (agencyLevel) {
      if (agencyLevel === 'district') {
        this.zoom = 14
      } else if (agencyLevel === 'street') {
        this.zoom = 15
      } else if (agencyLevel === 'community') {
        this.zoom = 16
      }

    },

    initMap () {
      this.setMapLocation()

      gaodeMapLayer = new TileLayer({
        title: "地图",
        source: new XYZ({
          //指定url瓦片
          url: 'http://wprd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=7&x={x}&y={y}&z={z}',
          wrapX: true//x方向平铺，也可以选择false
        }),
        zIndex: 20
      });

      mapView = new View({
        //中心点坐标
        center: this.centerPoint,
        // projection: 'EPSG:3857',
        projection: 'EPSG:4326',
        zoom: this.zoom,
        minZoom: this.minZoom
      })
      // 弹窗
      this.overlay = new Overlay({
        element: this.$refs.popup, // 弹窗标签，在html里
        autoPan: true, // 如果弹窗在底图边缘时，底图会移动
        autoPanAnimation: { // 底图移动动画
          duration: 250
        }
      })
      console.log(this.overlay)
      //初始化map和地图底图
      //创建地图容器
      map = new Map({
        layers: [gaodeMapLayer],
        //加载瓦片图层数据
        view: mapView,
        target: 'map',
        overlays: [this.overlay], // 把弹窗加入地图
        //目标加载到map中
      })

      let that = this
      map.on('singleclick', function (e) {
        console.log(e.coordinate)
        const coordinate = e.coordinate // 获取坐标
        const hdms = toStringHDMS(toLonLat(coordinate)) // 转换坐标格式


        setTimeout(() => {
          // 设置弹窗位置
          // 这里要设置定时器，不然弹窗首次出现，底图会跑偏
          that.currentCoordinate = hdms // 保存坐标点
          that.overlay.setPosition(coordinate)

        }, 0)
        // console.log(transform(e.coordinate, 'EPSG:3857', 'EPSG:4326'));

      })

      //去除双击放大效果
      const dblClickInteraction = map
        .getInteractions()
        .getArray()
        .find(interaction => {
          return interaction instanceof DoubleClickZoom;
        });
      map.removeInteraction(dblClickInteraction);

    },

    //添加变电站标注图层
    addPolygonLayer () {
      polygonSource = new VectorSource({
        //features: (new GeoJSON()).readFeatures(geojsonObject)
      });

      polygonLayer = new VectorLayer({
        source: polygonSource,
        style: polygonStyleFunction,
        zIndex: 50
      });

      //选中多边形后的样式
      var overlayStyle = (function () {

        return function (feature) {
          var styles = {};
          styles['Polygon'] = [
            new Style({
              stroke: new Stroke({
                color: '#ec9000',
                width: 2
              })
            }),

            new Style({
              fill: new Fill({
                color: 'rgba(0, 0, 255, 0.1)'
              })
            }),
            new Style({
              text: createTextStyle(feature)
            })
          ];
          styles['MultiPolygon'] = styles['Polygon'];
          return styles[feature.getGeometry().getType()];
        };
      })();

      select = new Select({
        style: overlayStyle
      });


      map.addLayer(polygonLayer)
      map.addInteraction(select);

      select.on('select', e => {
        this.toSubAgency('polygon', e)
      });

    },

    addIconLayer () {
      iconSource = new VectorSource({
        //features: (new GeoJSON()).readFeatures(geojsonObject)
      });

      iconLayer = new VectorLayer({
        source: iconSource,
        zIndex: 70
      });

      map.addLayer(iconLayer);

    },

    //取随机数
    getRndBetween (lowerLimit, upperLimit) {
      return Math.floor(Math.random() * (upperLimit - lowerLimit + 1)) + lowerLimit;
    },

    //开启加载动画
    startLoading () {
      loading = Loading.service({
        lock: true, //是否锁定
        text: '正在加载……', //加载中需要显示的文字
        background: 'rgba(0,0,0,.7)' //背景颜色
      });

    },

    //结束加载动画
    endLoading () {
      //clearTimeout(timer);
      if (loading) {
        loading.close();
      }
    },
  },
  props: {

    // vueFlag: {
    //   type: String,
    //   default: "alarm"
    // }
  },
  computed: {

    mapHeight () {

      return this.clientHeight - 120;

    },
    // zoom: {
    //   get () {
    //     //根据不同屏幕分辨率，控制zoom大小
    //     if (this.clientHeight < 900) {
    //       return 2.3
    //     } else {
    //       return 2.8
    //     }
    //   },
    //   set (value) {
    //   }
    // },
    ...mapGetters(["clientHeight"])

  },
  components: { BasicInfoCommunity, PeopleSearch, People },
}
export default vueGis;
</script>

<style
  lang="scss"
  src="@/assets/scss/modules/visual/basicInfoMain.scss"
  scoped
></style>

<style lang="scss" >
.div_content {
  .ol-viewport {
    border-radius: 5px;
  }
}
.ol-overlaycontainer-stopevent {
  display: none;
}
.el-input__inner[WarningColor="warning"] {
  background-color: #011168;
  border-radius: 4px 0 0 4px;
  height: 56px;
  border: none;
  box-shadow: 0 0 10px inset #1a5afd;
  padding-left: 70px;
  font-size: 18px;
  font-family: PingFang SC;
  font-weight: 400;
  color: #ffffff;
  opacity: 0.7;
}
.el-scrollbar__wrap {
  overflow-x: hidden !important;
}
</style>   