/**
 * @文件说明: 构建Map地图的“数据源”管理函数方法
 * @创建人: pjtools@vip.qq.com
 * @创建时间: 2020-03-22 12:02:51
 */

var source = {
  /**
   * 获取指定Id名称的图层数据源
   * @param {String} id 数据源Id名称
   */
  getSource: function getSource(id) {
    return this.map.getSource(id) || null;
  },


  /**
   * 获取所有的图层数据源对象
   */
  getSources: function getSources() {
    var _this = this;

    var mapStyle = this.map.getStyle();
    var styleSources = mapStyle.sources || {};
    var sources = {};
    Object.keys(styleSources).map(function (key) {
      var source = _this.getSource(key);
      source && (sources[key] = source);
    });
    return sources;
  },


  /**
   * 获取指定Id名称的数据源所属图层Id集合
   * @param {String} id 数据源Id名称
   */
  getSourceToLayerIds: function getSourceToLayerIds(id) {
    var source = this.getSource(id);
    if (source) {
      return source._layersIds || null;
    }
    return null;
  },


  /**
   * 获取指定Id名称的图层数据源的数据集
   * @param {String} id 数据源Id名称
   */
  getSourceData: function getSourceData(id) {
    var source = this.getSource(id);
    if (source) {
      return source._data;
    }
    return null;
  },


  /**
   * 添加图层数据源到地图Map中
   * @param {String} id 数据源Id名称
   * @param {Object} source 数据源对象
   */
  addSource: function addSource(id, source) {
    var chkSource = this.getSource(id);
    if (chkSource) {
      return chkSource;
    }
    // 添加图层数据源
    this.map.addSource(id, source);
    // 获取实际数据源
    var currentSource = this.map.getSource(id);
    currentSource._layersIds = [];
    return currentSource;
  },


  /**
   * 删除指定Id的图层数据源
   * @param {String} id 数据源Id名称
   */
  removeSource: function removeSource(id) {
    var source = this.getSource(id);
    if (source) {
      // 判断数据源的所属图层是否已删除
      if (source._layersIds) {
        for (var i = source._layersIds.length - 1; i >= 0; i--) {
          var layerId = source._layersIds[i];
          // 移除已删除的数据源所属图层Id记录
          if (!this.map.getLayer(layerId)) {
            source._layersIds.splice(i, 1);
          }
        }
      }
      // 判断数据源是否已无对应图层关联，则移除数据源
      if (!source._layersIds || !source._layersIds.length) {
        this.map.removeSource(id);
      }
    }
  }
};

export default source;