import Collection from "@arcgis/core/core/Collection";
import type Extent from "@arcgis/core/geometry/Extent";
import type GroupLayer from "@arcgis/core/layers/GroupLayer";
import type Layer from "@arcgis/core/layers/Layer";
import type { GroupLayerJson } from "../json/GroupLayerJson.js";
import type { InitializableBase } from "../support/InitializableBase.js";
import type { PropertyDefs } from "../support/Serializable.js";
import type { VisibilityMode } from "../support/esri.js";
import type { MapExtension } from "./MapExtension.js";
import type { LayerExtensionProperties, LayerProperties } from "./_LayerExtension.js";
import { LayerExtension } from "./_LayerExtension.js";
import type { LayerListSettings, LayerListSettingsProperties } from "./support/LayerListSettings.js";
import { LayerExtensionCollectionBase } from "./support/_LayerExtensionCollection.js";
/**
 * Properties that can be passed into the constructor for
 * {@link GroupLayerExtension}.
 */
export interface GroupLayerExtensionProperties extends LayerExtensionProperties {
    /**
     * The Esri GroupLayer object being extended.
     */
    layer?: GroupLayer | (GroupLayerJson & LayerProperties);
    /**
     * See {@link GroupLayerExtension.layerExtensions}.
     */
    layerExtensions?: (LayerExtension | LayerExtensionProperties)[];
}
/**
 * Extends the capabilities of an Esri GroupLayer object.
 */
export declare class GroupLayerExtension<TProps extends LayerExtensionProperties = LayerExtensionProperties, TLayer extends LayerExtension<TProps> = LayerExtension<TProps>, TColl extends GroupLayerExtensionCollection<TProps, TLayer> = GroupLayerExtensionCollection<TProps, TLayer>> extends LayerExtension<GroupLayerExtensionProperties> {
    /**
     * The collection of layer extensions contained within the group.
     */
    protected readonly _layerExtensions: TColl;
    private _visibilityModeField;
    get layer(): GroupLayer;
    /**
     * The layer extensions associated with each layer of the group layer.
     */
    get layerExtensions(): TColl;
    get supportsSublayers(): boolean;
    get visibilityMode(): VisibilityMode;
    set visibilityMode(value: VisibilityMode);
    get effectiveFullExtent(): Extent;
    get effectiveMinScale(): number;
    get effectiveMaxScale(): number;
    /**
     * Creates a new instance of {@link GroupLayerExtension}.
     *
     * @param properties An object containing initial property values to set.
     */
    constructor(properties?: GroupLayerExtensionProperties);
    protected _getSerializableProperties(): PropertyDefs<GroupLayerExtensionProperties>;
    protected _onInitialize(): Promise<void>;
    protected _postInitialize(): Promise<void>;
    /**
     * A callback executed when a layer is added as a child of the
     * LayerExtension, after the LayerExtension has been initialized.
     *
     * @param layerX The layer that was added.
     */
    protected _onLayerAddedPostInitialize: (layerX: LayerExtension) => Promise<void>;
    protected _onDestroy(): Promise<void>;
    protected _initializableChildCollections(): IterableIterator<Collection<InitializableBase>>;
    /**
     * @inheritDoc
     */
    protected _isSupportedLayer(layer: Layer): boolean;
    /**
     * Creates a {@link GroupLayerExtensionCollection}.
     */
    protected _createLayerExtensionCollection(): TColl;
    protected _createLayerListSettings(properties: LayerListSettingsProperties): LayerListSettings;
}
/**
 * Backing implementation of
 * {@link mapping/support/_LayerExtensionCollection!LayerExtensionCollection} for
 * {@link GroupLayerExtension.layerExtensions}.
 */
export declare class GroupLayerExtensionCollection<TProps extends LayerExtensionProperties = LayerExtensionProperties, TLayer extends LayerExtension<TProps> = LayerExtension<TProps>> extends LayerExtensionCollectionBase {
    /**
     * The parent group layer extension that owns this collection.
     */
    protected readonly _parent: GroupLayerExtension;
    /**
     * @inheritDoc
     */
    protected get _mapExtension(): MapExtension;
    constructor(parent: GroupLayerExtension);
    add(layerX: TLayer, index?: number): this;
    protected _onAdded(layerExtension: TLayer): void;
    protected _onRemoved(layerX: TLayer): void;
}
