import DataUtils from '../utils/DataUtils';
import IconProvider from "../geog/IconProvider";
import ClusterLayer from '../common/ClusterLayer';
import VerifyUtils from '../utils/VerifyUtils';

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

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

    /**
     * 聚合最大缩放层级
     * @type {Number}
     */
    this._clusterMaxZoom = DataUtils.default(options.clusterMaxZoom, 14);

    /**
     * 聚合半径
     * @type {Number}
     */
    this._clusterRadius = DataUtils.default(options.clusterRadius, 120);

    /**
     * 数据源ID
     * @type {String}
     */
    this._sourceId = DataUtils.default(options.sourceId, 'pipe_drainer_cluster');

    /**
     * 图层ID
     * @type {String}
     */
    this._layerId = DataUtils.default(options.layerId, this._sourceId);

    // 默认数据源ID
    const defaultSourceId = 'pipe_drainage_entity';
    // 获取数据源URL
    const source = this._map.getSource(defaultSourceId);
    const dataUrl = (source && VerifyUtils.isString(source._data)) ? source._data : null;
    if (!dataUrl) {
      this._sourceId = defaultSourceId;
    }

    // 初始化点聚合图层
    this._clusterLayer = new ClusterLayer({
      map: this._map,
      minzoom: this._minzoom,
      icon: IconProvider.getDrainerIconExpression('grade', true),
      clusterMaxzoom: this._clusterMaxZoom,
      clusterRadius: this._clusterRadius,
      dataUrl: dataUrl,
      sourceId: this._sourceId,
      layerId: this._layerId
    });
  }

  /** 公有方法 **/
  /**
   * 设置数据
   * @param {Object|Array} data -GeoJSON要素集/点位数组
   *
   * @summary <data参数：
   *   Object - GeoJson要素集
   *   Array - 点位数组(包含longitude/lng, latitude/lat字段)
   * >
   */
  setData(data) {
    this._clusterLayer.setData(data);
  }

  /**
   * 加载图层
   */
  loadLayer() {
    this._clusterLayer.loadLayer();
  }

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

  /**
   * 判断图层是否已加载
   *
   * @returns {Boolean}
   */
  hasLayer() {
    return this._clusterLayer.hasLayer();
  }

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

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

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

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