/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.25/esri/copyright.txt for details. */ import"../../geometry.js";import e from"../../request.js";import t from"../../core/Error.js";import n from"../../core/Logger.js";import{isNone as i,unwrapOr as r,isSome as a}from"../../core/maybe.js";import{WGS84 as o}from"../../geometry/support/spatialReferenceUtils.js";import{project as s}from"../../geometry/support/webMercatorUtils.js";import{convertToFeatureSet as l,convertToGeometry as c,convertFromGeometry as d}from"../graphics/featureConversionUtils.js";import u from"../graphics/OptimizedFeatureSet.js";import{validateGeoJSON as m,inferLayerProperties as p,createOptimizedFeatures as f}from"../graphics/sources/geojson/geojson.js";import{createDrawingInfo as g}from"../graphics/sources/support/clientSideDefaults.js";import y from"../support/FieldsIndex.js";import{kebabDict as w}from"../support/fieldType.js";import b from"../../geometry/SpatialReference.js";const h=n.getLogger("esri.layers.graphics.sources.ogcfeature"),j="http://www.opengis.net/def/crs/",F=`${j}OGC/1.3/CRS84`;async function I(n,r,a={},o=5){const{links:s}=n,l=D(s,"items","application/geo+json")||D(s,"http://www.opengis.net/def/rel/ogc/1.0/items","application/geo+json");if(i(l))throw new t("ogc-feature-layer:missing-items-page","Missing items url");const{data:c}=await e(l.href,{signal:a.signal,query:{limit:o,...a.customParameters,token:a.apiKey},headers:{accept:"application/geo+json"}});await m(c);const d=p(c,{geometryType:r.geometryType}),u=r.fields||d.fields||[],f=null!=r.hasZ?r.hasZ:d.hasZ,b=d.geometryType,j=r.objectIdField||d.objectIdFieldName||"OBJECTID";let F=r.timeInfo;const I=u.find((({name:e})=>e===j));if(I)I.editable=!1,I.nullable=!1;else{if(!d.objectIdFieldType)throw new t("ogc-feature-layer:missing-feature-id","Collection geojson require a feature id as a unique identifier");u.unshift({name:j,alias:j,type:"number"===d.objectIdFieldType?"esriFieldTypeOID":"esriFieldTypeString",editable:!1,nullable:!1})}if(j!==d.objectIdFieldName){const e=u.find((({name:e})=>e===d.objectIdFieldName));e&&(e.type="esriFieldTypeInteger")}u===d.fields&&d.unknownFields.length>0&&h.warn({name:"ogc-feature-layer:unknown-field-types",message:"Some fields types couldn't be inferred from the features and were dropped",details:{unknownFields:d.unknownFields}});for(const e of u){if(null==e.name&&(e.name=e.alias),null==e.alias&&(e.alias=e.name),"esriFieldTypeOID"!==e.type&&"esriFieldTypeGlobalID"!==e.type&&(e.editable=null==e.editable||!!e.editable,e.nullable=null==e.nullable||!!e.nullable),!e.name)throw new t("ogc-feature-layer:invalid-field-name","field name is missing",{field:e});if(!w.jsonValues.includes(e.type))throw new t("ogc-feature-layer:invalid-field-type",`invalid type for field "${e.name}"`,{field:e})}if(F){const e=new y(u);if(F.startTimeField){const t=e.get(F.startTimeField);t?(F.startTimeField=t.name,t.type="esriFieldTypeDate"):F.startTimeField=null}if(F.endTimeField){const t=e.get(F.endTimeField);t?(F.endTimeField=t.name,t.type="esriFieldTypeDate"):F.endTimeField=null}if(F.trackIdField){const t=e.get(F.trackIdField);t?F.trackIdField=t.name:(F.trackIdField=null,h.warn({name:"ogc-feature-layer:invalid-timeInfo-trackIdField",message:"trackIdField is missing",details:{timeInfo:F}}))}F.startTimeField||F.endTimeField||(h.warn({name:"ogc-feature-layer:invalid-timeInfo",message:"startTimeField and endTimeField are missing",details:{timeInfo:F}}),F=null)}return{drawingInfo:b?g(b):null,extent:W(n),geometryType:b,fields:u,hasZ:!!f,objectIdField:j,timeInfo:F}}async function T(n,r={}){const{links:a}=n,o=D(a,"data","application/json")||D(a,"http://www.opengis.net/def/rel/ogc/1.0/data","application/json");if(i(o))throw new t("ogc-feature-layer:missing-collections-page","Missing collections url");const{apiKey:s,customParameters:l,signal:c}=r,{data:d}=await e(o.href,{signal:c,headers:{accept:"application/json"},query:{...l,token:s}});return d}async function k(n,r={}){const{links:a}=n,o=D(a,"conformance","application/json")||D(a,"http://www.opengis.net/def/rel/ogc/1.0/conformance","application/json");if(i(o))throw new t("ogc-feature-layer:missing-conformance-page","Missing conformance url");const{apiKey:s,customParameters:l,signal:c}=r,{data:d}=await e(o.href,{signal:c,headers:{accept:"application/json"},query:{...l,token:s}});return d}async function x(t,n={}){const{apiKey:i,customParameters:r,signal:a}=n,{data:o}=await e(t,{signal:a,headers:{accept:"application/json"},query:{...r,token:i}});return o}async function S(t,n={}){const r="application/vnd.oai.openapi+json;version=3.0",a=D(t.links,"service-desc",r);if(i(a))return h.warn("ogc-feature-layer:missing-openapi-page","The OGC API-Features server does not have an OpenAPI page."),null;const{apiKey:o,customParameters:s,signal:l}=n,{data:c}=await e(a.href,{signal:l,headers:{accept:r},query:{...s,token:o}});return c}function v(e){const t=/^http:\/\/www\.opengis.net\/def\/crs\/(?.*)\/(?.*)\/(?.*)$/i.exec(e)?.groups;if(!t)return null;const{authority:n,code:i}=t;switch(n.toLowerCase()){case"ogc":switch(i.toLowerCase()){case"crs27":return b.GCS_NAD_1927.wkid;case"crs83":return 4269;case"crs84":case"crs84h":return b.WGS84.wkid;default:return null}case"esri":case"epsg":{const e=Number.parseInt(i,10);return Number.isNaN(e)?null:e}default:return null}}async function N(e,t,n){const i=await q(e,t,n);return l(i)}async function q(n,l,m){const{collection:p,layerDefinition:g,maxRecordCount:y,queryParameters:{apiKey:w,customParameters:h},spatialReference:j,supportedCrs:F}=n,{links:I}=p,T=D(I,"items","application/geo+json")||D(I,"http://www.opengis.net/def/rel/ogc/1.0/items","application/geo+json");if(i(T))throw new t("ogc-feature-layer:missing-items-page","Missing items url");const{geometry:k,num:x,start:S,timeExtent:v,where:N}=l;if(l.objectIds)throw new t("ogc-feature-layer:query-by-objectids-not-supported","Queries with objectids are not supported");const q=b.fromJSON(j),O=r(l.outSpatialReference,q),C=O.isWGS84?null:R(O,F),W=G(k,F),P=M(v),Z=$(N),K=x??(null!=S&&void 0!==S?10:y),{data:L}=await e(T.href,{...m,query:{...h,...W,crs:C,datetime:P,query:Z,limit:K,startindex:S,token:w},headers:{accept:"application/geo+json"}});let J=!1;if(L.links){const e=L.links.find((e=>"next"===e.rel));J=!!e}!J&&Number.isInteger(L.numberMatched)&&Number.isInteger(L.numberReturned)&&(J=L.numberReturnede.rel===t&&e.type===n))||e.find((e=>e.rel===t&&!e.type))}export{F as crsDefault,j as crsPrefix,I as getCollectionDefinition,T as getServerCollections,k as getServerConformance,x as getServerLandingPage,S as getServerOpenApi,v as getSpatialReferenceWkid,N as queryFeatureSetJSON,q as queryOptimizedFeatureSet};