import DataUtils from '../utils/DataUtils';
import SimpleFillLayer from '../common/SimpleFillLayer';

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

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

    /**
     * 填充不透明度
     * @type {Number}
     */
    this._fillOpacity = DataUtils.default(options.opacity, 0.5);

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

    // 颜色表达式
    const colorExpress = {
      property: 'unit_type',
      type: 'categorical',
      stops: [
        ['1', '#6DBB9B'],
        ['2', '#F17992'],
        ['3', '#F3F5BD'],
        ['4', '#EEB74D'],
        ['5', '#DAA2F8']
      ],
      default: '#EAEAEA'
    };

    // 创建图层
    this._fillLayer = new SimpleFillLayer({
      map: this._map,
      minzoom: this._minzoom,
      color: colorExpress,
      opacity: this._fillOpacity,
      /*outline: true,
      lineColor: colorExpress,
      lineWidth: 0.5,
      lineOpacity: 0.75,
      dasharray: [2.5, 1.5],*/
      sourceId: this._sourceId,
    });
  }

  /**
   * 设置数据
   * @param {Object} data -GeoJSON要素/要素集
   */
  setData(data) {
    this._fillLayer.setData(data);
  }

  /**
   * 设置筛选器
   * @param {Array} filter -筛选器
   */
  setFilter(filter) {
    this._fillLayer.setFilter(filter);
  }

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

    // 显示图层
    this.showLayer(true);
  }

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

  /**
   * 判断是否已加载图层
   * @param {String} type -类型
   *
   * @returns {Boolean}
   */
  hasLayer() {
    return this._fillLayer.hasLayer();
  }

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

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