import Basemap from "@arcgis/core/Basemap";
import Collection from "@arcgis/core/core/Collection";
import type { EntityBaseProperties } from "../Entity.js";
import { EntityBase } from "../Entity.js";
import type { TaskSettingsProperties } from "../data/TaskSettings.js";
import { TaskSettings } from "../data/TaskSettings.js";
import { type BasemapJson } from "../json/BasemapJson.js";
import type { Action } from "../support/Action.js";
import type { InitializableBase } from "../support/InitializableBase.js";
import type { PropertyDefs } from "../support/Serializable.js";
import type { MapExtension } from "./MapExtension.js";
import type { LayerExtension, LayerExtensionProperties } from "./_LayerExtension.js";
import type { BasemapExtensionFactory } from "./support/BasemapExtensionFactory.js";
import type { LayerExtensionCollection } from "./support/_LayerExtensionCollection.js";
/**
 * The default BasemapExtension factory that will be used whenever a
 * BasemapExtension needs to be created.
 */
export declare const defaultBasemapExtensionFactory: {
    create: (properties?: BasemapExtensionProperties) => BasemapExtension<BasemapExtensionProperties>;
};
/**
 * Properties that can be passed into the constructor for
 * {@link mapping/BasemapExtension!BasemapExtension}.
 */
export interface BasemapExtensionProperties extends EntityBaseProperties {
    /**
     * The Esri Basemap object being extended. This property can also be a
     * string representing the ID of a well-known basemap, e.g. "streets". See
     * https://developers.arcgis.com/javascript/latest/api-reference/esri-Map.html#basemap
     * for a complete list.
     */
    basemap?: Basemap | BasemapProperties | string;
    /**
     * See {@link mapping/BasemapExtension!BasemapExtension.description}.
     */
    description?: string;
    /**
     * See {@link mapping/BasemapExtension!BasemapExtension.included}.
     */
    included?: boolean;
    /**
     * See {@link mapping/BasemapExtension!BasemapExtension.iconUrl}.
     */
    iconUrl?: string;
    /**
     * See {@link mapping/BasemapExtension!BasemapExtension.onClick}.
     */
    onClick?: Action;
    /**
     * See {@link mapping/BasemapExtension!BasemapExtension.baseLayerExtensions}.
     */
    baseLayerExtensions?: (LayerExtension | LayerExtensionProperties)[];
    /**
     * See
     * {@link mapping/BasemapExtension!BasemapExtension.referenceLayerExtensions}.
     */
    referenceLayerExtensions?: (LayerExtension | LayerExtensionProperties)[];
    /**
     * See {@link data/FeatureSource!FeatureSource.taskSettings}.
     */
    taskSettings?: TaskSettingsProperties;
    /**
     * See {@link mapping/BasemapExtension!BasemapExtension.isSeries}.
     */
    isSeries?: boolean;
}
/**
 * Properties that can be specified for the
 * {@link mapping/BasemapExtension!BasemapExtensionProperties.basemap} property.
 */
export interface BasemapProperties extends BasemapJson {
}
/**
 * Extends the capabilities of an Esri Basemap object.
 */
export declare class BasemapExtension<T extends BasemapExtensionProperties = BasemapExtensionProperties> extends EntityBase<T> {
    /**
     * The Esri Basemap object being extended.
     */
    get basemap(): Basemap;
    /**
     * The parent map extension.
     */
    get mapExtension(): MapExtension;
    /**
     * The layer extensions associated with each base layer of the basemap.
     */
    get baseLayerExtensions(): LayerExtensionCollection;
    /**
     * The layer extensions associated with each reference layer of the basemap.
     */
    get referenceLayerExtensions(): LayerExtensionCollection;
    /**
     * The URL pointing to an image that represents the basemap.
     */
    get iconUrl(): string;
    set iconUrl(value: string);
    /**
     * The factory that will be used whenever a BasemapExtension needs to be
     * created. Applications can supply their own factory to customize
     * BasemapExtension creation.
     */
    static factory: BasemapExtensionFactory;
    /**
     * Handle group key for watches that depend on the current basemap instance.
     */
    private static readonly _setBasemapWatchHandlesKey;
    /**
     * Whether this basemap should be included in a basemap picker.
     */
    included: boolean;
    /**
     * A user defined description.
     */
    description?: string;
    /**
     * An action that will be performed when the user clicks on the basemap in
     * the basemap picker.
     */
    onClick?: Action;
    /**
     * If true, the layers in this basemap will be presented one at a time,
     * rather that all at once.
     */
    isSeries?: boolean;
    /**
     * @inheritDoc
     */
    readonly taskSettings: TaskSettings;
    /**
     * @inheritDoc
     */
    protected readonly _itemType: string;
    private _iconUrl;
    private _mapExtension;
    private _basemap;
    private readonly _baseLayerExtensions;
    private readonly _referenceLayerExtensions;
    private _deferredBasemapProperties;
    private _createBackingBasemapPromise;
    /**
     * Creates a new instance of
     * {@link mapping/BasemapExtension!BasemapExtension}.
     *
     * @param properties An object containing initial property values to set.
     */
    constructor(properties?: T);
    /**
     * Creates the appropriate subclass of
     * {@link mapping/BasemapExtension!BasemapExtension} based on the supplied
     * properties. Applications can customize the default creation behavior by
     * supplying a custom factory object (see
     * {@link mapping/BasemapExtension!BasemapExtension.factory}).
     *
     * @param properties The BasemapExtension item properties.
     */
    static create(properties?: BasemapExtensionProperties): BasemapExtension;
    /**
     * Called to create the {@link data/TaskSettings!TaskSettings}.
     */
    protected _createTaskSettings(): TaskSettings;
    protected _getSerializableProperties(): PropertyDefs<T>;
    protected _onInitialize(): Promise<void>;
    protected _postInitialize(): Promise<void>;
    /**
     * A callback executed when a base layer is added to the basemap after the
     * LayerExtension has been initialized.
     *
     * @param baseLayerExtension The base layer that was added.
     */
    protected _onBaseLayerAddedPostInitialize: (baseLayerExtension: LayerExtension) => Promise<void>;
    /**
     * A callback executed when a reference layer is added to the basemap after
     * the LayerExtension has been initialized.
     *
     * @param referenceLayerExtension The reference layer that was added.
     */
    protected _onReferenceLayerAddedPostInitialize: (referenceLayerExtension: LayerExtension) => Promise<void>;
    protected _onDestroy(): Promise<void>;
    protected _initializableChildCollections(): IterableIterator<Collection<InitializableBase>>;
    private readonly _onLayerAddedPostInitialize;
    private _setBasemap;
    private _serializeBasemap;
}
