import * as i0 from '@angular/core';
import { TemplateRef, ElementRef, ViewContainerRef, InjectionToken, EventEmitter, SimpleChanges, SimpleChange, IterableDiffers } from '@angular/core';
import { IManagedObject, IEvent, QueriesUtil, InventoryService, IIdentified, IResultList } from '@c8y/client';
import * as i3 from '@c8y/ngx-components';
import { GlobalAutoRefreshWidgetConfig, OptionsService, ServiceRegistry, FeatureCacheService, ManagedObjectRealtimeService, GeoService, DatePipe, WidgetGlobalAutoRefreshService, DynamicComponent, CountdownIntervalComponent, DynamicComponentAlertAggregator, ColorService } from '@c8y/ngx-components';
import * as _c8y_options from '@c8y/options';
import { MapDefaultConfig, MapTileLayer } from '@c8y/options';
import { TranslateService } from '@ngx-translate/core';
import * as L from 'leaflet';
import * as rxjs from 'rxjs';
import { Observable, BehaviorSubject, Subscription, Subject } from 'rxjs';
import { GlobalContextDisplayMode } from '@c8y/ngx-components/global-context';
import * as i1 from '@angular/common';
import * as i2 from '@angular/forms';
import * as i4 from 'ngx-bootstrap/tooltip';

declare class MapPopupDirective {
    template: TemplateRef<unknown>;
    elementRef: ElementRef;
    viewContainer: ViewContainerRef;
    constructor(template: TemplateRef<unknown>, elementRef: ElementRef, viewContainer: ViewContainerRef);
    static ɵfac: i0.ɵɵFactoryDeclaration<MapPopupDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<MapPopupDirective, "[c8yMapPopup]", never, {}, {}, never, never, true, never>;
}

/**
 * Utility function to assign asset and event information to a Leaflet marker.
 * @param marker The Leaflet marker instance.
 * @param asset The managed object representing the asset (optional).
 * @param event The event associated with the marker (optional).
 * @returns The marker with asset and/or event information attached.
 */
declare function getC8yMarker(marker: L.Marker, asset?: PositionManagedObject, event?: IEvent): C8yMarker;
/**
 * Injection token for providing map tile layers as an observable.
 */
declare const MAP_TILE_LAYER: InjectionToken<Observable<MapTileLayer[]>>;
/**
 * Utility type to require only one of the specified keys in a type.
 * @ignore
 */
type RequireOnlyOne<T, Keys extends keyof T = keyof T> = Pick<T, Exclude<keyof T, Keys>> & {
    [K in Keys]-?: Required<Pick<T, K>> & Partial<Record<Exclude<Keys, K>, undefined>>;
}[Keys];
/**
 * Attributes that can be attached to a Cumulocity marker.
 */
interface C8yMarkerAttr {
    asset: PositionManagedObject;
    event: IEvent;
}
/**
 * Type representing the attribute keys for a Cumulocity marker.
 */
type C8yMarkerAttributes = keyof C8yMarkerAttr;
/**
 * Leaflet marker extended with either asset or event information.
 */
type C8yMarker = L.Marker & RequireOnlyOne<C8yMarkerAttr, 'asset' | 'event'>;
/**
 * Enum for supported cluster sizes on the map.
 */
declare enum ClusterSize {
    /** No clustering. */
    NONE = 0,
    /** Cluster of 4. */
    FOUR = 1,
    /** Cluster of 16. */
    SIXTEEN = 2
}
/**
 * Enum for map tenant option keys used in configuration.
 */
declare enum MapTenantOptionKeys {
    /** Map configuration key. */
    CONFIG = "map-config",
    /** Map layers key. */
    LAYERS = "map-layers"
}
/**
 * Managed object with position and optional alarm status and icon for map display.
 */
interface PositionManagedObject extends IManagedObject {
    /**
     * Position information (latitude, longitude, optional altitude).
     */
    c8y_Position: {
        lat: number;
        lng: number;
        alt?: number;
    };
    /**
     * Optional active alarms status for the asset.
     */
    c8y_ActiveAlarmsStatus?: {
        minor: number;
        major: number;
        warning: number;
        critical: number;
    };
    /**
     * Optional icon information for the asset.
     */
    icon?: {
        name: string;
    };
}
interface GroupedPositionManagedObject {
    items: PositionManagedObject[];
}
/**
 * Configuration for the cluster map, including center and refresh interval.
 */
type ClusterMapConfig = MapConfig & {
    /**
     * Center coordinates of the map [latitude, longitude].
     */
    center: [number, number];
    isRealtimeEnabled?: boolean;
    isAutoRefreshEnabled?: boolean;
    /**
     * Optional refresh interval in milliseconds (null for no auto-refresh).
     */
    refreshInterval?: number | null;
    /** If set to true, the map will automatically fit to bounds on initialization. */
    autoFitToBounds?: boolean;
};
/**
 * General map configuration, including options for following, real-time, icon, color, zoom, pan, and bounds.
 */
type MapConfig = MapDefaultConfig & {
    /** Whether the map should follow the selected asset. */
    follow?: boolean;
    /** Whether the map should update in real-time. */
    realtime?: boolean;
    /** Optional icon name for the map. */
    icon?: string;
    /** Optional color for the map or marker. */
    color?: string;
    /** Disable zoom controls. */
    disableZoom?: boolean;
    /** Disable pan controls. */
    disablePan?: boolean;
    /** Optional map bounds. */
    bounds?: L.LatLngBounds;
    /** Optional fit bounds options. */
    fitBoundsOptions?: L.FitBoundsOptions;
    refreshOption?: 'live' | 'history';
    displayMode?: GlobalContextDisplayMode;
} & GlobalAutoRefreshWidgetConfig;
/**
 * Injection token for providing the default map configuration as an observable.
 */
declare const MAP_DEFAULT_CONFIG: InjectionToken<Observable<MapDefaultConfig>>;
/**
 * Default map tile layer configuration (OpenStreetMap).
 */
declare const defaultLayer: MapTileLayer;
/**
 * Default map configuration (centered on Düsseldorf, zoom level 2).
 */
declare const defaultMapConfig: MapDefaultConfig;
/**
 * Default options for fitting map bounds (padding).
 */
declare const defaultFitBoundsOptions: L.FitBoundsOptions;
/**
 * Configuration for the status buttons shown on the map UI.
 */
type MapStatusButtonsConfig = {
    autoRefresh: {
        show: boolean;
        disabled?: boolean;
    };
    refresh: {
        show: boolean;
        disabled?: boolean;
    };
    /** Real-time button configuration. */
    realtime: {
        show: boolean;
        disabled?: boolean;
    };
    /** Fit to bounds button configuration. */
    fitToBounds: {
        show: boolean;
        disabled?: boolean;
    };
    /** Center button configuration. */
    center: {
        show: boolean;
        disabled?: boolean;
    };
};
/**
 * Extension of QueriesUtil to use decimal literals instead of float literals.
 * Used for queries involving longitude and latitude to avoid precision issues.
 */
declare class QueriesUtilDecimalExtension extends QueriesUtil {
    useAsFloat(operand: string | number): string;
}

declare class MapService {
    private inventory;
    private options;
    private serviceRegistry;
    private featureCacheService;
    /**
     * Returns asset icon status for highest alarm severity found in device object.
     * @param device Device that contains alarms information.
     * @returns Status string according to alarm severity
     */
    static getStatus(device: PositionManagedObject): "text-muted" | "status critical" | "status major" | "status minor" | "status warning";
    /**
     * Returns the status of a group (highest severity among its devices).
     * @param group The group of devices.
     * @returns The status string representing the highest severity in the group.
     */
    static getGroupStatus(group: GroupedPositionManagedObject): string;
    /**
     * Maps status strings to severity levels for comparison.
     * @param status The status string.
     * @returns Numeric severity level (higher = more severe).
     */
    private static getStatusSeverity;
    /**
     * The devices that are maximal displayed in one cluster.
     */
    MAX_DEVICE_PER_CLUSTER: number;
    /**
     * The count until the cluster is sized. There are a maximum of
     * three clusters: 1, 4 or 16.
     */
    CLUSTER_LEVEL_THRESHOLD: number;
    private queriesUtil;
    /**
     * @ignore: Only DI.
     */
    constructor(inventory: InventoryService, options: OptionsService, serviceRegistry: ServiceRegistry, featureCacheService: FeatureCacheService);
    /**
     * Returns the leaflet instance used by the cumulocity core.
     */
    getLeaflet(): Promise<typeof L>;
    /**
     * Verifies if a given managed object is a device with a position fragment.
     * @param mo The given managed object.
     */
    isPositionedDevice(mo: IIdentified): boolean;
    /**
     * Verifies if a given managed object has a position fragment.
     * @param mo The given managed object.
     */
    hasPosition(mo: IIdentified): any;
    getMapTileLayerProviders(): CumulocityServiceRegistry.MapTileLayerProvider[];
    getMapTileLayersFromHookedProviders$(layerProviders: CumulocityServiceRegistry.MapTileLayerProvider[]): Observable<MapTileLayer[]>;
    /**
     * Returns the layers available in this application.
     * Layers are taken from plugins installed to this application.
     * In case none of the plugins override the default layers, the default layers are also considered.
     * @returns The layers.
     */
    getMapTileLayers$(): Observable<MapTileLayer[]>;
    /**
     * Returns the layers configured in the current platform via tenant options.
     * @returns The layers. If not set in tenant options the default layers.
     */
    getDefaultLayers(): Observable<MapTileLayer[]>;
    /**
     * Returns the map configuration configured on the tenant.
     * @returns The configuration. If not set in tenant options the default configuration.
     */
    getDefaultConfig(): Observable<MapDefaultConfig>;
    /**
     * Counts all managed objects in a given bound with a c8y_Position fragment.
     * @param bound The lat lng bound to request the managed objects for.
     * @param isInHierarchyOfMO The group managed object of which direct children should be searched for.
     * @returns The number of all position managed objects in the given bound (and group).
     */
    getPositionMOsFromBoundCount(bound: L.LatLngBounds, isInHierarchyOfMO?: IManagedObject): Promise<number>;
    /**
     * Returns all managed objects with a c8y_Position fragment in a certain boundary.
     * @param bound The lat lng bound to request the managed objects for.
     * @returns All position managed objects in the given bound.
     */
    getPositionMOsFromBound(bound: L.LatLngBounds): Promise<PositionManagedObject[]>;
    /**
     * Returns all managed objects with a c8y_Position fragment in a certain boundary that belongs to a certain group.
     * @param bound The lat lng bound to request the managed objects for.
     * @param isInHierarchyOfMO The group managed object of which direct children should be searched for.
     * @returns All position managed objects in the given bound that are children of the given group.
     */
    getPositionMOsFromBound(bound: L.LatLngBounds, isInHierarchyOfMO: IManagedObject): Promise<PositionManagedObject[]>;
    /**
     * Counts the managed objects in a certain boundary belonging to a group.
     * @param bound The lat lng bound to request the managed objects for.
     * @param isInHierarchyOfMO The group managed object of which direct children should be searched for.
     * @return The count of the managed objects.
     */
    getPositionMOsFromBound(bound: L.LatLngBounds, isInHierarchyOfMO: IManagedObject, count: true): Promise<number>;
    /**
     * Returns all devices with c8y_Position.
     */
    getPositionDevices(): Promise<PositionManagedObject[]>;
    /**
     * Returns all devices with c8y_Position.
     * @param pageSize The page size to return.
     */
    getPositionDevices(pageSize: number): Promise<PositionManagedObject[]>;
    /**
     * Returns all devices with c8y_Position.
     * @param pageSize The page size to return.
     * @param count Counting is disabled
     */
    getPositionDevices(pageSize: number, count: false): Promise<PositionManagedObject[]>;
    /**
     * Returns the number of all devices with c8y_Position.
     * @param pageSize The page size to return.
     * @param count Counting is enabled
     */
    getPositionDevices(pageSize: number, count: true): Promise<number>;
    /**
     * Returns all managed object with a c8y_Position fragment.
     * @param isInHierarchyOfMO The group managed object of which direct children should be searched for.
     * @param pageSize Defines how many results should be returned.
     * @returns The managed objects with position.
     */
    getAllPositionMOs(isInHierarchyOfMO?: IIdentified, pageSize?: number): Promise<IResultList<PositionManagedObject>>;
    /**
     * Gets the bounds of all assets, optionally within a group.
     * @param isInHierarchyOfMO Is inhierachy of managed object to limit the assets to a group.
     * @returns The bounds of all assets.
     */
    getAllBounds(isInHierarchyOfMO?: IIdentified): Promise<L.LatLngBounds>;
    /**
     * Determines a rectangular geographical area based on the positions of all devices.
     *
     * @returns A [[LatLngBounds]] object fitting all devices' geo positions.
     */
    getAllDevicesBounds(): Promise<L.LatLngBounds>;
    /**
     * Calculates the bounding box that contains all given assets.
     * @param assets The assets to calculate the bounds for.
     * @returns The calculated bounds or undefined if no valid positions are found.
     */
    getAssetsBounds(assets: PositionManagedObject[]): Promise<L.LatLngBounds | undefined>;
    /**
     * Returns the cluster size for clustered maps. Counting the position MOs in a bounding
     * and if it reach a threshold, returning a [[ClusterSize]].
     * @param bound The bounding to check for cluster size.
     * @returns The cluster size, can be NONE, FOUR or SIXTEEN.
     */
    getClusterSize(bound: L.LatLngBounds): Promise<ClusterSize>;
    private getMapOption;
    /**
     * Shifts longitudes received from Leaflet.js in the [-180 - k*360; 180 + k*360] rangewhen
     * `noWrap` is enabled to the [-180; 180] range expected for values of the c8y_Position fragment.
     *
     * @param lng Longitude to shift.
     * @returns  Longitude value in the [-180; 180] range
     */
    private normalizeLongitude;
    /**
     * Shifts longitudes in the [-180; 180] range expected for values of the c8y_Position fragment
     * the the [-180 - k*360; 180 + k*360] range expected from Leaflet.js when `noWrap` is enabled.
     *
     * The method naively adds/subtracts 360 degrees to the original value until the position fits in the expected bounds.
     *
     * @param pmo A managed object with a `c8y_Position` fragment
     * @param bounds The bounds where the position should fit
     * @returns A managed object whose `c8y_Position`'s `lng` values has been shifted to fit in bounds
     */
    private denormalizePMO;
    private childrenOfGroupFilter;
    /**
     * Internal method to calculate bounds based on position coordinates.
     * @param queryName The query parameter name to use ('q' or 'query'). Use q to limit to devices only.
     * @param isInHierarchyOfMO Optional managed object to limit the assets to a group.
     * @returns The calculated bounds
     */
    private getBounds;
    static ɵfac: i0.ɵɵFactoryDeclaration<MapService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<MapService>;
}

declare class MapComponent {
    protected moRealtimeService: ManagedObjectRealtimeService;
    protected mapService: MapService;
    protected layers$: Observable<MapTileLayer[]>;
    protected defaultConfig$: Observable<MapDefaultConfig>;
    protected translateService: TranslateService;
    protected geo: GeoService;
    protected datePipe: DatePipe;
    protected widgetGlobalAutoRefreshService: WidgetGlobalAutoRefreshService;
    /**
     * The leaflet map object instance.
     */
    map: L.Map;
    /**
     * The markers currently placed on the map.
     */
    markers: Array<C8yMarker | L.Marker>;
    /**
     * The leaflet library reference used for map operations.
     */
    leaflet: typeof L;
    /**
     * Indicates if the map was already initialized.
     */
    isInit: boolean;
    /**
     * Reference to the map DOM element.
     */
    mapElement: ElementRef;
    /**
     * Reference to the custom popup directive for map markers.
     */
    popup: MapPopupDirective;
    /**
     * Map configuration object (center, zoom, icon, color, etc).
     */
    config: MapConfig;
    /**
     * Asset(s) to display as markers on the map.
     */
    assets: PositionManagedObject | PositionManagedObject[];
    /**
     * Observable for polyline coordinates to display on the map.
     */
    polyline$: Observable<L.LatLngExpression[] | L.LatLngExpression[][]>;
    /**
     * Polyline display options for the map.
     */
    polylineOptions: L.PolylineOptions;
    /**
     * Emits when a tracked asset is updated in real-time.
     */
    onRealtimeUpdate: EventEmitter<PositionManagedObject>;
    /**
     * Emits observable of map drag/move events.
     */
    onMove: Observable<L.LeafletEvent>;
    /**
     * Emits observable of map move end events.
     */
    onMoveEnd: Observable<L.LeafletEvent>;
    /**
     * Emits observable of map zoom start events.
     */
    onZoomStart: Observable<L.LeafletEvent>;
    /**
     * Emits observable of map zoom end events.
     */
    onZoomEnd: Observable<L.LeafletEvent>;
    /**
     * Emits the Leaflet map instance when available.
     */
    onMap: BehaviorSubject<L.Map>;
    /**
     * Emits when the map and Leaflet library are initialized.
     */
    onInit: EventEmitter<typeof L>;
    protected realtimeSubscription: Subscription;
    protected unsubscribeTrigger$: Subject<void>;
    protected destroy$: Subject<void>;
    private markerTitle;
    private markerGroupTitle;
    constructor(moRealtimeService: ManagedObjectRealtimeService, mapService: MapService, layers$: Observable<MapTileLayer[]>, defaultConfig$: Observable<MapDefaultConfig>, translateService: TranslateService, geo: GeoService, datePipe: DatePipe, widgetGlobalAutoRefreshService: WidgetGlobalAutoRefreshService);
    /**
     * Starts real-time updates for a single asset on the map.
     * Updates marker position and icon as new data arrives.
     */
    startRealtime(): void;
    /**
     * Moves the map view to the position of the given asset(s) if follow is enabled.
     * @param positions The asset or array of assets to center the map on.
     */
    moveToPositionOfMo(positions: PositionManagedObject | PositionManagedObject[]): void;
    /**
     * Stops real-time updates for the asset.
     */
    stopRealtime(): void;
    /**
     * Finds a marker on the map by asset, event, or ID. (only if it is a C8yMarker)
     * @param moOrId Asset, event, or string ID to search for.
     * @returns The found marker or undefined.
     */
    findMarker(moOrId: string | IEvent | PositionManagedObject): C8yMarker | undefined;
    /**
     * Adds a marker to the map and internal marker list.
     * @param marker The marker to add.
     */
    addMarkerToMap(marker: C8yMarker | L.Marker): void;
    /**
     * Creates and returns a marker for the given asset, including icon and popup.
     * @param asset The asset to create a marker for.
     * @returns The created marker.
     */
    getAssetMarker(asset: GroupedPositionManagedObject): C8yMarker;
    /**
     * Creates and returns a marker for a single asset, including icon and popup.
     * @param asset The asset to create a marker for.
     * @returns The created marker.
     */
    getAssetMarkerSingle(asset: PositionManagedObject): C8yMarker;
    /**
     * Returns a marker with popup for a group of assets (clustered).
     * @param group The asset group.
     * @returns A marker for a group of assets (clustered).
     */
    getGroupedMarker(group: GroupedPositionManagedObject): C8yMarker;
    /**
     * Creates spider markers for a group of assets at the same position.
     * @param group The group of assets to create spider markers for.
     * @param center The center position of the group.
     * @param originalMarker The marker which was replaced by spider markers.
     */
    createSpiderMarkers(group: GroupedPositionManagedObject, center: L.LatLng, originalMarker: C8yMarker): void;
    /**
     * The icon for a group of assets (clustered).
     * It shows the count and is colored based on the highest severity status in the group.
     * @param group The group of assets.
     * @returns The marker icon for the group.
     */
    getGroupAssetIcon(group: GroupedPositionManagedObject): L.DivIcon;
    /**
     * Creates and returns a marker for a tracking event, including icon and popup.
     * @param event The event to create a marker for.
     * @returns The created marker.
     */
    getTrackingMarker(event: IEvent): C8yMarker;
    /**
     * Returns a Leaflet icon for the given asset, using config or asset icon and color.
     * @param asset The asset to get the icon for.
     * @param anchor The icon anchor point.
     * @returns The Leaflet icon.
     */
    getAssetIcon(asset: PositionManagedObject, anchor?: [number, number]): L.DivIcon;
    /**
     * Returns a Leaflet icon for a tracking event.
     * @returns The Leaflet icon.
     */
    getTrackingIcon(): L.DivIcon;
    /**
     * Removes a marker from the map and internal marker list.
     * @param marker The marker to remove.
     */
    removeMarker(marker: C8yMarker | L.Marker): void;
    /**
     * Removes all markers from the map, optionally filtered by marker attribute.
     * @param fragment Optional marker attribute to filter by.
     */
    clearMarkers(fragment?: C8yMarkerAttributes): void;
    /**
     * Refreshes all markers on the map based on the current assets.
     */
    refreshMarkers(): void;
    /**
     * Centers the map on the configured center coordinates.
     */
    center(): void;
    /**
     * Refreshes the map and markers if the map is initialized.
     */
    refresh(): void;
    protected ngAfterViewInit(): Promise<void>;
    protected ngOnChanges(changes: SimpleChanges): void;
    protected ngOnDestroy(): void;
    protected unsubscribeAllListeners(): void;
    protected initOutputs(): void;
    protected initMap(layers: MapTileLayer[], defaultConfig: MapConfig): void;
    protected handleMobile(): void;
    protected addLayers(layers: MapTileLayer[]): void;
    protected changeConfig(change: SimpleChange): void;
    protected hasChanged(change: SimpleChange, prop: keyof MapConfig): boolean;
    protected toggleControls(): void;
    private handleTouch;
    private zoomToBound;
    private fitBounds;
    private bindPopup;
    static ɵfac: i0.ɵɵFactoryDeclaration<MapComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<MapComponent, "c8y-map", never, { "config": { "alias": "config"; "required": false; }; "assets": { "alias": "assets"; "required": false; }; "polyline$": { "alias": "polyline$"; "required": false; }; "polylineOptions": { "alias": "polylineOptions"; "required": false; }; }, { "onRealtimeUpdate": "onRealtimeUpdate"; "onMove": "onMove"; "onMoveEnd": "onMoveEnd"; "onZoomStart": "onZoomStart"; "onZoomEnd": "onZoomEnd"; "onMap": "onMap"; "onInit": "onInit"; }, ["popup"], ["*"], true, never>;
}

/**
 * Smart map component for that clusters devices together when there are too many to display individually.
 * Unlike the basic map, this component loads device data dynamically and manages cluster rendering and updates.
 * Extends the base MapComponent with clustering, dynamic data loading, and advanced refresh logic.
 */
declare class ClusterMapComponent extends MapComponent implements DynamicComponent {
    protected moRealtimeService: ManagedObjectRealtimeService;
    protected mapService: MapService;
    protected layers$: Observable<MapTileLayer[]>;
    protected defaultConfig$: Observable<MapDefaultConfig>;
    protected translateService: TranslateService;
    protected widgetGlobalAutoRefreshService: WidgetGlobalAutoRefreshService;
    private iterable;
    private colorService;
    /** Emits true while the map is loading or refreshing clusters. */
    isLoading$: BehaviorSubject<boolean>;
    /** @ignore */
    countdownIntervalComp: CountdownIntervalComponent;
    /**
     * Cluster map configuration, including clustering thresholds and refresh intervals.
     */
    config: ClusterMapConfig;
    /**
     * The root managed object (e.g., group or device) for which to load and cluster data.
     */
    rootNode: IManagedObject;
    /**
     * Single asset to display (if not clustering). Used for following a specific device.
     * If provided, clusters will not be used, and the asset will be displayed individually.
     * If not provided, the component will cluster devices based on the root node.
     */
    assets: PositionManagedObject;
    /**
     * Whether to show a color overlay for each cluster rectangle. This can be useful for debugging or visualizing clusters.
     */
    showClusterColor: boolean;
    /**
     * Emits Leaflet map change events (move, moveend) for external listeners.
     */
    mapChange: EventEmitter<L.LeafletEvent>;
    /** Reference to the map element in the template. */
    mapElement: ElementRef;
    /** Aggregator for dynamic component alerts. */
    alerts: DynamicComponentAlertAggregator;
    /** @ignore */
    errorNotifier: BehaviorSubject<any>;
    /**
     * Indicates if the map was manually changed by the user (e.g., panned or zoomed).
     */
    isDirty: boolean;
    private reloadTrigger$;
    private clusters;
    private readonly EVENT_THROTTLE_TIME;
    /** Tracks the last followed position to prevent unnecessary map movements. */
    private lastFollowedPosition;
    /** Flag to skip first map movement after switching from realtime (prevents jump to stale cluster data). */
    private skipNextFollowMove;
    /**
     * Constructs the ClusterMapComponent, injecting required services and initializing the base map.
     */
    constructor(moRealtimeService: ManagedObjectRealtimeService, mapService: MapService, layers$: Observable<MapTileLayer[]>, defaultConfig$: Observable<MapDefaultConfig>, translateService: TranslateService, widgetGlobalAutoRefreshService: WidgetGlobalAutoRefreshService, iterable: IterableDiffers, colorService: ColorService, geo: GeoService, datePipe: DatePipe);
    /**
     * @ignore
     */
    ngOnChanges(changes: SimpleChanges): Promise<void>;
    /**
     * Handles changes to the map configuration using a state machine approach.
     * @param change The config change object.
     */
    changeConfig(change: SimpleChange): void;
    /**
     * @ignore
     */
    ngAfterViewInit(): Promise<void>;
    /**
     * Resets the map and clusters, re-initializing the component.
     */
    reset(): Promise<void>;
    /**
     * Triggers a reload of cluster data.
     */
    reload(): void;
    /**
     * Cancels an ongoing reload operation.
     */
    cancelReload(): void;
    /**
     * Subscribes to cluster and interval changes, updating clusters as needed.
     * Handles auto-refresh and global refresh loading.
     */
    listenToClusterAndIntervalChanges(): void;
    /**
     * Subscribes to map change events for cluster updates.
     */
    listenToClusterMapChanges(): void;
    /**
     * Refreshes markers or clusters, depending on whether a single asset or clusters are shown.
     */
    refreshMarkers(): void;
    /**
     * Overrides base startRealtime to ensure assets and markers are set for single device realtime mode.
     * Also switches from cluster subscription to marker-only mode.
     */
    startRealtime(): void;
    /**
     * Determines the current map state based on config.
     */
    private getMapState;
    /**
     * Handles state transitions using a clear state machine pattern.
     */
    private handleStateTransition;
    /** Realtime → Paused: Keep markers, stop subscriptions */
    private transitionRealtimeToPaused;
    /** Realtime → Auto-refresh: Switch to cluster mode */
    private transitionRealtimeToAutoRefresh;
    /** Paused → Realtime: Resume with existing markers */
    private transitionPausedToRealtime;
    /** Paused → Auto-refresh: Switch to cluster mode */
    private transitionPausedToAutoRefresh;
    /** Auto-refresh → Realtime: Use cluster position, switch to marker mode */
    private transitionAutoRefreshToRealtime;
    /** Auto-refresh → Paused: Keep clusters visible, stop listeners, preserve position */
    private transitionAutoRefreshToPaused;
    /** Helper to preserve marker position before transitions */
    private preserveMarkerPosition;
    /** Handle follow mode changes */
    private handleFollowChanges;
    /** Handle refresh interval changes */
    private handleRefreshIntervalChanges;
    private changeRootNode;
    private getClusterRects;
    private getRect;
    private clearClusters;
    private updateCluster;
    /**
     * Groups nearby assets based on pixel distance threshold.
     * @param assets Array of assets to group.
     * @param thresholdPixels Distance threshold in pixels.
     * @returns Array of asset groups.
     */
    private groupNearbyAssets;
    /**
     * Checks if two assets are within the specified pixel distance.
     * @param asset1 First asset.
     * @param asset2 Second asset.
     * @param thresholdPixels Distance threshold in pixels.
     * @returns True if assets are close, false otherwise.
     */
    private areMarkersClose;
    private createOrUpdateCluster;
    private getMapChangeObservable;
    private handleGlobalRefreshLoading;
    static ɵfac: i0.ɵɵFactoryDeclaration<ClusterMapComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<ClusterMapComponent, "c8y-cluster-map", never, { "config": { "alias": "config"; "required": false; }; "rootNode": { "alias": "rootNode"; "required": false; }; "assets": { "alias": "asset"; "required": false; }; "showClusterColor": { "alias": "showClusterColor"; "required": false; }; }, { "mapChange": "mapChange"; }, never, ["*"], true, never>;
}

declare class ClusterMap {
    private iterable;
    private addAssetCallback;
    private translateService;
    markers: C8yMarker[];
    positions: GroupedPositionManagedObject[];
    set clusterMarker(item: L.Layer);
    get clusterMarker(): L.Layer;
    set rect(item: L.Rectangle);
    get rect(): L.Rectangle;
    private _clusterMarker;
    private _rect;
    private iterableDiffer;
    constructor(iterable: IterableDiffers, addAssetCallback: (asset: GroupedPositionManagedObject) => C8yMarker, translateService: TranslateService);
    render(map: L.Map): void;
    clear(map: L.Map): void;
    removeClusterToBigMarker(): void;
    addMarkerToMap(device: GroupedPositionManagedObject, map: L.Map): void;
    setClusterToBigMarker(map: L.Map, count: any, leaflet: typeof L): void;
    private updateChanges;
    private trackBy;
    private removeMarkerFromMap;
}

/**
 * Component to display controls and status information for a map rendered on an IoT Dashboard.
 * Provides UI for centering, fitting bounds, toggling real-time updates, auto-refresh, and following assets.
 */
declare class MapStatusComponent {
    /**
     * Map configuration object, including center, refresh interval, and other map options.
     */
    config: ClusterMapConfig;
    /**
     * List of managed objects with position information to be displayed on the map.
     */
    assets: PositionManagedObject[];
    /**
     * Emits when the map configuration changes (e.g., toggling real-time, follow, etc.).
     */
    configChange: EventEmitter<ClusterMapConfig>;
    /**
     * Emits when the user unfollows an asset on the map.
     */
    onUnfollow: EventEmitter<ClusterMapConfig>;
    /**
     * Emits when the user requests to fit all assets within the map bounds.
     */
    fitAssetsToBounds: EventEmitter<void>;
    /**
     * Reference to the ClusterMapComponent instance rendered in the view.
     */
    clusterMap: ClusterMapComponent;
    /**
     * Configuration for which map status buttons are shown/enabled.
     * By default the "center" button is shown and realtime is disabled.
     * See {@link MapStatusButtonsConfig} for available options.
     */
    buttonsConfig: Partial<MapStatusButtonsConfig>;
    /**
     * @ignore
     */
    countdownIntervalComp: CountdownIntervalComponent;
    /**
     * @ignore
     */
    initConfig: ClusterMapConfig;
    /**
     * @ignore
     */
    refreshPaused: boolean;
    /**
     * @ignore
     */
    autoRefreshPausedLabel: "Auto refresh paused";
    /**
     * @ignore
     */
    autoRefreshEnabledLabel: "Auto refresh enabled";
    private destroy$;
    /**
     * @ignore
     */
    ngOnInit(): void;
    /**
     * @ignore
     */
    ngAfterViewInit(): void;
    /**
     * @ignore
     */
    ngOnChanges(changes: SimpleChanges): void;
    /**
     * Centers the map on the configured center coordinates.
     */
    center(): void;
    /**
     * Emits an event to fit all assets within the map bounds and disables the button until the next change.
     */
    fitToBounds(): void;
    /**
     * Reloads the map data.
     */
    reload(): void;
    /**
     * Cancels the map reload operation.
     */
    cancelReload(): void;
    /**
     * Toggles real-time updates for the map.
     */
    toggleRealtime(): void;
    /**
     * Toggles the auto-refresh state for the map, pausing or resuming the countdown.
     * @param $event Mouse event to prevent default and stop propagation.
     */
    toggleAutoRefresh($event: MouseEvent): void;
    /**
     * Disables following an asset on the map and emits the change.
     */
    unfollow(): void;
    /**
     * Enables following an asset on the map and emits the change.
     */
    follow(): void;
    /**
     * @ignore
     */
    ngOnDestroy(): void;
    /**
     * Subscribes to map changes and updates button states based on map bounds and center.
     */
    private checkIfMapIsAlreadyCentered;
    /**
     * Checks if Center button should be disabled according to provided bounds.
     * Provided bounds contain coordinates of current map rectangle corners.
     * Center button should be disabled if distance between center coordinates (from config) and center of current bounds
     * is less than 1/4 of bounds dimensions.
     * To achieve it we just need to check if center coordinates (from config) are contained in the boundaries of
     * current bounds shrunk by 25%.
     * @param bounds Current map view boundaries.
     * @returns True if distance between config center and current boundaries center is bigger than 1/4 of boundaries dimensions
     */
    private shouldDisableCenterButton;
    /**
     * Checks if Fit to Bounds button should be disabled based on whether all assets are within the current bounds.
     * @param bounds Current map view boundaries.
     * @returns True if all assets are already within bounds, false otherwise.
     */
    private shouldDisableFitToBoundsButton;
    /**
     * Returns the default configuration for map status buttons.
     * @returns Default MapStatusButtonsConfig object.
     */
    private defaultButtonsConfig;
    static ɵfac: i0.ɵɵFactoryDeclaration<MapStatusComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<MapStatusComponent, "c8y-map-status", never, { "config": { "alias": "config"; "required": false; }; "assets": { "alias": "assets"; "required": false; }; "clusterMap": { "alias": "clusterMap"; "required": false; }; "buttonsConfig": { "alias": "buttonsConfig"; "required": false; }; }, { "configChange": "configChange"; "onUnfollow": "onUnfollow"; "fitAssetsToBounds": "fitAssetsToBounds"; }, never, ["*"], true, never>;
}

declare function provideMapConfig(): ({
    provide: i0.InjectionToken<rxjs.Observable<_c8y_options.MapTileLayer[]>>;
    useFactory: (mapService: MapService) => rxjs.Observable<_c8y_options.MapTileLayer[]>;
    deps: (typeof MapService)[];
} | {
    provide: i0.InjectionToken<rxjs.Observable<_c8y_options.MapDefaultConfig>>;
    useFactory: (mapService: MapService) => rxjs.Observable<_c8y_options.MapDefaultConfig>;
    deps: (typeof MapService)[];
})[];
declare class MapModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<MapModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<MapModule, never, [typeof i1.CommonModule, typeof i2.FormsModule, typeof i3.CommonModule, typeof i3.FormsModule, typeof i3.RealtimeModule, typeof i3.CoreModule, typeof i4.TooltipModule, typeof MapComponent, typeof MapStatusComponent, typeof ClusterMapComponent, typeof MapPopupDirective], [typeof MapComponent, typeof MapStatusComponent, typeof ClusterMapComponent, typeof MapPopupDirective]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<MapModule>;
}

declare global {
    namespace CumulocityServiceRegistry {
        interface SpecificExtensionKeys {
            mapTileLayerHook: MapTileLayerProvider;
        }
        interface MapTileLayerProvider {
            getMapTileLayers$(): Observable<MapTileLayer[]>;
            overridesDefaultLayer?(): boolean;
        }
    }
}
//# sourceMappingURL=map-tile-layer-hook.d.ts.map

export { ClusterMap, ClusterMapComponent, ClusterSize, MAP_DEFAULT_CONFIG, MAP_TILE_LAYER, MapComponent, MapModule, MapPopupDirective, MapService, MapStatusComponent, MapTenantOptionKeys, QueriesUtilDecimalExtension, defaultFitBoundsOptions, defaultLayer, defaultMapConfig, getC8yMarker, provideMapConfig };
export type { C8yMarker, C8yMarkerAttributes, ClusterMapConfig, GroupedPositionManagedObject, MapConfig, MapStatusButtonsConfig, PositionManagedObject };
//# sourceMappingURL=index.d.ts.map
