/* COPYRIGHT Esri - https://js.arcgis.com/5.1.0/LICENSE.txt */
import{isSome as t}from"../../../../core/arrayUtils.js";import{forEach as e}from"../../../../core/asyncUtils.js";import"../../../../core/has.js";import{onAbortOrThrow as r,throwIfAborted as s}from"../../../../core/promiseUtils.js";import{aggregateSymbolComplexity as o}from"./defaultSymbolComplexity.js";import{Graphics3DGraphic as a}from"./Graphics3DGraphic.js";import{Graphics3DObject3DGraphicLayer as i}from"./Graphics3DObject3DGraphicLayer.js";import{Graphics3DSymbolLayerCreationContext as n}from"./Graphics3DSymbolCreationContext.js";import{Loadable as l}from"./Loadable.js";import{AggregateSymbolComplexity as y}from"./SymbolComplexity.js";import{getSymbolMemorySize as h}from"./symbolMemory.js";class m extends l{set symbol(t){this._symbol=t,t.symbolLayers.forEach((e,r)=>{const s=this.symbolLayers[r];null!=s&&(s.symbol=t,s.symbolLayer=e)})}get symbol(){return this._symbol}constructor(t,e,r){super(e.schedule),this._symbol=t,this._context=e,this._backgroundLayers=r,this._destroyed=!1,this.symbolLayers=new Array,this.referenced=0,this._extentPadding=0}async doLoad(t){let o=this._symbol.symbolLayers;this._extentPadding=0,this._backgroundLayers&&(o=this._backgroundLayers.concat(o));const a=o.length;for(;this.symbolLayers.length<o.length;)this.symbolLayers.push(null);this.symbolLayers.length=o.length;const i=[];if(!c){const{make:t}=await import("./Graphics3DSymbolLayerFactory.js");c=t}for(let e=0;e<a;e++){const s=o.at(e);if(!1===s.enabled)continue;p.renderPriority=1-(1+e)/a,p.renderPriorityStep=1/a,p.ignoreDrivers=s.ignoreDrivers;const n=c(this.symbol,s,this._context,p),l=r(t,()=>{this.symbolLayers[e]=null,n.destroy()});l&&i.push(l),this.symbolLayers[e]=n}if(await e(this.symbolLayers,async(t,e)=>{if(null!=t)try{await t.load(),this._extentPadding+=Math.max(this._extentPadding,t.extentPadding)}catch{this.symbolLayers[e]=null}}),i.forEach(t=>t.remove()),s(t),this.symbolLayers.length&&!this.symbolLayers.some(t=>!!t))throw new Error}getSymbolLayerSize(t){const e=this.symbolLayers[t];return null!=e?e.getCachedSize():null}get extentPadding(){return this._extentPadding}get symbologySnappingSupported(){return this.symbolLayers.some(t=>t?.queryForSnapping)}get needsUpdateFocus(){return this.symbolLayers.some(t=>!0===t?.needsUpdateFocus)}createGraphics3DGraphic(t,e){const{graphic:r}=t,s=this.symbolLayers.map(e=>e?.createGraphics3DGraphic(t)??null);return new a(r,e||this,s)}get complexity(){const t=new y;return this.symbolLayers.forEach(e=>o(e?.complexity,t)),t}globalPropertyChanged(t,e){const r=this.symbolLayers.length;for(let s=0;s<r;s++){const r=this.symbolLayers[s],o=t=>{const e=t.layers[s];return e instanceof i?e:null};if(null!=r&&!r.globalPropertyChanged(t,e,o))return!1}return!0}applyRendererDiff(t,e){return 1!==this.loadStatus?0:this.symbolLayers.reduce((r,s)=>0!==r&&null!=s?Math.min(r,s.applyRendererDiff(t,e)):r,2)}prepareSymbolPatch(t){if(2===this.loadStatus)return;if("partial"!==t.diff.type)return;const e=t.diff.diff;if(!e.symbolLayers||"partial"!==e.symbolLayers.type)return;const r=e.symbolLayers.diff;this.symbolLayers.forEach((e,s)=>{if(null==e)return;const o=r[s];if(o){const r={diff:o,graphics3DGraphicPatches:[],symbolLayerStatePatches:[]};e.prepareSymbolLayerPatch(r),t.symbolStatePatches.push(...r.symbolLayerStatePatches),r.graphics3DGraphicPatches.length&&t.graphics3DGraphicPatches.push((t,e)=>{const o=t.layers[s];null!=o&&r.graphics3DGraphicPatches.forEach(t=>t(o,e))})}})}updateGeometry(t){return this._updateGeometryOrTransform(t,(e,r)=>!!e.updateGeometry&&e.updateGeometry(t.graphic,r))}updateTransform(t,e,r,s){return this._updateGeometryOrTransform(t,(t,o)=>!!t.updateTransform&&t.updateTransform(o,e,r,s))}_updateGeometryOrTransform(t,e){for(let r=0;r<this.symbolLayers.length;r++){const s=this.symbolLayers[r];if(null==s)continue;const o=t.layers[r];if(!o||!e(s,o))return!1}return!0}onRemoveGraphic(t){for(let e=0;e<this.symbolLayers.length;e++){const r=this.symbolLayers[e];if(null==r)continue;const s=t.layers[e];null!=s&&r.onRemoveGraphic(s)}}getFastUpdateStatus(){let t=!1,e=!1;for(const r of this.symbolLayers)if(null!=r){if(0===r.loadStatus)return 3;r.isFastUpdatesEnabled()?e=!0:t=!0}return e?t?2:1:t?0:4}async queryForSnapping(e,r,o,a){const i=this.symbolLayers.filter(t).filter(t=>null!=t.queryForSnapping).map(t=>t.queryForSnapping(e,r,o,a)),n=await Promise.all(i);return s(a),n.flat()}destroy(){if(!this.destroyed){super.destroy();for(const t of this.symbolLayers)null!=t&&t.destroy();this.symbolLayers.length=0,this._destroyed=!0}}get destroyed(){return this._destroyed}get usedMemory(){return h(this)}}let c=null;const p=new n;export{m as Graphics3DSymbol};
