'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');

var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);

var _createClass2 = require('babel-runtime/helpers/createClass');

var _createClass3 = _interopRequireDefault(_createClass2);

var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');

var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);

var _inherits2 = require('babel-runtime/helpers/inherits');

var _inherits3 = _interopRequireDefault(_inherits2);

var _assign = require('lodash/assign');

var _assign2 = _interopRequireDefault(_assign);

var _findIndex = require('lodash/findIndex');

var _findIndex2 = _interopRequireDefault(_findIndex);

var _omit = require('omit.js');

var _omit2 = _interopRequireDefault(_omit);

var _basicMapApiClass = require('../util/basicMapApiClass');

var _basicMapApiClass2 = _interopRequireDefault(_basicMapApiClass);

var _methodsUtil = require('../../_util/methods-util');

var _components = require('../../map/components');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }

/**
 * @文件说明: 构建地图Marker标注接口对象
 * @创建人: pjtools@vip.qq.com
 * @创建时间: 2020-06-11 16:50:28
 */

var defaultMarkerOptions = {
  // 标注的内容插槽
  slots: null,
  // 标注容器的Class类名
  className: null,
  // 标注容器的Style样式
  style: null,
  // 标注Vue组件的自定义数据
  data: null,
  // 标注的分组Id
  groupId: null,
  // 标注定位到坐标点的位置
  anchor: 'center',
  // 标注的相对偏移量
  offset: [0, 0],
  // 是否启用拖拽移动
  draggable: false,
  // 标注的颜色，当采用默认标注时有效
  color: '#1890ff'
};

var _map = Symbol('map');
var _markers = Symbol('markers');
var _markersGroup = Symbol('markersGroup');

var Marker = function (_BasicMapApi) {
  (0, _inherits3['default'])(Marker, _BasicMapApi);

  function Marker(iMapApi) {
    (0, _classCallCheck3['default'])(this, Marker);

    // 地图Map对象
    var _this = (0, _possibleConstructorReturn3['default'])(this, (Marker.__proto__ || Object.getPrototypeOf(Marker)).call(this, iMapApi));

    _this[_map] = iMapApi && iMapApi.map;
    // 定义地图的Marker对象存储器
    _this[_markers] = {};
    // 定义地图的Marker分组对象存储器
    _this[_markersGroup] = {};
    return _this;
  }

  /**
   * 获取所有创建的Marker对象
   */


  (0, _createClass3['default'])(Marker, [{
    key: 'add',


    /**
     * 动态创建Vue组件版的Marker标注对象
     * @param {String} id 标注的唯一Id名
     * @param {Array} coordinates 标注的坐标点
     * @param {Object} options 标注的参数选项
     */
    value: function add(id, coordinates) {
      var _this2 = this;

      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
      var mapboxgl = this.iMapApi.exports.mapboxgl;

      var opts = (0, _assign2['default'])({}, defaultMarkerOptions, options || {});

      // 创建Marker的Element对象
      var element = document.createElement('div');
      opts.element = element;
      // 实例化Marker对象
      var markerOptions = (0, _omit2['default'])(opts, ['className', 'style', 'slots', 'data', 'groupId']);
      var marker = new mapboxgl.Marker(markerOptions);
      marker.id = id;
      element.setAttribute('data-id', id);
      marker.setLngLat(coordinates);
      // 添加Marker到地图
      marker.addTo(this[_map]);

      // 创建组件包的Props属性
      var props = {};
      props.getContainer = function () {
        return marker.getElement();
      };
      props.iMapApi = this.iMapApi;
      props.type = 'marker';
      var prefixCls = (0, _methodsUtil.getPrefixCls)('map');
      props['class'] = [prefixCls + '-marker'];
      opts.draggable && props['class'].push('draggable');
      opts.className && props['class'].push(opts.className);
      opts.style && (props.style = opts.style);
      opts.slots && (props.slots = opts.slots);
      props.vProps = { marker: marker, data: opts.data || null };
      props.options = opts;
      // 创建Vue组件包实例
      _components.ElementWrapper.newInstance(props, function (instance) {
        marker._instance = instance;
      });
      // 删除部分原生方法
      marker.addTo && (marker.addTo = function () {
        return null;
      });
      // 重构原生方法
      marker._removeMarker = marker.remove;
      marker.remove = function () {
        _this2.remove(marker.id);
      };

      // 存储当前实例的Marker对象
      this[_markers][id] = marker;
      // 判断是否对Marker标识分组
      opts.groupId && this.addMarkerToGroup(marker.id, opts.groupId);

      return marker;
    }

    /**
     * 获取指定Id的Marker标注对象
     * @param {String} id 标注的唯一Id名
     */

  }, {
    key: 'get',
    value: function get(id) {
      return id && this[_markers] && this[_markers][id];
    }

    /**
     * 将指定Id的Marker标注添加到分组队列中
     * @param {String} id 标注的唯一Id名
     * @param {String} groupId 分组的唯一Id名
     */

  }, {
    key: 'addMarkerToGroup',
    value: function addMarkerToGroup(id, groupId) {
      if (!id || !groupId) {
        return;
      }
      var marker = this.get(id);
      if (!marker) {
        console.error('\u6307\u5B9AId\uFF1A[' + id + ']Marker\u6807\u6CE8\u4E0D\u5B58\u5728.');
        return;
      }
      // 判断是否Marker标注已设定分组名
      if (marker._groupid) {
        this.removeMarkerToGroup(id, marker._groupid);
      }
      // 将Marker添加到指定Id分组
      marker._groupid = groupId;
      !this[_markersGroup][groupId] && (this[_markersGroup][groupId] = []);
      this[_markersGroup][groupId].push(marker);
    }

    /**
     * 获取指定Id的分组下的所有Marker标注
     * @param {String} id 标注的唯一Id名
     */

  }, {
    key: 'getGroup',
    value: function getGroup(id) {
      return id && this[_markersGroup] && this[_markersGroup][id];
    }

    /**
     * 将指定Id的Marker标注从分组队列中移除
     * @param {String} id 标注的唯一Id名
     * @param {String} groupId 分组的唯一Id名
     */

  }, {
    key: 'removeMarkerToGroup',
    value: function removeMarkerToGroup(id, groupId) {
      if (!id || !groupId) {
        return;
      }
      // 在分组中查找指定Id的Marker标注的索引
      var markersGroup = this[_markersGroup][groupId];
      var index = (0, _findIndex2['default'])(markersGroup, { id: id });
      // 移除Marker标注的分组信息
      if (index >= 0) {
        markersGroup.splice(index, 1);
        // 判断分组对象是否已经清空
        if (!markersGroup.length) {
          delete this[_markersGroup][groupId];
        }
      }
    }

    /**
     * 删除指定Id的Marker标注对象
     * @param {String} id 标注的唯一Id名
     */

  }, {
    key: 'remove',
    value: function remove(id) {
      var marker = this.get(id);
      if (marker) {
        // 判断是否有Marker分组信息
        if (marker._groupid) {
          this.removeMarkerToGroup(id, marker._groupid);
        }
        // 移除Marker的Vue组件对象
        marker._instance && marker._instance.destroy();
        // 移除地图的Marker对象
        marker._removeMarker && marker._removeMarker();
        // 移除Marker的存储对象记录
        if (this[_markers][id]) {
          delete this[_markers][id];
        }
      }
    }

    /**
     * 删除指定Id的分组的所有Marker标注对象
     * @param {String} id 分组的唯一Id名
     */

  }, {
    key: 'removeGroup',
    value: function removeGroup(id) {
      if (!id) {
        return;
      }
      // 查找指定Id分组的所有Marker标注，并循环删除
      var markersGroup = this[_markersGroup][id];
      if (markersGroup && markersGroup.length) {
        for (var i = markersGroup.length - 1; i >= 0; i--) {
          var marker = markersGroup[i];
          this.remove(marker.id);
        }
      }
    }

    /**
     * 清空所有的Marker标注对象
     */

  }, {
    key: 'removeAll',
    value: function removeAll() {
      if (this.markers && this.markers.length) {
        for (var i = this.markers.length - 1; i >= 0; i--) {
          var marker = this.markers[i];
          this.remove(marker.id);
        }
      }
    }
  }, {
    key: 'markers',
    get: function get() {
      var _this3 = this;

      var keys = Object.keys(this[_markers]);
      return keys.map(function (key) {
        return _this3[_markers][key];
      });
    }
  }]);
  return Marker;
}(_basicMapApiClass2['default']);

exports['default'] = Marker;