import type Collection from "../core/Collection.js";
import type Extent from "../geometry/Extent.js";
import type Layer from "./Layer.js";
import type Sublayer from "./support/Sublayer.js";
import type PortalItem from "../portal/PortalItem.js";
import type { MultiOriginJSONSupportMixin } from "../core/MultiOriginJSONSupport.js";
import type { LayerEvents, LayerProperties } from "./Layer.js";
import type { FetchImageOptions, LayerSaveOptions, LayerSaveAsOptions } from "./types.js";
import type { APIKeyMixin, APIKeyMixinProperties } from "./mixins/APIKeyMixin.js";
import type { ArcGISMapService, ArcGISMapServiceProperties } from "./mixins/ArcGISMapService.js";
import type { BlendLayer, BlendLayerProperties } from "./mixins/BlendLayer.js";
import type { CustomParametersMixin, CustomParametersMixinProperties } from "./mixins/CustomParametersMixin.js";
import type { OperationalLayer, OperationalLayerProperties } from "./mixins/OperationalLayer.js";
import type { PortalLayer, PortalLayerProperties } from "./mixins/PortalLayer.js";
import type { RefreshableLayerEvents, RefreshableLayer, RefreshableLayerProperties } from "./mixins/RefreshableLayer.js";
import type { ScaleRangeLayer, ScaleRangeLayerProperties } from "./mixins/ScaleRangeLayer.js";
import type { SublayersOwner, SublayersOwnerProperties } from "./mixins/SublayersOwner.js";
import type { TemporalLayer, TemporalLayerProperties } from "./mixins/TemporalLayer.js";
import type { PortalItemProperties } from "../portal/PortalItem.js";
import type { TimeZone } from "../time/types.js";
import type { SublayerProperties } from "./support/Sublayer.js";
import type { ReadonlyArrayOrCollection } from "../core/Collection.js";

export interface MapImageLayerProperties extends LayerProperties, CustomParametersMixinProperties, APIKeyMixinProperties, RefreshableLayerProperties, PortalLayerProperties, OperationalLayerProperties, ArcGISMapServiceProperties, SublayersOwnerProperties, ScaleRangeLayerProperties, TemporalLayerProperties, BlendLayerProperties, Partial<Pick<MapImageLayer, "dpi" | "gdbVersion" | "imageFormat" | "imageMaxHeight" | "imageMaxWidth" | "imageTransparency" | "sourceJSON" | "url">> {
  /**
   * The portal item from which the layer is loaded. This will load the layer
   * along with any overridden properties (e.g. renderers, definition expressions, etc.) saved
   * to the portal item, not the map service.
   *
   * @example
   * let layer = new MapImageLayer({
   *   portalItem: {  // autocasts as new PortalItem()
   *     id: "caa9bd9da1f4487cb4989824053bb847"
   *   }
   * });
   * @example
   * // While this example uses FeatureLayer, this same pattern can be
   * // used for other layers that may be loaded from portalItem ids.
   * const layer = new FeatureLayer({
   *   portalItem: {  // autocasts as new PortalItem()
   *     id: "caa9bd9da1f4487cb4989824053bb847"
   *   }  // the first layer in the service is returned
   * });
   * @example
   * // Set hostname when using an on-premise portal (default is ArcGIS Online)
   * // esriConfig.portalUrl = "http://myHostName.esri.com/arcgis";
   *
   * // While this example uses FeatureLayer, this same pattern can be
   * // used for SceneLayers.
   * const layer = new FeatureLayer({
   *   portalItem: {  // autocasts as new PortalItem()
   *     id: "8d26f04f31f642b6828b7023b84c2188"
   *   },
   *   // loads the third item in the given feature service
   *   layerId: 2
   * });
   * @example
   * // Initialize GeoJSONLayer by referencing a portalItem id pointing to geojson file.
   * const layer = new GeoJSONLayer({
   *   portalItem: new PortalItem({
   *     id: "81e769cd7031482797e1b0768f23c7e1",
   *     // optionally define the portal, of the item.
   *     // if not specified, the default portal defined is used.
   *     // see https://developers.arcgis.com/javascript/latest/references/core/config/#portalUrl
   *     portal: new Portal({
   *       url: "https://jsapi.maps.arcgis.com/"
   *     })
   *   }
   * });
   * @example
   * // This snippet loads a table hosted in ArcGIS Online.
   * const table = new FeatureLayer({
   *   portalItem: { // autocasts as esri/portal/PortalItem
   *     id: "123f4410054b43d7a0bacc1533ceb8dc"
   *   }
   * });
   *
   * // Before adding the table to the map, it must first be loaded and confirm it is the right type.
   * table.load().then(() => {
   *   if (table.isTable) {
   *     map.tables.add(table);
   *   }
   * });
   * @example
   * // While this example uses FeatureLayer, this same pattern can be
   * // used for other layers that may be loaded from portalItem ids.
   * const layer = new FeatureLayer({
   *   portalItem: { // autocasts as esri/portal/PortalItem
   *     id: "caa9bd9da1f4487cb4989824053bb847",
   *     // Set an API key to access a secure portal item configured with API key authentication.
   *     apiKey: "APIKEY"
   *   }
   * });
   */
  portalItem?: PortalItemProperties | null;
  /**
   * A [Collection](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/) of [Sublayer](https://developers.arcgis.com/javascript/latest/references/core/layers/support/Sublayer/) objects
   * that allow you to alter
   * the properties of one or more sublayers of the MapImageLayer. If this property
   * is not specified, all the sublayers from the service are displayed as defined in the
   * service. If an empty array is passed to this property then none of the sublayers
   * from the service are displayed in the layer.
   *
   * All sublayers are referenced in the order in which they are drawn in the view (bottom to top).
   * They may be [added](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#add),
   * [removed](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#remove), or
   * [reordered](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#reorder) using the
   * [Collection](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/) methods. Because [Sublayer](https://developers.arcgis.com/javascript/latest/references/core/layers/support/Sublayer/) extends
   * [Accessor](https://developers.arcgis.com/javascript/latest/references/core/core/Accessor/), its properties may be
   * [watched](https://developers.arcgis.com/javascript/latest/watch-for-changes/#watch-for-changes-in-the-api).
   *
   * @example
   * // Only includes the first sublayer from the map service
   * let layer = new MapImageLayer({
   *   url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer",
   *   sublayers: [{
   *     id: 0
   *   }]
   * });
   * @example
   * // toggles the visibility of the first sublayer to false
   * layer.findSublayerById(0).visible = false;
   * @example
   * // sublayers from the service are excluded from the layer
   * layer = new MapImageLayer({
   *   url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer",
   *   sublayers: []
   * });
   * @example
   * // Moves the cities sublayer from index 3 to index 0.
   * let citiesLayer = layer.sublayers.at(3);
   * layer.sublayers.reorder(citiesLayer, 0);
   * @example
   * // Overrides the drawing info on the layer with a custom renderer
   * let citiesLayer = layer.sublayers.at(3);
   * citiesLayer.renderer = {
   *   type: "simple",  // autocasts as new SimpleRenderer()
   *   symbol: {
   *     type: "simple-marker",  // autocasts as new SimpleMarkerSymbol()
   *     color: "blue",
   *     size: 3
   *   }
   * };
   */
  sublayers?: ReadonlyArrayOrCollection<SublayerProperties> | null;
  /**
   * The title of the layer used to identify it in places such as the [Legend](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-legend/)
   * and [LayerList](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/).
   *
   * When loading a layer by service url, the title is derived from the service name.
   * The titles for the sublayers will be the same as the names of the sublayers in the service.
   * When the layer is loaded from a portal item, the title of the portal item will be used instead.
   * Finally, if a layer is loaded as part of a webmap or a webscene, then the title of the layer as stored in the webmap/webscene will be used.
   */
  title?: string | null;
}

export interface MapImageLayerEvents extends RefreshableLayerEvents, LayerEvents {}

/**
 * ## Overview
 *
 * MapImageLayer allows you to display and analyze data from
 * [sublayers](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/#sublayers) defined in a
 * [map service](https://enterprise.arcgis.com/en/server/latest/publish-services/windows/what-is-a-map-service.htm), exporting images
 * instead of features. Map service images are
 * dynamically generated on the server based on a request, which includes an
 * LOD (level of detail), a bounding box, dpi, spatial reference and other
 * options. In 2D, the exported image is of the entire map extent specified.
 * In 3D, two images are exported: an image with higher resolution for the area closer to the camera and
 * a lower resolution image for the area farther away from the camera.
 *
 * > [!WARNING]
 * >
 * > Unlike [FeatureLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/), MapImageLayer processing
 * > is handled by the server, not the client. Offloading the processing to the
 * > server allows MapImageLayer to render more features with a higher level
 * > of performance in some cases.
 *
 * MapImageLayer does not display tiled images. To display
 * tiled map service layers, see [TileLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/TileLayer/).
 *
 * ## Creating a MapImageLayer
 *
 * MapImageLayer may be created in one of two ways: from a [service URL](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/#url) or from an ArcGIS
 * Portal [item ID](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/#portalItem).
 *
 * ### Reference a service URL
 *
 * To create a MapImageLayer instance from a service, you must set the [url](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/#url) property
 * to the REST endpoint of a layer in a Map Service. The URL will typically look
 * like the following.
 *
 * ```js
 * https://<hostname>/arcgis/rest/services/<service-name>/MapServer
 * ```
 *
 * For a layer to be visible in a view, it must be added to the [Map](https://developers.arcgis.com/javascript/latest/references/core/Map/)
 * referenced by the view. See [Map.add()](https://developers.arcgis.com/javascript/latest/references/core/Map/#add) for information about adding layers to a map.
 *
 * ```js
 * const MapImageLayer = await $arcgis.import("@arcgis/core/layers/MapImageLayer.js");
 * // points to the states layer in a service storing U.S. census data
 * let layer = new MapImageLayer({
 *   url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer"
 * });
 * map.add(layer);  // adds the layer to the map
 * ```
 *
 * If the map service is requested from a different domain, a [CORS enabled server](https://developers.arcgis.com/javascript/latest/cors/) or a [proxy](https://developers.arcgis.com/javascript/latest/proxies/) is
 * required.
 *
 * ### Reference an ArcGIS portal Item ID
 *
 * You can also create a MapImageLayer from its ID if it exists as an item in ArcGIS Online or ArcGIS Enterprise.
 * For example, the following snippet shows how to add a new MapImageLayer instance to a map using the
 * [portalItem](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/#portalItem) property.
 *
 * ```js
 * // references an ArcGIS Online item pointing to a Map Service Layer
 * let layer = new MapImageLayer({
 *   portalItem: {  // autocasts as esri/portal/PortalItem
 *     id: "8444e275037549c1acab02d2626daaee"
 *   }
 * });
 * map.add(layer);  // adds the layer to the map
 * ```
 *
 * ## Sublayers
 *
 * Map services contain one or more sublayers. Sublayers may even contain nested sublayers.
 * When the [sublayers](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/#sublayers) property of the MapImageLayer is not specified, then an image of all sublayers
 * in the service is exported to the client. If a subset of sublayers from the service are
 * specified, then only the subset of sublayers are rendered on the client.
 * Sublayers have default rendering, scale visibility, labels, and other properties saved to the server. However, these properties may be dynamically
 * changed so a new map image is exported to the view. Sublayers of a MapImageLayer can only be styled with 2D symbology even if they are rendered in
 * a [WebScene](https://developers.arcgis.com/javascript/latest/references/core/WebScene/).
 * To learn more about working with sublayers, see the [Sublayer](https://developers.arcgis.com/javascript/latest/references/core/layers/support/Sublayer/) API
 * documentation.
 *
 * [![mapimagelayer-renderer](https://developers.arcgis.com/javascript/latest/assets/references/core/layers/mapimagelayer-renderer.png)](https://developers.arcgis.com/javascript/latest/sample-code/layers-mapimagelayer-renderers/)
 *
 * <span id="dynamic-layers"></span>
 * ## Dynamic layers
 *
 * Sublayers may be rendered on the fly as dynamic layers. There are two types of dynamic layers:
 * [DynamicMapLayer](https://developers.arcgis.com/javascript/latest/references/core/rest/layerSources/DynamicMapLayer/) and
 * [DynamicDataLayer](https://developers.arcgis.com/javascript/latest/references/core/rest/layerSources/DynamicDataLayer/).
 *
 * [Dynamic map layers](https://developers.arcgis.com/javascript/latest/references/core/rest/layerSources/DynamicMapLayer/) allow you
 * to override sublayers in the map service with new renderers,
 * definition expressions, opacity, scale visibility, etc. Multiple dynamic map layers may exist
 * for a single map service layer.
 *
 * [Dynamic data layers](https://developers.arcgis.com/javascript/latest/references/core/rest/layerSources/DynamicDataLayer/) provide
 * the ability to create layers on the fly from data referenced in
 * registered workspaces.
 * The data may be tables with or without geometries, feature classes, and
 * rasters. These data sources are not directly visible to the services directory, but may be
 * published and configured with the ArcGIS Server Manager.
 * Data from tables may be joined to other tables or dynamic map layers.
 *
 * > [!WARNING]
 * >
 * > Esri requires that when you use an ArcGIS Online basemap in your app, the map must include Esri attribution and you must be licensed to use the content.
 * > For detailed guidelines on working with attribution, please visit the official [attribution in your app](https://developers.arcgis.com/terms/attribution/) documentation.
 * > For information, see the [Terms of Use documentation](https://developers.arcgis.com/documentation/terms-of-use/).
 *
 * @since 4.0
 * @see [Sublayer](https://developers.arcgis.com/javascript/latest/references/core/layers/support/Sublayer/)
 * @see [TileLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/TileLayer/)
 * @see [Sample - MapImageLayer](https://developers.arcgis.com/javascript/latest/sample-code/layers-mapimagelayer/)
 * @see [Sample - MapImageLayer: toggle sublayer visibility](https://developers.arcgis.com/javascript/latest/sample-code/layers-mapimagelayer-sublayers/)
 * @see [Sample - MapImageLayer: set definition expression](https://developers.arcgis.com/javascript/latest/sample-code/layers-mapimagelayer-definitionexpression/)
 * @see [Sample - MapImageLayer: set renderers on sublayers](https://developers.arcgis.com/javascript/latest/sample-code/layers-mapimagelayer-renderers/)
 * @see [Sample - MapImageLayer: label sublayer features](https://developers.arcgis.com/javascript/latest/sample-code/layers-mapimagelayer-dynamic-labels/)
 * @see [Sample - MapImageLayer: create dynamic map layers](https://developers.arcgis.com/javascript/latest/sample-code/layers-dynamicmaplayer/)
 * @see [Sample - MapImageLayer: dynamic data layer with table join](https://developers.arcgis.com/javascript/latest/sample-code/layers-dynamicdatalayer-table-join/)
 * @see [Sample - MapImageLayer: dynamic data layer with query table](https://developers.arcgis.com/javascript/latest/sample-code/layers-dynamicdatalayer-query-table/)
 * @see [Sample - MapImageLayer: dynamic data layer with raster](https://developers.arcgis.com/javascript/latest/sample-code/layers-dynamicdatalayer-raster/)
 * @example
 * let layer = new MapImageLayer({
 * url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer",
 *   sublayers: [
 *    {
 *      id: 3,
 *      visible: false
 *    }, {
 *      id: 2,
 *      visible: true
 *    }, {
 *      id: 1,
 *      visible: true
 *    }, {
 *      id: 0,
 *      visible: true,
 *      definitionExpression: "pop2000 > 100000"
 *    }
 *  ]
 * });
 */
export default class MapImageLayer extends MapImageLayerSuperclass {
  /**
   * @deprecated
   * Do not directly reference this property.
   * Use EventNames and EventTypes helpers from \@arcgis/core/Evented
   */
  "@eventTypes": MapImageLayerEvents;
  /**
   * @example
   * // Typical usage
   * let layer = new MapImageLayer({
   *   // URL to the map service
   *   url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer",
   *   // dynamic sublayers. See sublayers documentation for more info
   *   sublayers: [ {}, {}, {} ]
   * });
   */
  constructor(properties?: MapImageLayerProperties);
  /**
   * A flat [Collection](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/) of all the [sublayers](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/#sublayers)
   * in the MapImageLayer including the sublayers of its sublayers.
   * All sublayers are referenced in the order in which they are drawn in the view (bottom to top).
   *
   * @example
   * // finds the census tracts sublayer from a parent sublayer of the
   * // MapImageLayer containing various census sublayers
   * let tractsId = 5;
   * let tracksSublayer = layer.allSublayers.find(function(sublayer){
   *   return sublayer.id === tracksId;
   * });
   */
  readonly allSublayers: Collection<Sublayer>;
  /**
   * The time zone that dates are stored in. This property does not apply to date fields referenced by
   * [timeInfo](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/#timeInfo).
   *
   * Even though dates are transmitted as UTC epoch values, this property may be useful when constructing date or time [where clauses for querying](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#date-query).
   * If constructing date or time where clauses, use [FieldsIndex.getTimeZone()](https://developers.arcgis.com/javascript/latest/references/core/layers/support/FieldsIndex/#getTimeZone) to get the
   * time zone for the given date field.
   *
   * @since 4.28
   * @see [Wikipedia - List of tz database time zones](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)
   * @see [Date-time queries | Time zone properties](https://developers.arcgis.com/rest/services-reference/enterprise/query-feature-service-layer/#time-zone-properties)
   */
  get dateFieldsTimeZone(): TimeZone | null | undefined;
  /**
   * This property is set by the service publisher and indicates that dates should be considered without the local timezone.
   * This applies to both requests and responses.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > This capability is only available with services published with ArcGIS Enterprise 10.9 or greater.
   * > When setting `timeExtent` in a [Query](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/), [FeatureLayerView.filter](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLayerView/#filter) or [layer](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/#timeExtent), dates must be defined
   * > in terms of UTC as illustrated in the code below.
   * > When using `layer.timeInfo.fullTimeExtent` in conjunction with [TimeSlider](https://developers.arcgis.com/javascript/latest/references/core/widgets/TimeSlider/), the local timezone offset must be removed. See the code snippet below.
   *
   * @default false
   * @since 4.21
   * @see [ArcGIS REST API - New in 10.9](https://developers.arcgis.com/rest/services-reference/enterprise/layer-table/#new-in-109)
   * @see [What's new in ArcGIS Server](https://enterprise.arcgis.com/en/server/latest/get-started/windows/what-s-new-in-arcgis-for-server.htm)
   * @see [Edit map service settings](https://enterprise.arcgis.com/en/server/latest/publish-services/windows/edit-map-service-settings.htm#LI_A5825E4A9A3A42E991C662CD7B76A860)
   * @example
   * // Only download data for the year 2020.
   * // if the layer supports unknown time zone then create
   * // the dates in UTC
   * if (layer.datesInUnknownTimezone) {
   *   layer.timeExtent = new TimeExtent({
   *     start: new Date(Date.UTC(2020, 0, 1)),
   *     end: new Date(Date.UTC(2021, 0, 1))
   *   });
   * }
   * else {
   *   layer.timeExtent = new TimeExtent({
   *     start: new Date(2020, 0, 1),
   *     end: new Date(2021, 0, 1)
   *   });
   * }
   * @example
   * // set up the timeslider for a service with an unknown timezone
   * if (layer.datesInUnknownTimezone) {
   *   const timeSlider = new TimeSlider({
   *     view: view,
   *     container: "timeSliderDiv",
   *     timeVisible: true,
   *   });
   *   view.ui.add(timeSlider, "bottom-left");
   *
   *   view.whenLayerView(layer).then((layerView) => {
   *    // get the layer's fullTimeExtent and remove the local
   *    // time zone offset
   *     const timExtent = new TimeExtent({
   *       start: removeLocalOffset(layer.timeInfo.fullTimeExtent.start),
   *       end: removeLocalOffset(layer.timeInfo.fullTimeExtent.end)
   *     });
   *
   *     timeSlider.fullTimeExtent = timExtent;
   *     timeSlider.stops = {
   *       interval: layer.timeInfo.interval;
   *     };
   *   });
   * }
   *
   * // Remove the local time zone offset from dates
   * function removeLocalOffset(localTime) {
   *   return new Date(
   *     localTime.getUTCFullYear(),
   *     localTime.getUTCMonth(),
   *     localTime.getUTCDate(),
   *     localTime.getUTCHours(),
   *     localTime.getUTCMinutes(),
   *     localTime.getUTCSeconds(),
   *     localTime.getUTCMilliseconds()
   *   );
   * }
   */
  get datesInUnknownTimezone(): boolean;
  /**
   * The output dots per inch (DPI) of the MapImageLayer.
   *
   * @default 96
   */
  accessor dpi: number;
  /**
   * The version of the geodatabase of the map service data. Read
   * the [Overview of versioning](https://pro.arcgis.com/en/pro-app/latest/help/data/geodatabases/overview/overview-of-versioning-in-arcgis-pro.htm) topic for more details
   * about this capability.
   */
  accessor gdbVersion: string | null | undefined;
  /**
   * The output image type.
   *
   * @default "png24"
   */
  accessor imageFormat: MapImageLayerImageFormat;
  /**
   * Indicates the maximum height of the image exported by the service.
   *
   * @default 2048
   * @since 4.3
   */
  accessor imageMaxHeight: number;
  /**
   * Indicates the maximum width of the image exported by the service.
   *
   * @default 2048
   * @since 4.3
   */
  accessor imageMaxWidth: number;
  /**
   * Indicates whether the background of the image exported by the service is transparent.
   *
   * @default true
   */
  accessor imageTransparency: boolean;
  /**
   * Indicates whether the layer's resources have loaded. When `true`,
   * all the properties of the object can be accessed.
   *
   * @default false
   */
  get loaded(): boolean;
  /**
   * The portal item from which the layer is loaded. This will load the layer
   * along with any overridden properties (e.g. renderers, definition expressions, etc.) saved
   * to the portal item, not the map service.
   *
   * @example
   * let layer = new MapImageLayer({
   *   portalItem: {  // autocasts as new PortalItem()
   *     id: "caa9bd9da1f4487cb4989824053bb847"
   *   }
   * });
   * @example
   * // While this example uses FeatureLayer, this same pattern can be
   * // used for other layers that may be loaded from portalItem ids.
   * const layer = new FeatureLayer({
   *   portalItem: {  // autocasts as new PortalItem()
   *     id: "caa9bd9da1f4487cb4989824053bb847"
   *   }  // the first layer in the service is returned
   * });
   * @example
   * // Set hostname when using an on-premise portal (default is ArcGIS Online)
   * // esriConfig.portalUrl = "http://myHostName.esri.com/arcgis";
   *
   * // While this example uses FeatureLayer, this same pattern can be
   * // used for SceneLayers.
   * const layer = new FeatureLayer({
   *   portalItem: {  // autocasts as new PortalItem()
   *     id: "8d26f04f31f642b6828b7023b84c2188"
   *   },
   *   // loads the third item in the given feature service
   *   layerId: 2
   * });
   * @example
   * // Initialize GeoJSONLayer by referencing a portalItem id pointing to geojson file.
   * const layer = new GeoJSONLayer({
   *   portalItem: new PortalItem({
   *     id: "81e769cd7031482797e1b0768f23c7e1",
   *     // optionally define the portal, of the item.
   *     // if not specified, the default portal defined is used.
   *     // see https://developers.arcgis.com/javascript/latest/references/core/config/#portalUrl
   *     portal: new Portal({
   *       url: "https://jsapi.maps.arcgis.com/"
   *     })
   *   }
   * });
   * @example
   * // This snippet loads a table hosted in ArcGIS Online.
   * const table = new FeatureLayer({
   *   portalItem: { // autocasts as esri/portal/PortalItem
   *     id: "123f4410054b43d7a0bacc1533ceb8dc"
   *   }
   * });
   *
   * // Before adding the table to the map, it must first be loaded and confirm it is the right type.
   * table.load().then(() => {
   *   if (table.isTable) {
   *     map.tables.add(table);
   *   }
   * });
   * @example
   * // While this example uses FeatureLayer, this same pattern can be
   * // used for other layers that may be loaded from portalItem ids.
   * const layer = new FeatureLayer({
   *   portalItem: { // autocasts as esri/portal/PortalItem
   *     id: "caa9bd9da1f4487cb4989824053bb847",
   *     // Set an API key to access a secure portal item configured with API key authentication.
   *     apiKey: "APIKEY"
   *   }
   * });
   */
  get portalItem(): PortalItem | null | undefined;
  set portalItem(value: PortalItemProperties | null | undefined);
  /**
   * The IANA time zone the author of the service intended data from date fields to be viewed in.
   *
   * @since 4.28
   * @see [Wikipedia - List of tz database time zones](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)
   */
  get preferredTimeZone(): TimeZone | null | undefined;
  /**
   * The [map service's metadata JSON](https://developers.arcgis.com/rest/services-reference/map-service.htm)
   * exposed by the ArcGIS REST API. While most commonly used properties
   * are exposed on the MapImageLayer class directly, this property gives access to all information returned
   * by the map service. This property is useful if working in an application built using an older version of the API
   * which requires access to map service properties from a more recent version.
   *
   * @since 4.13
   */
  accessor sourceJSON: any | null | undefined;
  /**
   * A [Collection](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/) of [Sublayer](https://developers.arcgis.com/javascript/latest/references/core/layers/support/Sublayer/) objects
   * that allow you to alter
   * the properties of one or more sublayers of the MapImageLayer. If this property
   * is not specified, all the sublayers from the service are displayed as defined in the
   * service. If an empty array is passed to this property then none of the sublayers
   * from the service are displayed in the layer.
   *
   * All sublayers are referenced in the order in which they are drawn in the view (bottom to top).
   * They may be [added](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#add),
   * [removed](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#remove), or
   * [reordered](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/#reorder) using the
   * [Collection](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/) methods. Because [Sublayer](https://developers.arcgis.com/javascript/latest/references/core/layers/support/Sublayer/) extends
   * [Accessor](https://developers.arcgis.com/javascript/latest/references/core/core/Accessor/), its properties may be
   * [watched](https://developers.arcgis.com/javascript/latest/watch-for-changes/#watch-for-changes-in-the-api).
   *
   * @example
   * // Only includes the first sublayer from the map service
   * let layer = new MapImageLayer({
   *   url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer",
   *   sublayers: [{
   *     id: 0
   *   }]
   * });
   * @example
   * // toggles the visibility of the first sublayer to false
   * layer.findSublayerById(0).visible = false;
   * @example
   * // sublayers from the service are excluded from the layer
   * layer = new MapImageLayer({
   *   url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer",
   *   sublayers: []
   * });
   * @example
   * // Moves the cities sublayer from index 3 to index 0.
   * let citiesLayer = layer.sublayers.at(3);
   * layer.sublayers.reorder(citiesLayer, 0);
   * @example
   * // Overrides the drawing info on the layer with a custom renderer
   * let citiesLayer = layer.sublayers.at(3);
   * citiesLayer.renderer = {
   *   type: "simple",  // autocasts as new SimpleRenderer()
   *   symbol: {
   *     type: "simple-marker",  // autocasts as new SimpleMarkerSymbol()
   *     color: "blue",
   *     size: 3
   *   }
   * };
   */
  get sublayers(): Collection<Sublayer> | null | undefined;
  set sublayers(value: ReadonlyArrayOrCollection<SublayerProperties> | null | undefined);
  /**
   * The title of the layer used to identify it in places such as the [Legend](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-legend/)
   * and [LayerList](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/).
   *
   * When loading a layer by service url, the title is derived from the service name.
   * The titles for the sublayers will be the same as the names of the sublayers in the service.
   * When the layer is loaded from a portal item, the title of the portal item will be used instead.
   * Finally, if a layer is loaded as part of a webmap or a webscene, then the title of the layer as stored in the webmap/webscene will be used.
   */
  accessor title: string | null | undefined;
  /** The layer type provides a convenient way to check the type of the layer without the need to import specific layer modules. */
  get type(): "map-image";
  /**
   * The URL to the REST endpoint of the map service.
   *
   * @example
   * // Layer from Map Service on ArcGIS Server
   * layer.url = "http://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer";
   */
  accessor url: string | null | undefined;
  /**
   * Gets the parameters of the exported image to use when calling the
   * [export REST operation](https://developers.arcgis.com/rest/services-reference/export-map.htm).
   *
   * @param extent - The extent of the exported image
   * @param width - The width of the exported image
   * @param height - The height of the exported image
   * @param options - The parameter options is an object with the following properties.
   * @returns The parameters of the exported image. Use this object to call the
   * [export REST operation](https://developers.arcgis.com/rest/services-reference/export-map.htm) against the map service.
   */
  createExportImageParameters(extent: Extent | null | undefined, width: number, height: number, options?: Omit<FetchImageOptions, "signal">): object;
  /**
   * This method fetches the image for the specified extent and size.
   *
   * @param extent - The extent of the view.
   * @param width - The width of the view in pixels.
   * @param height - The height of the view in pixels.
   * @param options - The parameter options is an object with the following properties.
   * @returns Returns a promise that resolves to an
   * [HTMLImageElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement).
   * @example
   * // Fetch an image for the layer from the server for a given extent, height, width.
   * layer.when(function(){
   *   layer.fetchImage(view.extent, view.width, view.height).then(function(result){
   *     imageDiv.appendChild(result);
   *   });
   * });
   */
  fetchImage(extent: Extent, width: number, height: number, options?: FetchImageOptions): Promise<HTMLImageElement>;
  /**
   * Loads all of the sublayers and subtables. See [loaded](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/#loaded) or [loadStatus](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/#loadStatus)
   * properties to check the status.
   *
   * @returns Resolves when all the loadable resources have been [loaded](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/#loaded).
   *   Rejects if at least one of the loadable resources failed to load.
   * @since 4.15
   * @see [load()](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/#load)
   * @example
   * // Load all resources but ignore if one or more of them failed to load
   * mapImageLayer.loadAll()
   *   .catch(function(error) {
   *     // Ignore any failed resources
   *   })
   *   .then(function() {
   *     console.log("All loaded");
   *   });
   */
  loadAll(): Promise<this>;
  /**
   * Saves the layer to its existing portal item in the [Portal](https://developers.arcgis.com/javascript/latest/references/core/portal/Portal/)
   * authenticated within the user's current session. If the layer is not saved to a
   * [PortalItem](https://developers.arcgis.com/javascript/latest/references/core/portal/PortalItem/), then you should use [saveAs()](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/#saveAs).
   *
   * > [!WARNING]
   * >
   * > **Known Limitation**
   * >
   * > This method does not support saving cached map services.
   *
   * @param options - Various options for saving the layer.
   * @returns When resolved, returns the portal item to which the layer is saved.
   * @since 4.33
   * @example const portalItem = await layer.save();
   */
  save(options?: LayerSaveOptions): Promise<PortalItem>;
  /**
   * Saves the layer to a new portal item in the [Portal](https://developers.arcgis.com/javascript/latest/references/core/portal/Portal/)
   * authenticated within the user's current session.
   *
   * > [!WARNING]
   * >
   * > **Known Limitation**
   * >
   * > This method does not support saving cached map services.
   *
   * @param portalItem - The portal item to which the layer will be saved.
   * @param options - Various options for saving the layer.
   * @returns When resolved, returns the portal item to which the layer is saved.
   * @since 4.33
   * @example
   * const portalItem = new PortalItem();
   * await layer.saveAs(portalItem);
   */
  saveAs(portalItem: PortalItemProperties, options?: LayerSaveAsOptions): Promise<PortalItem>;
}
declare const MapImageLayerSuperclass: typeof Layer & typeof CustomParametersMixin & typeof APIKeyMixin & typeof RefreshableLayer & typeof MultiOriginJSONSupportMixin & typeof PortalLayer & typeof OperationalLayer & typeof ArcGISMapService & typeof SublayersOwner & typeof ScaleRangeLayer & typeof TemporalLayer & typeof BlendLayer

export type MapImageLayerImageFormat = "png" | "png8" | "png24" | "png32" | "jpg" | "pdf" | "bmp" | "gif" | "pngjpg";