import DataUtils from "../utils/DataUtils";
import GeoJsonProvider from "../geog/GeoJsonProvider";
import LayerProvider from "../geog/LayerProvider";
import StatsCircleLayer from "../common/StatsCircleLayer";

import { getApi } from "../../api/http";

/**
 * 定义排水户统计图层
 *
 * @alias DrainEntityStatsLayer
 *
 * @summary <用于排水户统计地图交互>
 */
export default class DrainEntityStatsLayer {
  /**
   * 构造函数
   * @param {Object} options -排水户选项
   */
  constructor(options) {
    /**
     * 地图对象
     * @type {Object}
     */
    this._map = options.map;

    /**
     * 最小缩放层级
     * @type {Number}
     */
    this._minzoom = DataUtils.default(options.minzoom, 10);

    // 统计点要素列表
    this._statsFeatures = [];

    // 统计点数据源Id
    this._sourceId = 'pipe_drainer_stats';

    // 统计圆图层
    this._statsLayer = new StatsCircleLayer({
      map: this._map,
      minzoom: this._minzoom,
      field: 'entity_count',
      sourceId: this._sourceId
    });
  }

  /**
   * 设置统计数据
   * @param {Object|Array} data -GeoJSON要素/要素集/点列表
   */
  setData(data) {
    if (this._statsFeatures.length === 0) {
      // 获取查询url
      let url = LayerProvider.getBaseLayerQueryUrl(this._map, 'town_stats', null);
      if (!url) return;

      // 获取地图服务接口数据
      getApi(url).then((res) => {
        let fc = res.data;
        if (fc && fc.features && fc.features.length > 0) {
          this._statsFeatures = fc.features;
          // 更新统计数据
          this._updateStatsData(data);
        }
      });
    } else {
      // 更新统计数据
      this._updateStatsData(data);
    }
  }

  /**
   * 显示/隐藏图层
   * @param {Boolean} show -是否显示
   */
  showLayer(show = true) {
    this._statsLayer.showLayer(show);
  }

  /**
   * 移除图层
   */
  removeLayer() {
    this._statsLayer.removeLayer();
  }

  /**
   * 移除数据源
   */
  removeSource() {
    this._statsLayer.removeSource();
  }

  /**
   * 绑定单击事件
   * @param {Function} event -事件函数
   */
  onClick(event) {
    this._statsLayer.onClick(event);
  }

  /**
   * 绑定事件
   * @param {String} name -事件名称
   * @param {Function} event -事件函数
   */
  onEvent(event, name) {
    this._statsLayer.onEvent(name, event);
  }

  /**
   * 更新统计数据
   * @param {Object} data -GeoJSON数据
   */
  _updateStatsData(data) {
    const fc = GeoJsonProvider.getEmptyFC();

    // 循环获取要素
    this._statsFeatures.forEach((feature) => {
      let townId = feature.properties.code;
      let townName = feature.properties.name;

      let items = data.filter(item => {
        return item.id.toString() === townId;
      });
      if (items.length > 0) {
        let lonLat = feature.geometry.coordinates;
        let props = {
          "code": townId,
          "name": townName,
          "entity_count": items[0].value
        };
        // 获取点要素
        const fea = GeoJsonProvider.getPointFeature(lonLat, props);

        fc.features.push(fea);
      }
    });

    // 设置数据
    this._statsLayer.setData(fc);
  }
}
