import DataUtils from "../utils/DataUtils";
import MarkerLayer from "./MarkerLayer";
import Pulser from "./Pulser";

/**
 * 定义扩散图层
 * @alias PulserLayer
 * 
 * @summary <用于报警点数据加载>
 */
export default class PulserLayer {
  /**
   * 构造函数
   * @param {Object} options -图层选项
   */
  constructor(options) {
    /**
     * 地图对象
     * @type {Object}
     */
    this._map = options.map;

    /**
     * 最小缩放层级
     * @type {Number}
     */
    this._minZoom = DataUtils.default(options.minZoom, 9);

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

    /**
     * 半径
     * @type {Number}
     */
    this._radius = DataUtils.default(options.radius, 30);

    /**
     * 内圆颜色
     * @type {Array}
     */
    this._innerColor = DataUtils.default(options.innerColor, [255, 25, 25]);
    
    /**
     * 外圆颜色
     * @type {Array}
     */
    this._outerColor = DataUtils.default(options.outerColor, [255, 50, 50]);

    /**
     * 过滤条件数组
     * @type {Array}
     */
    this._filter = DataUtils.default(options.filter, undefined);

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

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

    // 图层
    this._pulserLayer = null;
    // 初始化图层
    this._initLayer();
  }

  /** 公有方法 **/
  /**
   * 设置数据
   * @param {Object|Array} data -GeoJson要素集/要素/要素列表/点位数组
   * 
   * @summary <data参数：
   *   Object - GeoJson要素集/要素
   *   Array - GeoJson要素数组/点位数组(包含longitude/lng, latitude/lat字段)
   * >
   */
  setData(data) {
    if (!this._pulserLayer.hasLayer()) {
      // 加载图标
      this._loadPulserIcon();
    }

    this._pulserLayer.setData(data);
  }

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

    // 移除图标
    if (this._map.hasImage(this._icon)) {
      this._map.removeImage(this._icon);
    }
  }

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

  /** 私有方法 **/
  /**
   * 初始化图层 
   */
  _initLayer() {
    this._pulserLayer = new MarkerLayer({
      map: this._map,
      minzoom:this._minZoom,
      icon: this._icon,
      opacity: 0.75,
      filter: this._filter,
      sourceId: this._sourceId,
      layerId: this._layerId
    });
  }

  /**
   * 加载脉冲图标 
   */
  _loadPulserIcon() {
    const map = this._map;

    if (!map.hasImage(this._icon)) {
      const pulser = new Pulser({
        map: map,
        size: this._radius * 2.0,
        innerColor: {
          r: this._innerColor[0],
          g: this._innerColor[1],
          b: this._innerColor[2]
        },
        outerColor: {
          r: this._outerColor[0],
          g: this._outerColor[1],
          b: this._outerColor[2]
        }
      });

      map.addImage(this._icon, pulser, {
        pixelRatio: 1
      });
    }
  }
}