/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.25/esri/copyright.txt for details. */ import{_ as e}from"../chunks/tslib.es6.js";import r from"../core/Accessor.js";import t from"../core/Error.js";import i from"../core/Logger.js";import{someMap as a}from"../core/MapUtils.js";import{isNone as s,isSome as o,removeMaybe as l}from"../core/maybe.js";import{createDeferred as n,createAbortError as y,isAbortError as h,onAbort as w,throwIfAborted as p}from"../core/promiseUtils.js";import{on as c,watch as d,syncAndInitial as m}from"../core/reactiveUtils.js";import{schedule as u}from"../core/scheduling.js";import{property as f}from"../core/accessorSupport/decorators/property.js";import"../core/arrayUtils.js";import"../core/accessorSupport/ensureType.js";import{subclass as _}from"../core/accessorSupport/decorators/subclass.js";import{WatchUpdatingTracking as g}from"../core/support/WatchUpdatingTracking.js";class v{constructor(e,r,i){this.layer=e,this.view=r,this.layerViewImporter=i,this._controller=new AbortController,this._deferred=n(),this._started=!1,this.done=!1,w(this._controller.signal,(()=>{const r=new t("cancelled:layerview-create","layerview creation cancelled",{layer:e});this._deferred.reject(r)}))}get promise(){return this._deferred.promise}destroy(){this._controller.abort();const{layerView:e}=this;if(!e)return;const{layer:r,view:t}=this;r.emit("layerview-destroy",{view:t,layerView:e}),t.emit("layerview-destroy",{layer:r,layerView:e}),this.done=!0,this.layer=null,this.layerView=null,this.view=null,this.layerViewImporter=null}async start(){if(this._started)return;this._started=!0;const{_controller:{signal:e},layer:r,view:i}=this;this._map=i.map;try{let s,o;if(await r.load({signal:e}),"prefetchResources"in r&&await r.prefetchResources({signal:e}),r.createLayerView)s=await r.createLayerView(i,{signal:e});else{if(!this.layerViewImporter.hasLayerViewModule(r))throw new t("layer:view-not-supported","No layerview implementation was found");const a=await this.layerViewImporter.importLayerView(r);p(e),s="default"in a?new a.default({layer:r,view:i}):new a({layer:r,view:i})}const n=()=>{o=l(o),s.destroyed||s.destroy(),s.layer=null,s.parent=null,s.view=null,this.done=!0};o=w(e,n),p(e);try{await s.when()}catch(a){throw n(),a}const y=this._map?.allLayers?.includes(r);if(!y)return n(),void this._deferred.reject(new t("view:no-layerview-for-layer","The layer has been removed from the map",{layer:r}));this.layerView=s,r.emit("layerview-create",{view:i,layerView:s}),i.emit("layerview-create",{layer:r,layerView:s}),this.done=!0,this._deferred.resolve(s)}catch(a){r.emit("layerview-create-error",{view:i,error:a}),i.emit("layerview-create-error",{layer:r,error:a}),this.done=!0,this._deferred.reject(new t("layerview:create-error","layerview creation failed",{layer:r,error:a}))}}}let V=class extends r{constructor(e){super(e),this._layerLayerViewInfoMap=new Map,this._watchUpdatingTracking=new g,this.supportsGround=!0,this._preloadLayerViewModules=()=>{const e=this.view.map?.allLayers;if(e)for(const r of e)this.layerViewImporter.hasLayerViewModule(r)&&this.layerViewImporter.importLayerView(r)},this._reschedule=()=>(s(this._workPromise)&&(this._workPromise=n(),this._workPromise.promise.catch((()=>{}))),this.removeHandles("reschedule"),this.addHandles(u(this._doWork),"reschedule"),this._workPromise.promise),this._doWork=()=>{const e=this.view.map;if(this._map!==e&&(this.clear(),this._map=e),s(this._workPromise))return void this.notifyChange("updating");this.removeHandles("reschedule"),this.removeHandles("collection-change");const r=[],t=e=>{if(!s(e))for(const i of e)i&&(r.push(i),this._createLayerView(i),"layers"in i&&i.layers&&t(i.layers))};for(const s of this._rootCollectionNames)t(this.get(s));this._refreshCollections();for(const[s,o]of this._layerLayerViewInfoMap)r.includes(s)||(this._layerLayerViewInfoMap.delete(o.layer),o.destroy());const i=r.filter((e=>"group"===e.type)).map((e=>e.layers)),a=[e?.ground?.layers,e?.basemap?.baseLayers,e?.basemap?.referenceLayers,e?.layers,...i].filter((e=>!!e));this.addHandles(a.map((e=>this._watchUpdatingTracking.addOnCollectionChange((()=>e),this._reschedule))),"collection-change"),this._workPromise.resolve(),this._workPromise=null}}initialize(){this.own([c((()=>this.view?.map?.allLayers),"change",this._preloadLayerViewModules,{onListenerAdd:this._preloadLayerViewModules}),d((()=>{const e=this.view,r=e?.map;return[r?.basemap,r?.ground,r?.layers,e?.ready]}),(()=>this._reschedule()),m)]),this._preloadLayerViewModules(),this._reschedule()}destroy(){this.clear(),this._watchUpdatingTracking.destroy(),this._map=null,o(this._workPromise)&&(this._workPromise.reject(y()),this._workPromise=null)}get _layersToLayerViews(){const e=[["view.map.basemap.baseLayers","view.basemapView.baseLayerViews"],["view.map.layers","view.layerViews"],["view.map.basemap.referenceLayers","view.basemapView.referenceLayerViews"]];return this.supportsGround&&e.push(["view.map.ground.layers","view.groundView.layerViews"]),new Map(e)}get _rootCollectionNames(){return Array.from(this._layersToLayerViews.keys())}get updating(){return o(this._workPromise)||this._watchUpdatingTracking.updating||a(this._layerLayerViewInfoMap,(e=>!e.done))}get updatingRemaining(){let e=0;for(const r of this._layerLayerViewInfoMap.values())r.done||++e;return e}clear(){if(!this.destroyed){for(const e of this._layerLayerViewInfoMap.values())e.destroy();this._layerLayerViewInfoMap.clear(),this._refreshCollections()}}async whenLayerView(e){if(await this._reschedule(),!this._layerLayerViewInfoMap.has(e))throw new t("view:no-layerview-for-layer","No layerview has been found for the layer",{layer:e});return this._layerLayerViewInfoMap.get(e).promise}_refreshCollections(){for(const[e,r]of this._layersToLayerViews)this._populateLayerViewsOwners(this.get(e),this.get(r),this.view);this.notifyChange("updating"),this.notifyChange("updatingRemaining")}_populateLayerViewsOwners(e,r,t){if(!e||!r)return void(r&&r.removeAll());let i=0;for(const a of e){const e=this._layerLayerViewInfoMap.get(a);if(!e||!e.layerView)continue;const s=e.layerView;s.layer=a,s.parent=t,r.getItemAt(i)!==s&&r.splice(i,0,s),a.layers&&this._populateLayerViewsOwners(a.layers,s.layerViews,s),i+=1}i{})),this.layerViewImporter.hasLayerViewModule(e)&&this.layerViewImporter.importLayerView(e);const r=new v(e,this.view,this.layerViewImporter);r.promise.then((()=>this._refreshCollections()),(r=>{r&&(h(r)||"cancelled:layerview-create"===r.name)||i.getLogger(this.declaredClass).error(`Failed to create layerview for layer title:'${e.title??"no title"}', id:'${e.id??"no id"}' of type '${e.type}'.`,{layer:e,error:r}),this._refreshCollections()})),this._layerLayerViewInfoMap.set(e,r),this.view.ready&&r.start(),this.notifyChange("updating"),this.notifyChange("updatingRemaining")}};e([f()],V.prototype,"_workPromise",void 0),e([f({readOnly:!0})],V.prototype,"_watchUpdatingTracking",void 0),e([f({readOnly:!0})],V.prototype,"_layersToLayerViews",null),e([f({readOnly:!0})],V.prototype,"_rootCollectionNames",null),e([f()],V.prototype,"layerViewImporter",void 0),e([f()],V.prototype,"supportsGround",void 0),e([f({readOnly:!0})],V.prototype,"updating",null),e([f({readOnly:!0})],V.prototype,"updatingRemaining",null),e([f({constructOnly:!0})],V.prototype,"view",void 0),V=e([_("esri.views.LayerViewManager")],V);const L=V;export{L as default};