import DataUtils from '../utils/DataUtils';
import GeoJsonProvider from '../geog/GeoJsonProvider';
import LayerProvider from '../geog/LayerProvider';
import VerifyUtils from '../utils/VerifyUtils';

/**
 * 点绘制类
 * @alias PointDrawing
 *
 * @summary <用于动态绘制点>
 */
export default class PointDrawing {
  /**
   * 构造函数
   * @param {Object} options -图层选项
   */
  constructor(options) {
    /**
     * 地图对象
     * @type {Object}
     */
    this._map = options.map;

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

    this._isDrawing = false;
    this._clickEvent = null; // 单击事件

    // 数据源ID
    this._sourceId = 'drawing_point';
    // 图层ID
    this._layerId = this._sourceId;

    // 点GeoJSON要素集
    this._fc = GeoJsonProvider.getEmptyFC();
  }

  /** 公有方法 **/
  /**
   * 开始绘制
   * @param {function} callback -回调函数
   */
  draw(callback) {
    // 加载图层
    if (!this._hasLayer()) {
      this._loadLayer();
    }

    const map = this._map;
    // 改变光标
    map.getCanvas().style.cursor = 'crosshair';

    this._isDrawing = true;

    let that = this;
    /**
     * 单击事件
     */
    this._clickEvent = function onClickEvent(e) {
      // 改变光标
      map.getCanvas().style.cursor = 'crosshair';

      let lonLat = [e.lngLat.lng, e.lngLat.lat];
      // 获取点要素
      let feature = GeoJsonProvider.getPointFeature(lonLat);
      that._fc.features = [ feature ];

      // 更新数据源
      LayerProvider.updateSource(map, that._sourceId, that._fc);

      // 回调
      if (callback) {
        callback(feature);
      }
    }

    // 绑定事件
    map.on('click', this._clickEvent);
  }

  /**
   * 绘制结束
   */
  finish() {
    const map = this._map;

    // 改变光标
    map.getCanvas().style.cursor = '';
    // 允许双击缩放
    //map.doubleClickZoom.enable();

    // 解除事件绑定
    map.off('click', this._clickEvent);

    this._isDrawing = false;
  }

  /**
   * 设置点数据
   * @param {Object} data -点要素
   */
  setData(data) {
    if (!VerifyUtils.isGeoJsonFeature(data)) {
      this._fc.features = [];
    } else {
      this._fc.features = [ data ];
    }

    // 更新数据源
    LayerProvider.updateSource(this._map, this._sourceId, this._fc);
  }

  /**
   * 获取GeoJSON要素集
   *
   * @returns {Object} GeoJSON对象
   */
  getData() {
    return this._fc;
  }

  /**
   * 清空数据
   */
  clearData() {
    this._fc.features = [];
    // 更新数据源
    LayerProvider.updateSource(this._map, this._sourceId, this._fc);
  }

  /**
   * 移除图层
   */
  removeLayer() {
    // 移除图层
    LayerProvider.removeLayer(map, this._layerId);

    // 移除数据源
    LayerProvider.removeSource(map, this._sourceId);

    // 数据设置为空
    this._fc.features = [];
  }

  /** 私有方法 **/
  /**
   * 加载图层
   */
  _loadLayer() {
    if (this._hasLayer()) return;

    // 添加数据源
    this._map.addSource(this._sourceId, {
      type: "geojson",
      data: this._fc
    });

    // 添加图层
    this._map.addLayer({
      type: "circle",
      id: this._layerId,
      source: this._sourceId,
      minzoom: this._minzoom,
      layout: {
        visibility: "visible",
      },
      paint: {
        "circle-radius": 4.5,
        "circle-color": "#176BC9",
        "circle-opacity": 0.75,
        "circle-stroke-width": 2,
        "circle-stroke-color": "#78B7FF"
      }
    });
  }

  /**
   * 判断图层是否已加载
   *
   * @returns {Boolean}
   */
  _hasLayer() {
    return LayerProvider.hasLayer(this._map, this._layerId);
  }
}
