import DataUtils from '../utils/DataUtils';
import PlantLayer from './PlantLayer';
import PumpLayer from './PumpLayer';
import RuralSewageLayer from './RuralSewageLayer';
import ServiceRangeLayer from './ServiceRangeLayer';
import SimpleFillLayer from '../common/SimpleFillLayer';

/**
 * 定义厂站图层提供类
 *
 * @alias PlantPumpProvider
 *
 * @summary <用于加载/移除厂、站、农污图层>
 */
export default class PlantPumpProvider {
  /**
   * 构造函数
   * @param {Object} options -图层选项
   */
  constructor(options) {
    /**
     * 地图对象
     * @type {Object}
     */
    this._map = options.map;

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

    /* 图层对象 */
    this._sewagePlantLayer = null;   // 水质净化厂
    this._industryPlantLayer = null; // 工废处理厂
    this._otherPlantLayer = null;    // 其他水厂

    this._ruralSewageLayer = null;   // 农污装置

    this._rainPumpLayer = null;     // 雨水泵站
    this._sewagePumpLayer = null;   // 污水泵站
    this._industryPumpLayer = null; // 工废泵站
    this._combinePumpLayer = null;  // 一体化泵站

    this._sewagePumpAreaLayer = null; // 污水泵站面

    this._serviceRangeLayer = null; // 纳污范围

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

  /** 公有方法 **/
  /**
   * 设置数据
   * @param {String} type -类型
   * @param {Array|Object} data -数据
   */
  setData(type, data) {
    switch (type) {
      case 'plant':
      case 'waterplant':
      case 'plantsewage':
      case 'plantwater': {
        // 水厂
        this._sewagePlantLayer.setData(data);
        break;
      }
      case 'industryplant':
      case 'plantindustry': {
        // 工废处理厂
        this._industryPlantLayer.setData(data);
        break;
      }
      case 'otherplant': {
        // 其他水厂
        this._otherPlantLayer.setData(data);
        break;
      }
      case 'agricwaste':
      case 'agricsewage': {
        // 农污
        this._ruralSewageLayer.setData(data);
        break;
      }
      case 'pumpwaste':
      case 'pumpsewage': {
        // 污水泵站
        this._sewagePumpLayer.setData(data);
        this._sewagePumpAreaLayer.setData(data);
        break;
      }
      case 'pumprain': {
        // 雨水泵站
        this._rainPumpLayer.setData(data);
        break;
      }
      case 'pumpindustry': {
        // 工废泵站
        this._industryPumpLayer.setData(data);
        break;
      }
      case 'pumpcombine': {
        // 一体化泵站
        this._combinePumpLayer.setData(data);
        break;
      }
      case 'servicerange': // 纳污范围
      case 'servicerange-plant':
      case 'servicerange-pump': {
        this._serviceRangeLayer.setData(data);
        break;
      }
      default:
        break;
    }
  }

  /**
   * 设置筛选器
   * @param {String} type -类型
   * @param {Array} filter -过滤器
   */
  setFilter(type, filter) {
    switch (type) {
      case 'plant':
      case 'waterplant':
      case 'plantsewage':
      case 'plantwater': {
        // 水厂
        this._sewagePlantLayer.setFilter(filter);
        break;
      }
      case 'industryplant':
      case 'plantindustry': {
        // 工废处理厂
        this._industryPlantLayer.setFilter(filter);
        break;
      }
      case 'otherplant': {
        // 其他水厂
        this._otherPlantLayer.setFilter(filter);
        break;
      }
      case 'agricwaste':
      case 'agricsewage': {
        // 农污
        this._ruralSewageLayer.setFilter(filter);
        break;
      }
      case 'pumpwaste':
      case 'pumpsewage': {
        // 污水泵站
        this._sewagePumpLayer.setFilter(filter);
        this._sewagePumpAreaLayer.setFilter(filter);
        break;
      }
      case 'pumprain': {
        // 雨水泵站
        this._rainPumpLayer.setFilter(filter);
        break;
      }
      case 'pumpindustry': {
        // 工废泵站
        this._industryPumpLayer.setFilter(filter);
        break;
      }
      case 'pumpcombine': {
        // 一体化泵站
        this._combinePumpLayer.setFilter(filter);
        break;
      }
      case 'servicerange': // 纳污范围
      case 'servicerange-plant':
      case 'servicerange-pump': {
        this._serviceRangeLayer.setFilter(filter);
        break;
      }
      default:
        break;
    }
  }

  /**
   * 加载图层
   * @param {String} type -类型
   */
  loadLayer(type) {
    switch (type) {
      case 'plant':
      case 'waterplant':
      case 'plantsewage':
      case 'plantwater': {
        // 水厂
        this._sewagePlantLayer.loadLayer();
        break;
      }
      case 'industryplant':
      case 'plantindustry': {
        // 工废处理厂
        this._industryPlantLayer.loadLayer();
        break;
      }
      case 'otherplant': {
        // 其他水厂
        this._otherPlantLayer.loadLayer();
        break;
      }
      case 'agricwaste':
      case 'agricsewage': {
        // 农污
        this._ruralSewageLayer.loadLayer();
        break;
      }
      case 'pumpwaste':
      case 'pumpsewage': {
        // 污水泵站
        this._sewagePumpLayer.loadLayer();
        this._sewagePumpAreaLayer.loadLayer();
        break;
      }
      case 'pumprain': {
        // 雨水泵站
        this._rainPumpLayer.loadLayer();
        break;
      }
      case 'pumpindustry': {
        // 工废泵站
        this._industryPumpLayer.loadLayer();
        break;
      }
      case 'pumpcombine': {
        // 一体化泵站
        this._combinePumpLayer.loadLayer();
        break;
      }
      case 'servicerange': // 纳污范围
      case 'servicerange-plant':
      case 'servicerange-pump': {
        this._serviceRangeLayer.loadLayer();
        break;
      }
      default:
        break;
    }
  }

  /**
   * 显示/隐藏图层
   * @param {String} type -类型
   * @param {Boolean} isShow -是否显示图层
   */
  showLayer(type, isShow) {
    switch (type) {
      case 'plant':
      case 'waterplant':
      case 'plantsewage':
      case 'plantwater': {
        // 水厂
        this._sewagePlantLayer.showLayer(isShow);
        break;
      }
      case 'industryplant':
      case 'plantindustry':{
        // 工废处理厂
        this._industryPlantLayer.showLayer(isShow);
        break;
      }
      case 'otherplant': {
        // 其他水厂
        this._otherPlantLayer.showLayer(isShow);
        break;
      }
      case 'agricwaste':
      case 'agricsewage': {
        // 农污
        this._ruralSewageLayer.showLayer(isShow);
        break;
      }
      case 'pumpwaste':
      case 'pumpsewage': {
        // 污水泵站
        this._sewagePumpLayer.showLayer(isShow);
        this._sewagePumpAreaLayer.showLayer(isShow);
        break;
      }
      case 'pumprain': {
        // 雨水泵站
        this._rainPumpLayer.showLayer(isShow);
        break;
      }
      case 'pumpindustry': {
        // 工废泵站
        this._industryPumpLayer.showLayer(isShow);
        break;
      }
      case 'pumpcombine': {
        // 一体化泵站
        this._combinePumpLayer.showLayer(isShow);
        break;
      }
      case 'servicerange': // 纳污范围
      case 'servicerange-plant':
      case 'servicerange-pump': {
        // 纳污范围
        this._serviceRangeLayer.showLayer(isShow);
        break;
      }
      default:
        break;
    }
  }

  /**
   * 判断是否已加载图层
   * @param {String} type -类型
   *
   * @returns {Boolean}
   */
  hasLayer(type) {
    switch (type) {
      case 'plant':
      case 'waterplant':
      case 'plantsewage':
      case 'plantwater':
        // 水厂
        return this._sewagePlantLayer.hasLayer();
      case 'industryplant':
      case 'plantindustry':
        // 工废处理厂
        return this._industryPlantLayer.hasLayer();
      case 'otherplant':
        // 其他水厂
        return this._otherPlantLayer.hasLayer();
      case 'agricwaste':
      case 'agricsewage':
        // 农污
        return this._ruralSewageLayer.hasLayer();
      case 'pumpwaste':
      case 'pumpsewage':
        // 污水泵站
        return this._sewagePumpLayer.hasLayer();
      case 'pumprain':
        // 雨水泵站
        return this._rainPumpLayer.hasLayer();
      case 'pumpindustry':
        // 工废泵站
        return this._industryPumpLayer.hasLayer();
      case 'pumpcombine':
        // 一体化泵站
        return this._combinePumpLayer.hasLayer();
      case 'servicerange':
      case 'servicerange-plant':
      case 'servicerange-pump':
        // 纳污范围
        return this._serviceRangeLayer.hasLayer();
      default:
        return false;
    }
  }

  /**
   * 移除图层
   * @param {String} type -类型
   */
  removeLayer(type) {
    switch (type) {
      case 'plant':
      case 'waterplant':
      case 'plantsewage':
      case 'plantwater': {
        // 水厂
        this._sewagePlantLayer.removeLayer();
        break;
      }
      case 'industryplant':
      case 'plantindustry':{
        // 工废处理厂
        this._industryPlantLayer.removeLayer();
        break;
      }
      case 'otherplant': {
        // 其他水厂
        this._otherPlantLayer.removeLayer();
        break;
      }
      case 'agricwaste':
      case 'agricsewage': {
        // 农污
        this._ruralSewageLayer.removeLayer();
        break;
      }
      case 'pumpwaste':
      case 'pumpsewage': {
        // 污水泵站
        this._sewagePumpLayer.removeLayer();
        this._sewagePumpAreaLayer.removeLayer();
        break;
      }
      case 'pumprain': {
        // 雨水泵站
        this._rainPumpLayer.removeLayer();
        break;
      }
      case 'pumpindustry': {
        // 工废泵站
        this._industryPumpLayer.removeLayer();
        break;
      }
      case 'pumpcombine': {
        // 一体化泵站
        this._combinePumpLayer.removeLayer();
        break;
      }
      case 'servicerange': // 纳污范围
      case 'servicerange-plant':
      case 'servicerange-pump': {
        // 纳污范围
        this._serviceRangeLayer.removeLayer();
        break;
      }
      default:
        break;
    }
  }

  /**
   * 显示/隐藏所有图层
   * @param {Boolean} show -是否显示
   */
  showAllLayers(show) {
    // 其他水厂
    this._otherPlantLayer.showLayer(show);
    // 工废处理厂
    this._industryPlantLayer.showLayer(show);
    // 污水厂
    this._sewagePlantLayer.showLayer(show);

    // 农污
    this._ruralSewageLayer.showLayer(show);

    // 雨水泵站
    this._rainPumpLayer.showLayer(show);
    // 一体化泵站
    this._combinePumpLayer.showLayer(show);
    // 工废本站
    this._industryPumpLayer.showLayer(show);
    // 污水泵站
    this._sewagePumpLayer.showLayer(show);
    this._sewagePumpAreaLayer.showLayer(show);

    // 纳污范围
    this._serviceRangeLayer.showLayer(show);
  }

  /**
   * 移除所有图层
   */
  removeAllLayers() {
    // 其他水厂
    this._otherPlantLayer.removeLayer();
    // 工废处理厂
    this._industryPlantLayer.removeLayer();
    // 污水厂
    this._sewagePlantLayer.removeLayer();
    // 移除数据源
    this._sewagePlantLayer.removeSource();

    // 农污
    this._ruralSewageLayer.removeLayer();
    this._ruralSewageLayer.removeSource();

    // 雨水泵站
    this._rainPumpLayer.removeLayer();
    // 一体化泵站
    this._combinePumpLayer.removeLayer();
    // 工废本站
    this._industryPumpLayer.removeLayer();
    // 污水泵站
    this._sewagePumpLayer.removeLayer();
    this._sewagePumpAreaLayer.removeLayer();
    // 移除数据源
    this._sewagePumpLayer.removeSource();
    this._sewagePumpAreaLayer.removeSource();

    // 纳污范围
    this._serviceRangeLayer.removeLayer();
  }

  /**
   * 绑定事件
   * @param {String} type -设施类型
   * @param {String} name -事件名称
   * @param {Function} event -事件函数
   */
  bindEvent(type, name, event) {
    switch (type) {
      case 'plant': { // 厂
        // 水厂
        this._sewagePlantLayer.onEvent(name, event);
        // 工废处理厂
        this._industryPlantLayer.onEvent(name, event);
        // 其他水厂
        this._otherPlantLayer.onEvent(name, event);
        break;
      }
      case 'pump': { // 泵站
        // 雨水泵站
        this._rainPumpLayer.onEvent(name, event);
        // 污水泵站
        this._sewagePumpLayer.onEvent(name, event);
        // 工废泵站
        this._industryPumpLayer.onEvent(name, event);
        // 一体化泵站
        this._combinePumpLayer.onEvent(name, event);
        break;
      }
      case 'rural':
      case 'agricwaste':
      case 'agricsewage': { // 农污
        this._ruralSewageLayer.onEvent(name, event);
        break;
      }
      case 'waterplant':
      case 'plantsewage':
      case 'plantwater': {
        // 水质净化厂
        this._sewagePlantLayer.onEvent(name, event);
        break;
      }
      case 'industryplant':
      case 'plantindustry': {
        // 工废处理厂
        this._industryPlantLayer.onEvent(name, event);
        break;
      }
      case 'otherplant': {
        // 其他水厂
        this._otherPlantLayer.onEvent(name, event);
        break;
      }
      case 'pumpwaste':
      case 'pumpsewage': {
        // 污水泵站
        this._sewagePumpLayer.onEvent(name, event);
        break;
      }
      case 'pumprain': {
        // 雨水泵站
        this._rainPumpLayer.onEvent(name, event);
        break;
      }
      case 'pumpindustry': {
        // 工废泵站
        this._industryPumpLayer.onEvent(name, event);
        break;
      }
      case 'pumpcombine': {
        // 一体化泵站
        this._combinePumpLayer.onEvent(name, event);
        break;
      }
      default:
        break;
    }
  }

  /**
   * 绑定单击事件
   * @param {String} type -设施类型
   * @param {Function} event -事件函数
   */
  bindClickEvent(type, event) {
    switch (type) {
      case 'plant': { // 厂
        // 水厂
        this._sewagePlantLayer.onClick(event);
        // 工废处理厂
        this._industryPlantLayer.onClick(event);
        // 其他水厂
        this._otherPlantLayer.onClick(event);
        break;
      }
      case 'pump': { // 泵站
        // 雨水泵站
        this._rainPumpLayer.onClick(event);
        // 污水泵站
        this._sewagePumpLayer.onClick(event);
        // 工废泵站
        this._industryPumpLayer.onClick(event);
        // 一体化泵站
        this._combinePumpLayer.onClick(event);
        break;
      }
      case 'rural':
      case 'agricwaste':
      case 'agricsewage': { // 农污
        this._ruralSewageLayer.onClick(event);
        break;
      }
      case 'waterplant':
      case 'plantsewage':
      case 'plantwater': {
        // 水厂
        this._sewagePlantLayer.onClick(event);
        break;
      }
      case 'industryplant':
      case 'plantindustry': {
        // 工废处理厂
        this._industryPlantLayer.onClick(event);
        break;
      }
      case 'otherplant': {
        // 其他水厂
        this._otherPlantLayer.onClick(event);
        break;
      }
      case 'pumpwaste':
      case 'pumpsewage': {
        // 污水泵站
        this._sewagePumpLayer.onClick(event);
        break;
      }
      case 'pumprain': {
        // 雨水泵站
        this._rainPumpLayer.onClick(event);
        break;
      }
      case 'pumpindustry': {
        // 工废泵站
        this._industryPumpLayer.onClick(event);
        break;
      }
      case 'pumpcombine': {
        // 一体化泵站
        this._combinePumpLayer.onClick(event);
        break;
      }
      default:
        break;
    }
  }

  /** 私有方法 **/
  /**
   * 初始化图层
   */
  _initLayers() {
    // 水质净化厂
    this._initPlantLayer();

    // 农污装置
    this._initRuralSewageLayer();

    // 泵站
    this._initPumpLayer();

    // 纳污范围
    this._initRangeLayer();
  }

  /**
   * 初始化水厂图层
   */
  _initPlantLayer() {
    // 水质净化厂
    this._sewagePlantLayer = new PlantLayer({
      map: this._map,
      minzoom: this._minzoom,
      icon: 'wp_sew',
      field: 'short_name',
      filter: ['==', 'category', '2'],
      layerId: 'pipe_waterplant',
    });

    // 工废处理厂
    this._industryPlantLayer = new PlantLayer({
      map: this._map,
      minzoom: this._minzoom,
      icon: 'wp_ind',
      field: 'short_name',
      filter: ['==', 'category', '5'],
      layerId: 'pipe_industryplant',
    });

    // 其他水厂
    this._otherPlantLayer = new PlantLayer({
      map: this._map,
      minzoom: this._minzoom,
      icon: 'wp_oth',
      field: 'short_name',
      filter: ['==', 'category', '4'],
      layerId: 'pipe_otherplant',
    });
  }

  /**
   * 初始化农污图层
   */
  _initRuralSewageLayer() {
    let iconExp = {
      property: "asset_status",
      type: "categorical",
      stops: [
        ["1", "rural_sew2"],
        ["2", "rural_sew-off2"]
      ],
      default: "rural_sew2"
    };

    this._ruralSewageLayer = new RuralSewageLayer({
      map: this._map,
      minzoom: this._minzoom,
      icon: iconExp,
      layerId: 'pipe_agricwaste',
    });
  }

  /**
   * 初始化泵站图层
   */
  _initPumpLayer() {
    // 雨水泵站
    this._rainPumpLayer = new PumpLayer({
      map: this._map,
      minzoom: this._minzoom,
      icon: 'ps_rain',
      field: 'short_name',
      filter: ['==', 'category', '1'],
      layerId: 'pipe_pumpstation-rai',
    });

    // 污水泵站
    this._sewagePumpLayer = new PumpLayer({
      map: this._map,
      minzoom: this._minzoom,
      icon: 'ps_sew',
      field: 'short_name',
      filter: ['==', 'category', '2'],
      layerId: 'pipe_pumpstation-sew',
    });
    this._sewagePumpAreaLayer = new SimpleFillLayer({
      map: this._map,
      minzoom: this._minzoom + 2,
      color: '#FF8E09',
      opacity: 0.25,
      outline: true,
      lineColor: '#FF8E09',
      lineWidth: 0.75,
      lineOpacity: 0.75,
      dasharray: [2.5, 1.5],
      filter: ['==', 'category', '2'],
      sourceId: 'pipe_pumpstation_a',
      layerId: 'pipe_pumpstation-sew' + '-fill',
    });

    // 工废泵站   liudan
    this._industryPumpLayer = new PumpLayer({
      map: this._map,
      minzoom: this._minzoom,
      icon: 'ps_ind',
      filter: ['==', 'category', '5'],
      layerId: 'pipe_pumpstation-ind',
    });

    // 一体化泵站
    this._combinePumpLayer = new PumpLayer({
      map: this._map,
      minzoom: this._minzoom,
      icon: 'ps_com',
      filter: ['==', 'category', '3'],
      layerId: 'pipe_pumpstation-com',
    });
  }

  /**
   * 初始化纳污范围图层
   */
  _initRangeLayer() {
    this._serviceRangeLayer = new ServiceRangeLayer({
      map: this._map,
      minzoom: this._minzoom,
      color: '#00FFF0',
      layerId: 'pipe_pollution_range'
    });
  }
}
