import BaseLayer from"./Base.js";import Collection from"../Collection.js";import CollectionEventType from"../CollectionEventType.js";import Event from"../events/Event.js";import EventType from"../events/EventType.js";import ObjectEventType from"../ObjectEventType.js";import SourceState from"../source/State.js";import{assert}from"../asserts.js";import{assign,clear}from"../obj.js";import{getIntersection}from"../extent.js";import{getUid}from"../util.js";import{listen,unlistenByKey}from"../events.js";class GroupEvent extends Event{constructor(e,t){super(e),this.layer=t}}const Property={LAYERS:"layers"};class LayerGroup extends BaseLayer{constructor(e){e=e||{};const t=assign({},e);delete t.layers;let s=e.layers;super(t),this.on,this.once,this.un,this.layersListenerKeys_=[],this.listenerKeys_={},this.addChangeListener(Property.LAYERS,this.handleLayersChanged_),s?Array.isArray(s)?s=new Collection(s.slice(),{unique:!0}):assert("function"==typeof s.getArray,43):s=new Collection(void 0,{unique:!0}),this.setLayers(s)}handleLayerChange_(){this.changed()}handleLayersChanged_(){this.layersListenerKeys_.forEach(unlistenByKey),this.layersListenerKeys_.length=0;const e=this.getLayers();this.layersListenerKeys_.push(listen(e,CollectionEventType.ADD,this.handleLayersAdd_,this),listen(e,CollectionEventType.REMOVE,this.handleLayersRemove_,this));for(const t in this.listenerKeys_)this.listenerKeys_[t].forEach(unlistenByKey);clear(this.listenerKeys_);var s=e.getArray();for(let e=0,t=s.length;e<t;e++){var r=s[e];this.registerLayerListeners_(r),this.dispatchEvent(new GroupEvent("addlayer",r))}this.changed()}registerLayerListeners_(e){const t=[listen(e,ObjectEventType.PROPERTYCHANGE,this.handleLayerChange_,this),listen(e,EventType.CHANGE,this.handleLayerChange_,this)];e instanceof LayerGroup&&t.push(listen(e,"addlayer",this.handleLayerGroupAdd_,this),listen(e,"removelayer",this.handleLayerGroupRemove_,this)),this.listenerKeys_[getUid(e)]=t}handleLayerGroupAdd_(e){this.dispatchEvent(new GroupEvent("addlayer",e.layer))}handleLayerGroupRemove_(e){this.dispatchEvent(new GroupEvent("removelayer",e.layer))}handleLayersAdd_(e){e=e.element;this.registerLayerListeners_(e),this.dispatchEvent(new GroupEvent("addlayer",e)),this.changed()}handleLayersRemove_(e){var e=e.element,t=getUid(e);this.listenerKeys_[t].forEach(unlistenByKey),delete this.listenerKeys_[t],this.dispatchEvent(new GroupEvent("removelayer",e)),this.changed()}getLayers(){return this.get(Property.LAYERS)}setLayers(e){const t=this.getLayers();if(t){var s=t.getArray();for(let e=0,t=s.length;e<t;++e)this.dispatchEvent(new GroupEvent("removelayer",s[e]))}this.set(Property.LAYERS,e)}getLayersArray(e){const t=void 0!==e?e:[];return this.getLayers().forEach(function(e){e.getLayersArray(t)}),t}getLayerStatesArray(e){const s=void 0!==e?e:[];var r=s.length,n=(this.getLayers().forEach(function(e){e.getLayerStatesArray(s)}),this.getLayerState());let i=n.zIndex;e||void 0!==n.zIndex||(i=0);for(let e=r,t=s.length;e<t;e++){const a=s[e];a.opacity*=n.opacity,a.visible=a.visible&&n.visible,a.maxResolution=Math.min(a.maxResolution,n.maxResolution),a.minResolution=Math.max(a.minResolution,n.minResolution),a.minZoom=Math.max(a.minZoom,n.minZoom),a.maxZoom=Math.min(a.maxZoom,n.maxZoom),void 0!==n.extent&&(void 0!==a.extent?a.extent=getIntersection(a.extent,n.extent):a.extent=n.extent),void 0===a.zIndex&&(a.zIndex=i)}return s}getSourceState(){return SourceState.READY}}export default LayerGroup;export{GroupEvent};