/**
 * 图层工具类 
 */
const LayerUtils = {
  /**
   * 判断数据源是否加载
   * @param {Object} map -地图对象
   * @param {String} id -数据源Id
   * 
   * @returns {Boolean}
   */
  hasSource(map, id) {
    if (map&&map.getSource(id)) {
      return true;
    }

    return false;
  },

  /**
   * 设置数据源
   * @param {Object} map -地图对象
   * @param {String} id -数据源Id
   * @param {String|Object} data -数据源
   * 
   * @summary <data参数：数据的url或GeoJSON对象>
   */
  updateSource(map, id, data) {
    if (map&&map.getSource(id)) {
      map.getSource(id).setData(data);
    }
  },

  /**
   * 移除数据源
   * @param {Object} map -地图对象
   * @param {String} id -数据源Id
   */
  removeSource(map, id) {
    if (map&&map.getSource(id)) {
      map.removeSource(id);
    }
  },

  /**
   * 判断图层是否加载
   * @param {Object} map -地图对象
   * @param {String} id -图层Id
   * 
   * @returns {Boolean}
   */
  hasLayer(map, id) {
    if (map&&map.getLayer(id)) {
      return true;
    }

    return false;
  },

  /**
   * 判断图层是否可见
   * @param {Object} map -地图对象
   * @param {String} id -图层Id
   * 
   * @returns {Boolean}
   */
  isLayerVisible(map, id) {
    return (
      this.hasLayer(map, id) &&
      'visible' === map.getLayoutProperty(id, 'visibility')
    );
  },

  /**
   * 过滤图层
   * @param {Object} map -地图对象
   * @param {String} id -图层Id
   * @param {Array} filter -过滤数组
   * 
   * @summary <filter参数示例：['==', 'fld', 'val']>
   */
  filterLayer(map, id, filter) {
    if (!map.getLayer(id)) return;

    map.setFilter(id, filter);
  },

  /**
   * 显示/隐藏图层
   * @param {Object} map -地图对象
   * @param {String} id -图层Id
   * @param {Boolean} show -是否显示
   */
  showLayer(map, id, show = true) {
    let visible = show ? 'visible' : 'none';
    if (map&&map.getLayer(id)) {
      map.setLayoutProperty(id, 'visibility', visible);
    }
  },

  /**
   * 移动图层
   * @param {Object} map -地图对象
   * @param {String} id -需要移动的图层Id
   * @param {String} beforeId -现有图层Id
   * 
   * @summary <id图层将显示到beforeId图层之下>
   */
  moveLayer(map, id, beforeId) {
    if (map&&map.getLayer(id)) {
      map.moveLayer(id, beforeId);
    }
  },

  /**
   * 移除图层
   * @param {Object} map -地图对象
   * @param {String} id -图层Id
   */
  removeLayer(map, id) {
    if (map&&map.getLayer(id)) {
      map.removeLayer(id);
    }
  },

  /**
   * 绑定事件
   * @param {Object} map -地图对象
   * @param {String} layerId -图层Id 
   * @param {String} name -事件
   * @param {function} event -函数对象
   */
  onEvent(map, layerId, name, event) {
    map.on(name, layerId, event);
  },

  /**
   * 解除事件绑定
   * @param {Object} map -地图对象
   * @param {String} layerId -图层Id 
   * @param {String} name -事件
   * @param {function} event -函数对象
   */
  offEvent(map, layerId, name, event) {
    map.off(name, layerId, event);
  },
  
  /**
   * 绑定仅响应一次的事件
   * @param {Object} map -地图对象
   * @param {String} layerId -图层Id 
   * @param {String} name -事件
   * @param {function} event -函数对象
   */
  onceEvent(map, layerId, name, event) {
    map.once(name, layerId, event);
  }
}

export default LayerUtils;