/**
 * 定义地图图层提供类
 */
export default class LayerProvider {
  constructor() { }

  /**
   * 获取基础图层查询url
   * @param {Object} map -地图对象
   * @param {String} category -图层类型
   * @param {String|Numner} value -值
   * @param {String|Numner} value2 -值2
   *
   * @returns {String}
   */
  static getBaseLayerQueryUrl(map, category, value, value2=null) {
    if (!map._baseQueryLayers) return null;

    const queryLayers = map._baseQueryLayers.filter(layer => {
      return layer.id === category;
    });
    if (queryLayers.length === 0) return null;

    let url = queryLayers[0].url;

    switch (category) {
      case 'town':
      case 'town_stats': { // 街镇/街镇统计点
        return value ? url + "&cql_filter=code='" + value.toString() + "'" : url;
      }
      case 'poi':
      case 'road': { // POI/道路
        return url + "&featureID=" + parseInt(value);
      }
      case 'plant': { // 水厂
        return value ? url + "&cql_filter=plant_id='" + value.toString() + "'" : url;
      }
      case 'pumpwaste': { // 污水泵站
        return value
               ? url + "&cql_filter=pump_id='" + value.toString() + "'"
               : url + "&cql_filter=category='2'";
      }
      case 'drainer-connhole': // 接驳井函数
      case 'drainer-drainunit': { // 排水单元函数
        return url + '&viewparams=draincode:' + value.toString();
      }
      case 'drainer-drainentity': { // 排水户函数
        return url + '&viewparams=nodeid:' + value.toString();
      }
      case 'drainunit': { // 排水单元
        return value ? url + "&cql_filter=unit_code='" + value.toString() + "'" : url;
      }
      case 'drainentity': { // 排水户
        return url + "&cql_filter=drain_code='" + value.toString() + "'";
      }
      case 'liquid-plant':         // 水厂范围内的液位计
      case "servicerange-plant": { // 水厂服务范围
        return value ? url + "&cql_filter=plant_id='" + value.toString() + "'" : url;
      }
      case 'liquid-pump':         // 泵站范围内的液位计
      case "servicerange-pump": { // 泵站服务范围
        return value ? url + "&cql_filter=pump_id='" + value.toString() + "'" : url;
      }
      case "manhole": { // 检查井
        return url + "&cql_filter=node_id='" + value.toString() + "'";
      }
      case "manhole-in": // 排水单元内管网
      case "pipeline-in": {
        return url + "&cql_filter=unit_code='" + value.toString() + "'";
      }
      case "pipeline":  // 管线
      case 'pipenet': { // 管网
        return url + "&cql_filter=pipe_id='" + value.toString() + "'";
      }
      case 'pipe-mixing': { // 管网雨污混接
        return url + "&cql_filter=pipe_id='" + value.toString() + "'";
      }
      case 'pipenet-equ': { // 设备管网
        return url;
      }
      case 'pipenet-down': { // 管网-检查井下游分析
        //return url + "&cql_filter=in_nodeid='" + value.toString() + "'";
        return url + '&viewparams=updown:down;nodecode:' + value.toString();
      }
      case 'pipenet-up': { // 管网-检查井上游分析
        //return url + "&cql_filter=out_nodeid='" + value.toString() + "'";
        return url + '&viewparams=updown:up;nodecode:' + value.toString();
      }
      case 'pipenet-plant': { // 管网分析-水厂
        return url + "&cql_filter=in_plantid='" + value.toString() + "'";
      }
      case 'pipenet-pump': { // 管网分析-泵站
        return url + "&cql_filter=in_pumpid='" + value.toString() + "'";
      }
      case 'pipenet-error':    // 管网分析-上下游错误
      case 'pipenet-errorup':
      case 'pipenet-errordown':
      case 'pipenet-delete':   // 管网分析-结果删除
      case 'pipenet-deviceup': // 管网分析-上下游设备
      case 'pipenet-devicedown': {
        return url + '&viewparams=udid:' + value.toString();
      }
      case 'pipenet-downstream':
      case 'pipenet-coverage':
      case 'pipenet-plantpump': { // 管网分析-下游/下游覆盖范围/上下游厂站
        return url + '&viewparams=sourceid:' + value.toString();
      }
      case 'pipenet-upstream':
      case 'pipenet-drainentity':
      case 'pipenet-drainunit': { // 管网分析-上游/排水户/排水单元
        return url + '&viewparams=targetid:' + value.toString();
      }
      case 'pipenet-dijkstra': { // 管网分析-最短路径
        if (value && value2) {
          return url + '&viewparams=sourceid:' + value.toString() + ';targetid:' + value2.toString();
        } else {
          return null;
        }
      }
      default:
        return null;
    }
  }

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

    map.setFilter(id, filter);
  }

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

    return false;
  }

  static has3DBuildingLayer(map, id='map_nh_building-3d') {
    let layer = map.getLayer(id);
    if (layer) {
      console.log(layer);
      return true;
    }

    return false;
  }

  /**
   * 判断图层是显示
   * @param {Object} map -地图对象
   * @param {String} id -图层Id
   *
   * @returns {Boolean}
   */
  static isLayerVisible(map, id) {
    return ('visible' === map.getLayoutProperty(id, 'visibility'));
  }

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

    if (map.getLayer(id)) {
      map.setLayoutProperty(id, 'visibility', visible);
    }
  }

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

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

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

  /**
   * 解除事件绑定
   * @param {Object} map -地图对象
   * @param {String} layerId -图层Id
   * @param {String} name -事件
   * @param {function} func -函数对象
   */
  static offEvent(map, layerId, name, func) {
    map.off(name, layerId, func);
  }

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

    return false;
  }

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

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