import { FitBoundsOptions, IControl, Map } from 'maplibre-gl';
import { LibreRoutingDataProvider, LibreRoutingDataResponse } from './providers';
import { LibreRoutingPlugin } from './plugins';
export declare type LngLatPosition = [number, number];
export declare type InternalWaypoint = {
    originalPos: LngLatPosition;
    mappedPos?: LngLatPosition;
    properties?: Record<string, string | boolean | number>;
};
export declare type Waypoint = {
    position: LngLatPosition;
    properties?: Record<string, string | boolean | number>;
};
declare type LibreRoutingOptions = {
    dataProvider: LibreRoutingDataProvider;
    alternatives: number;
    skipAlternativesOnMultipleWaypoint: boolean;
    firstRouteCenter: boolean;
    plugins: Array<LibreRoutingPlugin | (new (...args: any[]) => LibreRoutingPlugin)>;
    routeSourceId: string;
    waypointsSourceId: string;
    uniqueKey?: string;
};
export declare type LibreRoutingEvents = 'routesCalculated' | 'mainRouteCalculated' | 'waypointsChanged' | 'waypointChanged' | 'waypointDirtyChanged' | 'waypointAdded' | 'routeSelected' | 'routeError' | 'calculationStarted' | 'clearMap' | 'calculatePending';
export declare const resolveOptions: (options: LibreRoutingOptions) => {
    routeSourceId: string;
    waypointsSourceId: string;
    dataProvider: LibreRoutingDataProvider;
    alternatives: number;
    skipAlternativesOnMultipleWaypoint: boolean;
    firstRouteCenter: boolean;
    plugins: (LibreRoutingPlugin | (new (...args: any[]) => LibreRoutingPlugin))[];
    uniqueKey?: string;
};
export declare class LibreRouting<R extends LibreRoutingDataResponse = LibreRoutingDataResponse> implements IControl {
    private _map;
    private _options;
    private _selectedRouteId?;
    private dispatcher;
    private _data;
    private _waypoints;
    get map(): Map;
    get options(): LibreRoutingOptions;
    get data(): R;
    get selectedRouteId(): number | undefined;
    private set waypoints(value);
    private get waypoints();
    constructor(options: Partial<LibreRoutingOptions>);
    onAdd(map: Map): HTMLDivElement;
    onRemove(): void;
    setWaypoints(waypoints: Waypoint[], opts?: {
        emitEvent: boolean;
    }): void;
    addWaypoint(waypoint: Waypoint, index: number, mappedPos?: LngLatPosition, opts?: {
        emitEvent: boolean;
    }): void;
    updateWaypoint(waypoint: Waypoint, index: number, mappedPos?: LngLatPosition, opts?: {
        emitEvent: boolean;
    }): boolean;
    removeWaypoint(index: number, opts?: {
        emitEvent: boolean;
    }): void;
    getWaypoint(waypointId: number): InternalWaypoint;
    recalculateRoute({ skipCenter, clearMap, dropPendingRequests, dragMode, }?: {
        skipCenter?: boolean;
        clearMap?: boolean;
        dropPendingRequests?: boolean;
        dragMode?: boolean;
    }): Promise<R | undefined>;
    zoomToData(opts?: FitBoundsOptions): void;
    on(...args: [LibreRoutingEvents, (...args: any[]) => void | Promise<void>]): void;
    off(...args: [LibreRoutingEvents, (...args: any[]) => void | Promise<void>]): void;
    enable(): void;
    disable(): void;
    selectRoute(routeId: number): void;
    showAllRoutes(): void;
    clearMap(): void;
    getUniqueName(name: string): string;
    syncWaypointsPositions(opts?: {
        emitEvent: boolean;
    }): void;
    emitWaypointsChanged(): void;
    emitWaypointChanged(waypointId: number): void;
    emitWaypointDirtyChanged(waypointId: number): void;
    emitWaypointAdded(waypointId: number): void;
    private updateWaypointsSource;
    private initPlugins;
    private detachPlugins;
    private setupMapSources;
    private resolvePlugin;
    private setSource;
}
export {};
