/** @packageDocumentation
 * @module MapLayers
 */
import { BeEvent } from "@itwin/core-bentley";
import { Cartographic, ImageMapLayerSettings, ImageSource } from "@itwin/core-common";
import { ScreenViewport } from "../../Viewport";
import { ImageryMapTile, ImageryMapTileTree, MapCartoRectangle, MapFeatureInfoOptions, MapLayerFeatureInfo, MapTilingScheme, QuadId } from "../internal";
import { HitDetail } from "../../HitDetail";
/** The status of the map layer imagery provider that lets you know if authentication is needed to request tiles.
 * @public
 */
export declare enum MapLayerImageryProviderStatus {
    Valid = 0,
    RequireAuth = 1
}
/** @internal */
export interface WGS84Extent {
    longitudeLeft: number;
    longitudeRight: number;
    latitudeTop: number;
    latitudeBottom: number;
}
/** Abstract class for map layer imagery providers.
 * Map layer imagery providers request and provide tile images and other data. Each map layer from a separate source needs its own imagery provider object.
 * @beta
 */
export declare abstract class MapLayerImageryProvider {
    protected readonly _settings: ImageMapLayerSettings;
    protected _usesCachedTiles: boolean;
    protected _hasSuccessfullyFetchedTile: boolean;
    readonly onStatusChanged: BeEvent<(provider: MapLayerImageryProvider) => void>;
    /** @internal */
    private readonly _mercatorTilingScheme;
    /** @internal */
    private readonly _geographicTilingScheme;
    /** @internal */
    private _status;
    /** @internal */
    protected _includeUserCredentials: boolean;
    /** @internal */
    protected readonly onFirstRequestCompleted: BeEvent<() => void>;
    /** @internal */
    protected _firstRequestPromise: Promise<void> | undefined;
    /** @internal */
    get status(): MapLayerImageryProviderStatus;
    /** @alpha */
    get supportsMapFeatureInfo(): boolean;
    resetStatus(): void;
    /** @internal */
    get tileSize(): number;
    /** @internal */
    get maximumScreenSize(): number;
    get minimumZoomLevel(): number;
    get maximumZoomLevel(): number;
    /** @internal */
    get usesCachedTiles(): boolean;
    get mutualExclusiveSubLayer(): boolean;
    /** @internal */
    get useGeographicTilingScheme(): boolean;
    cartoRange?: MapCartoRectangle;
    /**
     * This value is used internally for various computations, this should not get overriden.
     * @internal
     */
    protected readonly defaultMinimumZoomLevel = 0;
    /**
     * This value is used internally for various computations, this should not get overriden.
     * @internal
     */
    protected readonly defaultMaximumZoomLevel = 22;
    /** @internal */
    protected get _filterByCartoRange(): boolean;
    constructor(_settings: ImageMapLayerSettings, _usesCachedTiles: boolean);
    /**
     * Initialize the provider by loading the first tile at its default maximum zoom level.
     * @beta
     */
    initialize(): Promise<void>;
    abstract constructUrl(row: number, column: number, zoomLevel: number): Promise<string>;
    get tilingScheme(): MapTilingScheme;
    /**
     * Add attribution logo cards for the data supplied by this provider to the [[Viewport]]'s logo div.
     * @param _cards Logo cards HTML element that may contain custom data attributes.
     * @param _viewport Viewport to add logo cards to.
     * @beta
     */
    addLogoCards(_cards: HTMLTableElement, _viewport: ScreenViewport): void;
    /** @internal */
    protected _missingTileData?: Uint8Array;
    /** @internal */
    get transparentBackgroundString(): string;
    /** @internal */
    protected _areChildrenAvailable(_tile: ImageryMapTile): Promise<boolean>;
    /** @internal */
    getPotentialChildIds(quadId: QuadId): QuadId[];
    /**
     * Get child IDs of a quad and generate tiles based on these child IDs.
     * See [[ImageryTileTree._loadChildren]] for the definition of `resolveChildren` where this function is commonly called.
     * @param quadId quad to generate child IDs for.
     * @param resolveChildren Function that creates tiles from child IDs.
     * @beta
     */
    protected _generateChildIds(quadId: QuadId, resolveChildren: (childIds: QuadId[]) => void): void;
    /** @internal */
    generateChildIds(tile: ImageryMapTile, resolveChildren: (childIds: QuadId[]) => void): void;
    /**
     * Get tooltip text for a specific quad and cartographic position.
     * @param strings List of strings to contain tooltip text.
     * @param quadId Quad ID to get tooltip for.
     * @param _carto Cartographic that may be used to retrieve and/or format tooltip text.
     * @param tree Tree associated with the quad to get the tooltip for.
     * @internal
     */
    getToolTip(strings: string[], quadId: QuadId, _carto: Cartographic, tree: ImageryMapTileTree): Promise<void>;
    /** @internal */
    getFeatureInfo(featureInfos: MapLayerFeatureInfo[], _quadId: QuadId, _carto: Cartographic, _tree: ImageryMapTileTree, _hit: HitDetail, _options?: MapFeatureInfoOptions): Promise<void>;
    /** @internal */
    protected getImageFromTileResponse(tileResponse: Response, zoomLevel: number): Promise<ImageSource | undefined>;
    /**
     * Change the status of this provider.
     * Sub-classes should override 'onStatusUpdated' instead of this method.
     * @internal
     */
    setStatus(status: MapLayerImageryProviderStatus): void;
    /** Method called whenever the status changes, giving the opportunity to sub-classes to have a custom behavior.
     *  @internal
     */
    protected onStatusUpdated(_newStatus: MapLayerImageryProviderStatus): void;
    /** @internal */
    protected setRequestAuthorization(headers: Headers): void;
    /** @internal */
    makeTileRequest(url: string, timeoutMs?: number): Promise<Response>;
    /** @internal */
    makeRequest(url: string, timeoutMs?: number): Promise<Response>;
    /** Returns a map layer tile at the specified settings. */
    loadTile(row: number, column: number, zoomLevel: number): Promise<ImageSource | undefined>;
    /** @internal */
    protected toolTipFromUrl(strings: string[], url: string): Promise<void>;
    /** @internal */
    matchesMissingTile(tileData: Uint8Array): boolean;
    /**
     * Calculates the projected x cartesian coordinate in EPSG:3857 from the longitude in EPSG:4326 (WGS84)
     * @param longitude Longitude in EPSG:4326 (WGS84)
     * @internal
     */
    getEPSG3857X(longitude: number): number;
    /**
     * Calculates the projected y cartesian coordinate in EPSG:3857 from the latitude in EPSG:4326 (WGS84)
     * @param latitude Latitude in EPSG:4326 (WGS84)
     * @internal
     */
    getEPSG3857Y(latitude: number): number;
    /**
     * Calculates the longitude in EPSG:4326 (WGS84) from the projected x cartesian coordinate in EPSG:3857
     * @param x3857 Projected x cartesian coordinate in EPSG:3857
     * @internal
     */
    getEPSG4326Lon(x3857: number): number;
    /**
     * Calculates the latitude in EPSG:4326 (WGS84) from the projected y cartesian coordinate in EPSG:3857
     * @param y3857 Projected y cartesian coordinate in EPSG:3857
     * @internal
     */
    getEPSG4326Lat(y3857: number): number;
    /**
     * Get the bounding box/extents of a tile in EPSG:4326 (WGS84) format.
     * Map tile providers like Bing and Mapbox allow the URL to be constructed directly from the zoom level and tile coordinates.
     * However, WMS-based servers take a bounding box instead. This method can help get that bounding box from a tile.
     * @param row Row of the tile
     * @param column Column of the tile
     * @param zoomLevel Desired zoom level of the tile
     * @internal
     */
    getEPSG4326Extent(row: number, column: number, zoomLevel: number): WGS84Extent;
    /**
     * Get the bounding box/extents of a tile in EPSG:3857 format.
     * @param row Row of the tile
     * @param column Column of the tile
     * @param zoomLevel Desired zoom level of the tile
     * @internal
     */
    getEPSG3857Extent(row: number, column: number, zoomLevel: number): {
        left: number;
        right: number;
        top: number;
        bottom: number;
    };
    /** @internal */
    getEPSG3857ExtentString(row: number, column: number, zoomLevel: number): string;
    /** @internal */
    getEPSG4326TileExtentString(row: number, column: number, zoomLevel: number, latLongAxisOrdering: boolean): string;
    /** @internal */
    getEPSG4326ExtentString(tileExtent: WGS84Extent, latLongAxisOrdering: boolean): string;
    /** Append custom parameters for settings to provided URL object.
     * @internal
     */
    protected appendCustomParams(url: string): string;
}
//# sourceMappingURL=MapLayerImageryProvider.d.ts.map