import DataUtils from '../utils/DataUtils';
import VerifyUtils from "../utils/VerifyUtils";
import GeoJsonProvider from '../geog/GeoJsonProvider';
import SimpleMarkerLayer from '../common/SimpleMarkerLayer';

/**
 * 定义删除标记图层
 *
 * @alias DeleteMarkerLayer
 *
 * @summary <用于删除标记点位图层>
 */
export default class DeleteMarkerLayer {
  /**
   * 构造函数
   * @param {Object} options -图层选项
   */
  constructor(options) {
    /**
     * 地图对象
     * @type {Object}
     */
    this._map = options.map;

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

    /**
     * 图标ID
     * @type {String}
     */
    this._icon = DataUtils.default(options.icon, 'busi_delete');

    /**
     * 偏移
     * @type {Array}
     */
    this._offset = DataUtils.default(options.icon, [-5, -5]);

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

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

    // 要素集
    this._fc = GeoJsonProvider.getEmptyFC();

    // 创建标记图层
    this._markerLayer = new SimpleMarkerLayer({
      map: this._map,
      minzoom: this._minzoom,
      icon: this._icon,
      offset: this._offset,
      sourceId: this._sourceId,
      layerId: this._layerId
    });
  }

  /**
   * 设置数据
   * @param {Object|Array} data -GeoJson要素/要素集/点位数组
   */
  setData(data) {
    let fc = null;

    if (VerifyUtils.isGeoJsonFC(data)) {
      fc = data;
    } else if (VerifyUtils.isGeoJsonFeature(data)) {
      fc = GeoJsonProvider.getEmptyFC();
      fc.features = [data];
    } else if (VerifyUtils.isArray(data)) {
      fc = GeoJsonProvider.data2PointFC(data);
    }

    this._fc = fc || GeoJsonProvider.getEmptyFC();
    // 设置数据
    this._markerLayer.setData(this._fc);
  }

  /**
   * 添加数据
   * @param {Object|Array} data -GeoJson要素/要素集/点位数组
   */
  appendData(data) {
    let fc = null;

    if (VerifyUtils.isGeoJsonFC(data)) {
      fc = data;
    } else if (VerifyUtils.isGeoJsonFeature(data)) {
      fc = GeoJsonProvider.getEmptyFC();
      fc.features = [data];
    } else if (VerifyUtils.isArray(data)) {
      fc = GeoJsonProvider.data2PointFC(data);
    }

    if (fc && fc.features && fc.features.length > 0) {
      // 合并要素集合
      this._fc.features = this._fc.features.concat(fc.features);

      // 设置数据
      this._markerLayer.setData(this._fc);
    }
  }

  /**
   * 删除数据
   * @param {String} name -字段名
   * @param {Object} value -字段值
   */
  deleteData(name, value) {
    // 更新数据
    const features = this._fc.features.filter(feature => {
      return feature.properties[name] !== value;
    });
    this._fc.features = features;

    // 设置数据
    this._markerLayer.setData(this._fc);
  }

  /**
   * 设置过滤器
   * @param {Array} filter -过滤器
   */
  setFilter(filter) {
    this._markerLayer.setFilter(filter);
  }

  /**
   * 加载图层
   */
  loadLayer() {
    // 加载图层
    if (!this.hasLayer()) {
      this._markerLayer.loadLayer();
    }

    this.showLayer(true);
  }

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

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

  /**
   * 移除图层
   */
  removeLayer() {
    this._markerLayer.removeLayer();
    // 移除数据源
    this._markerLayer.removeSource();
  }

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