import type WebDocument2D from "./WebDocument2D.js";
import type Collection from "./core/Collection.js";
import type Version from "./core/Version.js";
import type UtilityNetwork from "./networks/UtilityNetwork.js";
import type GeotriggersInfo from "./webdoc/GeotriggersInfo.js";
import type IPSInfo from "./webdoc/IPSInfo.js";
import type { WebDocument2DProperties } from "./WebDocument2D.js";
import type { GeotriggersInfoProperties } from "./webdoc/GeotriggersInfo.js";
import type { IPSInfoProperties } from "./webdoc/IPSInfo.js";
import type { UtilityNetworkProperties } from "./networks/UtilityNetwork.js";
import type { ReadonlyArrayOrCollection } from "./core/Collection.js";

export interface WebMapProperties extends WebDocument2DProperties, Partial<Pick<WebMap, "presentation">> {
  /**
   * Information relating to a list of Geotriggers.
   *
   * @since 4.24
   */
  geotriggersInfo?: GeotriggersInfoProperties | null;
  /**
   * Contains indoor positioning system information for the map.
   *
   * @since 4.31
   */
  ipsInfo?: IPSInfoProperties | null;
  /** The utilityNetworks object contains a collection of [UtilityNetworks](https://developers.arcgis.com/javascript/latest/references/core/networks/UtilityNetwork/) saved on the web map. */
  utilityNetworks?: ReadonlyArrayOrCollection<UtilityNetworkProperties> | null;
}

/**
 * Loads a [WebMap](https://doc.arcgis.com/en/arcgis-online/create-maps/make-your-first-map.htm)
 * from [ArcGIS Online](https://www.arcgis.com/home/) or
 * [ArcGIS Enterprise portal](https://doc.esri.com/en/arcgis-enterprise/latest/plan/what-is-portal-for-arcgis-.html)
 * into a [MapView](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/). It defines the content, style, and bookmarks of your webmap, and it can be shared
 * across multiple ArcGIS web and desktop applications. The webmap is saved as a JSON document that can be consumed by the
 * ArcGIS Maps SDK for JavaScript via the WebMap class to easily create compelling 2D applications. The JSON document is written
 * according to the [webmap specification](https://developers.arcgis.com/web-map-specification/). Although you can easily create your own webmaps,
 * there are many sample [webmaps in ArcGIS Online](https://webmaps.maps.arcgis.com/home/group.html?id=bf19f0a0871649c49f6743dbe8138ecb)
 * that you can use to get started with the API. You may modify or add new content to these webmaps.
 *
 * To load a WebMap from ArcGIS Online into a MapView, you must reference the ID of the webmap in the
 * [portalItem](https://developers.arcgis.com/javascript/latest/references/core/WebMap/#portalItem) property of this class.
 *
 * ```js
 * const webmap = new WebMap({
 *   portalItem: { // autocasts as new PortalItem()
 *     id: "e691172598f04ea8881cd2a4adaa45ba"
 *   }
 * });
 * ```
 *
 * To load a Webmap from an on-premise portal, set the portal
 * url in [esriConfig.portalUrl](https://developers.arcgis.com/javascript/latest/references/core/config/#Config-portalUrl).
 *
 * ```js
 * esriConfig.portalUrl = "https://myHostName.esri.com/arcgis";
 *
 * const webmap = new WebMap({
 *   portalItem: { // autocasts as new PortalItem()
 *     id: "f701172599f04ea8781de2a4adzz46ab"
 *   }
 * });
 * ```
 *
 * Then you must reference the WebMap instance in the `map` property of the view.
 *
 * ```js
 * const view = new MapView({
 *   map: webmap,  // The WebMap instance created above
 *   container: "viewDiv"
 * });
 * ```
 *
 * > [!WARNING]
 * >
 * > **Known Limitations**
 * >
 * > [WCSLayers](https://developers.arcgis.com/javascript/latest/references/core/layers/WCSLayer/) are currently not supported. [WFSLayers](https://developers.arcgis.com/javascript/latest/references/core/layers/WFSLayer/) must be from a WFS 2.0.0 service and have GeoJSON output format enabled.
 * > In instances when the webmap contains layer types that are not yet supported in the API, layers will be created as an [UnsupportedLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/UnsupportedLayer/).
 * > This layer type is used specifically in these instances where the layer may exist in a given WebMap (e.g. WFS layer from WFS 1.0.0), but may not be currently supported in the version of the
 * > API accessing it.
 * > An [UnknownLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/UnknownLayer/) will be used if future versions of the WebMap contains a new type of layer. The API version may not recognize this layer type, therefore
 * > it would come across as an [UnknownLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/UnknownLayer/).
 * >
 * > Embedded Routes
 * >    * Prior to the ArcGIS Online 8.1 release (March 2020) when copying a route layer
 * > from an item to be stored inside a WebMap it would be stored as an embedded feature
 * > collection, and inadvertently not attributed as a route. When these webmaps are loaded
 * > by the JS API, the routes will be represented by a [GroupLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/GroupLayer/)
 * > rather than a [RouteLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/RouteLayer/). This does not affect copied route
 * > layer items after the ArcGIS Online 8.1 release or routes stored as portal items.
 * > Copying route layer items to be stored as part of the webmap is not a common scenario.
 * >
 * > Accessing geometries from popup features
 * >    * Beginning with version 4.17, webmaps no longer return geometries in its popup's features.
 * > If a popup does not have a referenced Arcade expression that works with geometry, it is now
 * > required to set either the webmap layer's [FeatureLayer.outFields](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#outFields)
 * > or its PopupTemplate [PopupTemplate.outFields](https://developers.arcgis.com/javascript/latest/references/core/PopupTemplate/#outFields).
 *
 * @since 4.0
 * @see [Sample - Load a basic WebMap](https://developers.arcgis.com/javascript/latest/sample-code/webmap-basic/)
 * @see [Sample - Load a basic WebMap and swap with another on the same View](https://developers.arcgis.com/javascript/latest/sample-code/webmap-swap/)
 * @see [UnknownLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/UnknownLayer/)
 * @see [UnsupportedLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/UnsupportedLayer/)
 */
export default class WebMap extends WebDocument2D {
  /**
   * Creates a new instance of this class and initializes it with values from a JSON object
   * generated from an ArcGIS product. The object passed into the input `json`
   * parameter often comes from a response to a query operation in the REST API or a
   * [toJSON()](https://doc.esri.com/en/arcgis-pro/latest/tool-reference/conversion/features-to-json.html?tabs=dialog)
   * method from another ArcGIS product. If the [WebMap](https://developers.arcgis.com/javascript/latest/references/core/WebMap/) is used outside of a view, you must call [load()](https://developers.arcgis.com/javascript/latest/references/core/WebMap/#load)
   * explicitly to interact with its resources. See the [Using fromJSON()](https://developers.arcgis.com/javascript/latest/using-fromjson)
   * topic in the Guide for details and examples of when and how to use this function.
   *
   * @param json - A JSON representation of the instance in the ArcGIS format. See
   *                      the [web map specification](https://developers.arcgis.com/web-map-specification/)
   *                      for more detailed information on serializing web map to JSON.
   * @returns Returns a new instance of this class.
   * @since 4.12
   * @example
   * // Retrieve a WebMap JSON by url and deserialize it into a WebMap API instance
   * const [esriRequest, WebMap] = await $arcgis.import(["@arcgis/core/request.js", "@arcgis/core/WebMap.js"]);
   * esriRequest("https://domain/url/to/webmap.json").then(function(json) {
   *   const webmap = WebMap.fromJSON(json);
   * });
   */
  static fromJSON(json: any): WebMap;
  /**
   * @example
   * // Typical usage
   * const map = new WebMap({
   *   portalItem: {
   *     id: "e691172598f04ea8881cd2a4adaa45ba"
   *   }
   * });
   * @example
   * // Typical usage
   * const map = new Map({
   *   basemap: "topo-vector"
   * });
   */
  constructor(properties?: WebMapProperties);
  /**
   * Information relating to a list of Geotriggers.
   *
   * @since 4.24
   */
  get geotriggersInfo(): GeotriggersInfo | null | undefined;
  set geotriggersInfo(value: GeotriggersInfoProperties | null | undefined);
  /**
   * Contains indoor positioning system information for the map.
   *
   * @since 4.31
   */
  get ipsInfo(): IPSInfo | null | undefined;
  set ipsInfo(value: IPSInfoProperties | null | undefined);
  /** Provides multiple slides. Each slide has a different "title", "extent", "basemap", "layers" etc. */
  accessor presentation: any;
  /**
   * The version of the source document from which the WebMap was read.
   * The WebMap must be version 2.x to load into an app.
   *
   * @since 4.1
   */
  readonly sourceVersion?: Version | null;
  /** The utilityNetworks object contains a collection of [UtilityNetworks](https://developers.arcgis.com/javascript/latest/references/core/networks/UtilityNetwork/) saved on the web map. */
  get utilityNetworks(): Collection<UtilityNetwork> | null | undefined;
  set utilityNetworks(value: ReadonlyArrayOrCollection<UtilityNetworkProperties> | null | undefined);
}