import DataUtils from "../utils/DataUtils";
import DrainUnitLayer from './DrainUnitLayer';
import DrainageEntityLayer from "./DrainageEntityLayer";

/**
 * 定义排水户图层提供类
 *
 * @alias DrainageEntityProvider
 *
 * @summary <用于加载/移除排水户、排水单元图层>
 */
export default class DrainageEntityProvider {
  /**
   * 构造函数
   * @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);

    /* 图层对象 */
    this._drainUnitLayer = null;   // 排水单元
    this._drainEntityLayer = null; // 排水户

    // 初始化图层
    this._initLayers();
  }

  /** 公有方法 **/
  /**
   * 设置数据
   * @param {String} type -类型
   * @param {Array|Object} data -数据
   */
  setData(type, data = null) {
    switch (type) {
      case 'drainunit': { // 排水单元
        this._drainUnitLayer.setData(data);
        break;
      }
      case 'drainentity': { // 排水户
        this._drainEntityLayer.setData(data);
        break;
      }
      default:
        break;
    }
  }

  /**
   * 加载图层
   * @param {String} type -类型
   */
  loadLayer(type) {
    switch (type) {
      case 'drainunit': { // 排水单元
        this._drainUnitLayer.loadLayer();
        break;
      }
      case 'drainentity': { // 排水户
        this._drainEntityLayer.loadLayer();
        break;
      }
      default:
        break;
    }
  }

  /**
   * 显示/隐藏图层
   * @param {String} type -类型
   * @param {Boolean} show -是否显示图层
   */
  showLayer(type, show) {
    switch (type) {
      case 'drainunit': { // 排水单元
        this._drainUnitLayer.showLayer(show);
        break;
      }
      case 'drainentity': { // 排水户
        this._drainEntityLayer.showLayer(show);
        break;
      }
      default:
        break;
    }
  }

  /**
   * 判断是否已加载图层
   * @param {String} type -类型
   *
   * @returns {Boolean}
   */
  hasLayer(type) {
    switch (type) {
      case 'drainunit': // 排水单元
        return this._drainUnitLayer.hasLayer();
      case 'drainentity': { // 排水户
        return this._drainEntityLayer.hasLayer();
      }
      default:
        return false;
    }
  }

  /**
   * 移除图层
   * @param {String} type -类型
   */
  removeLayer(type) {
    switch (type) {
      case 'drainunit': { // 排水单元
        this._drainUnitLayer.removeLayer();
        break;
      }
      case 'drainentity': { // 排水户
        this._drainEntityLayer.removeLayer();
        break;
      }
      default:
        break;
    }
  }

  /**
   * 移除所有图层(销毁时调用)
   */
  removeAllLayers() {
    // 排水单元
    this._drainUnitLayer.removeLayer();
    this._drainUnitLayer.removeSource();

    // 排水户
    this._drainEntityLayer.removeLayer();
    this._drainEntityLayer.removeSource();
  }

  /**
   * 绑定事件
   * @param {String} type -设施类型
   * @param {String} name -事件名称
   * @param {Function} event -事件函数
   */
  bindEvent(type, name, event) {
    switch (type) {
      case 'drainunit': { // 排水单元
        break;
      }
      case 'drainentity': { // 排水户
        this._drainEntityLayer.onEvent(name, event);
        break;
      }
      default:
        break;
    }
  }

  /**
   * 绑定单击事件
   * @param {String} type -设施类型
   * @param {Function} event -事件函数
   */
  bindClickEvent(type, event) {
    switch (type) {
      case 'drainunit': { // 排水单元
        break;
      }
      case 'drainentity': { // 排水户
        this._drainEntityLayer.onClick(event);
        break;
      }
      default:
        break;
    }
  }

  /** 私有方法 **/
  /**
   * 初始化图层
   */
  _initLayers() {
    const map = this._map;
    const minZoom = this._minzoom;

    // 排水单元
    this._drainUnitLayer = new DrainUnitLayer({
      map: map,
      minzoom: minZoom,
      opacity: 0.35
    });

    // 排水户
    this._drainEntityLayer = new DrainageEntityLayer({
      map: map,
      minzoom: minZoom,
      clusterMaxZoom: this._clusterMaxZoom,
      clusterRadius: this._clusterRadius
    });
  }
}
