import type SpatialReference from "../geometry/SpatialReference.js";
import type Layer from "./Layer.js";
import type TileInfo from "./support/TileInfo.js";
import type { AbortOptions } from "../core/promiseUtils.js";
import type { BlendLayer, BlendLayerProperties } from "./mixins/BlendLayer.js";
import type { OperationalLayer, OperationalLayerProperties } from "./mixins/OperationalLayer.js";
import type { PortalLayer, PortalLayerProperties } from "./mixins/PortalLayer.js";
import type { RefreshableLayer, RefreshableLayerProperties } from "./mixins/RefreshableLayer.js";
import type { ScaleRangeLayer, ScaleRangeLayerProperties } from "./mixins/ScaleRangeLayer.js";
import type { TileInfoProperties } from "./support/TileInfo.js";
import type { LayerProperties } from "./Layer.js";

export interface WebTileLayerProperties extends LayerProperties, PortalLayerProperties, OperationalLayerProperties, ScaleRangeLayerProperties, RefreshableLayerProperties, BlendLayerProperties, Partial<Pick<WebTileLayer, "copyright" | "subDomains" | "urlTemplate">> {
  /** The tiling scheme information for the layer. */
  tileInfo?: TileInfoProperties;
}

/**
 * WebTileLayer provides a simple way to add non-ArcGIS Server map tiles as a layer to a map.
 * The constructor takes a URL template that usually follows a pattern of
 * `http://some.domain.com/{level}/{col}/{row}/` where `level` corresponds to a zoom level, and
 * `column` and `row` represent tile column and row, respectively. This pattern is not required, but
 * is the most common one currently on the web.
 *
 * The [subDomains](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-WebTileLayer.html#subDomains) property can be used to specify subDomains where tiles are served to
 * speed up tile retrieval (using subDomains gets around the browser limit of the max number of concurrent
 * requests to a domain). If subDomains are specified, the [urlTemplate](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-WebTileLayer.html#urlTemplate) should include a `{subDomain}` place
 * holder. The [copyright](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-WebTileLayer.html#copyright) property can be used to define attribution information that will be displayed
 * in the map's Attribution widget.
 *
 * If the 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.
 *
 * > [!WARNING]
 * >
 * > When adding a WebTileLayer to a map in a [SceneView](https://developers.arcgis.com/javascript/latest/api-reference/esri-views-SceneView.html) with local
 * > [SceneView#viewingMode](https://developers.arcgis.com/javascript/latest/api-reference/esri-views-SceneView.html#viewingMode), the [fullExtent](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-WebTileLayer.html#fullExtent) property must be set
 * > on the layer.
 *
 * > [!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/documentation/mapping-and-location-services/reference/basemap-attribution/) documentation.
 * > For information on terms of use, see the [Terms of Use](https://developers.arcgis.com/documentation/terms-of-use/).
 *
 * @since 4.0
 * @see [Sample - WebTileLayer (3D)](https://developers.arcgis.com/javascript/latest/sample-code/layers-webtile-3d/)
 * @see [TileLayer](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-TileLayer.html)
 */
export default class WebTileLayer extends WebTileLayerSuperclass {
  constructor(properties?: WebTileLayerProperties);
  /**
   * The attribution information for the layer.
   *
   * @default ""
   */
  accessor copyright: string;
  /**
   * Indicates whether the layer instance has loaded.
   * When `true`, all the properties of the object can be accessed.
   *
   * @default false
   */
  get loaded(): boolean;
  /**
   * The spatial reference of the layer.
   *
   * @default SpatialReference.WebMercator // wkid: 3857
   */
  get spatialReference(): SpatialReference;
  /**
   * A string of subDomain names where tiles are served to speed up tile retrieval.
   * If subDomains are specified, the [urlTemplate](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-WebTileLayer.html#urlTemplate) should include a
   * `{subDomain}` place holder.
   *
   * @see [WebTileLayer#urlTemplate](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-WebTileLayer.html#urlTemplate)
   * @example
   * // add an open street map layer
   * new WebTileLayer({
   *   "https://{subDomain}.tile.openstreetmap.org/{z}/{x}/{y}.png",
   *   subDomains: ["a", "b", "c"],
   * });
   */
  accessor subDomains: string[] | null | undefined;
  /** The tiling scheme information for the layer. */
  get tileInfo(): TileInfo;
  set tileInfo(value: TileInfoProperties);
  /**
   * The list of tile server urls for the layer.
   * It's computed from the [urlTemplate](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-WebTileLayer.html#urlTemplate) and the list of [subDomains](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-WebTileLayer.html#subDomains)
   */
  get tileServers(): string[] | null | undefined;
  /**
   * For [WebTileLayer](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-WebTileLayer.html) the type is `web-tile`.
   *
   * @default "web-tile"
   */
  get type(): "web-tile" | "open-street-map";
  /**
   * The url template is a string that specifies the URL of the hosted tile images to load. The url template resembles an absolute URL but with a number
   * of placeholder strings that the source evaluates to decide which tiles to load.
   *
   * The url template can follow a pattern of `https://some.domain.com/{level}/{col}/{row}/` where `level` corresponds to a zoom level, and `column` and `row` represent a
   * tile column and row, respectively. It can also follow a pattern of `https://some.domain.com/{z}/{x}/{y}/` where `z` corresponds to a zoom level, and `x` and `y` represent
   * a tile location along x and y axis.
   *
   * The `urlTemplate` should contain a `{subDomain}` place holder if [subDomains](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-WebTileLayer.html#subDomains) are specified.
   *
   * @see [WebTileLayer#subDomains](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-WebTileLayer.html#subDomains)
   * @example
   * // add an open street map layer
   * new WebTileLayer({
   *   "https://{subDomain}.tile.openstreetmap.org/{z}/{x}/{y}.png",
   *   subDomains: ["a", "b", "c"],
   * });
   */
  accessor urlTemplate: string | null | undefined;
  /**
   * This method fetches a tile for the given level, row and column present in the view.
   *
   * @param level - Level of detail of the tile to fetch. This value is provided by [LayerView](https://developers.arcgis.com/javascript/latest/api-reference/esri-views-layers-LayerView.html).
   * @param row - The row(y) position of the tile fetch. This value is provided by [LayerView](https://developers.arcgis.com/javascript/latest/api-reference/esri-views-layers-LayerView.html).
   * @param col - The column(x) position of the tile to fetch. This value is provided by [LayerView](https://developers.arcgis.com/javascript/latest/api-reference/esri-views-layers-LayerView.html).
   * @param options - Optional settings for the tile request. The options have the following properties.
   * @returns Returns a promise that resolves to an
   * [HTMLImageElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement).
   */
  fetchTile(level: number, row: number, col: number, options?: AbortOptions): Promise<HTMLImageElement>;
  /**
   * This method returns a URL to a tile for a given level, row and column.
   *
   * @param level - The requested tile's level.
   * @param row - The requested tile's row.
   * @param col - The requested tile's column.
   * @returns Returns the tile URL.
   */
  getTileUrl(level: number, row: number, col: number): string;
}
declare const WebTileLayerSuperclass: typeof Layer & typeof PortalLayer & typeof OperationalLayer & typeof ScaleRangeLayer & typeof RefreshableLayer & typeof BlendLayer