import mapboxgl from "mapbox-gl";

/**
 * 地图工具类
 */
const MapUtils = {
  /* 坐标转换 */
  /**
   * 经纬度转WebGL坐标
   * @param {Number[]} lonLat -经纬度坐标
   * @param {Number} alt -高程
   *
   * @returns {x:x, y:y, z:z}
   */
  toPosition(lonLat, alt = 0) {
    return mapboxgl.MercatorCoordinate.fromLngLat({
      lng: lonLat[0],
      lat: lonLat[1]
    }, alt ? alt : 0);
  },

  /**
   * 经纬度转屏幕坐标(像素)
   * @param {Object} map -地图对象
   * @param {Number[]} lonLat -经纬度坐标
   *
   * @returns {x:x, y:y}
   */
  toPixel(map, lonLat) {
    return map.project(lonLat);
  },

  /**
   * 屏幕坐标转经纬度
   * @param {Object} map -地图对象
   * @param {Number[] | Object} xy -屏幕坐标
   */
  toCoordinates(map, xy) {
    return map.unproject(xy);
  },
  /* */

  /**
   * 设置鼠标样式
   * @param {Object} map -地图对象
   * @param {String} cursor -鼠标样式
   */
  setCursor(map, cursor = '') {
    if (map.getCanvas().style.cursor !== 'crosshair') {
      map.getCanvas().style.cursor = cursor;
    }
  },

  /**
   * 将对应图层移动至最顶层
   * @param map
   * @param targetId
   */
  moveToTop(map,targetId) {
    map.moveLayer(targetId)
  },

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

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

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

  /**
   * 适应边界框
   * @param {Object} map -地图对象
   * @param {Number[][]} bbox -边界盒
   * @param {Boolean} jump -是否直接定位
   */
  fitBounds(map, bbox, jump = false) {
    map.fitBounds(bbox, {
      animate: !jump,
      pitch: map.getPitch(),
      bearing: map.getBearing(),
      padding: 20,
    });
  },

  /**
   * 缩放至边界框
   * @param {Object} map -地图对象
   * @param {Number[][]} bbox -边界盒
   * @param {Number} zoom -缩放层级
   * @param {Boolean} jump -是否直接定位
   */
  zoomToBounds(map, bbox, zoom, jump = false) {
    const currZoom = map.getZoom();

    map.fitBounds(bbox, {
      animate: !jump,
      pitch: map.getPitch(),
      bearing: map.getBearing(),
      padding: 20,
      maxZoom: zoom > currZoom ? zoom : currZoom
    });
  }
}

export default MapUtils;