import type { Bounds, Coordinates, GridSectionJsonResponse, LocationJsonResponse } from "@what3words/api";
import type { GoogleMapsLibraries } from "../domain";
import type { EventType, Place, ViewType } from "./abstract";
import { MapProvider } from "./abstract";
export declare class GoogleMaps extends MapProvider {
    private loader;
    private grid;
    private autocomplete?;
    private places?;
    private map;
    private marker?;
    private eventListeners;
    private square?;
    init(map: HTMLElement, opts: {
        version: string;
        api_key: string;
        libraries: GoogleMapsLibraries;
        language: string;
        region: string;
        /**
         * The center value used on initial map load.
         * A required option for google maps SDK.
         * See https://developers.google.com/maps/documentation/javascript/overview#MapOptions
         */
        center: {
            lat: number;
            lng: number;
        };
        /**
         * The zoom value used on initial map load.
         * A required option for google maps SDK.
         * See https://developers.google.com/maps/documentation/javascript/overview#MapOptions
         */
        zoom: number;
        tilt?: number;
        disable_default_ui?: boolean;
        zoom_control?: boolean;
        zoom_control_position?: google.maps.ControlPosition;
        map_type_id?: ViewType;
        map_type_control?: boolean;
        map_type_control_position?: google.maps.ControlPosition;
        scale_control?: boolean;
        street_view_control?: boolean;
        street_view_control_position?: google.maps.ControlPosition;
        rotate_control?: boolean;
        rotate_control_position?: google.maps.ControlPosition;
        fullscreen_control?: boolean;
        fullscreen_control_position?: google.maps.ControlPosition;
    }, onInit?: () => void): void;
    addEventListener(event: EventType, listener: (...params: any[]) => void, opts?: {
        once: boolean;
    }): void;
    removeEventListener(event: EventType): void;
    removeAllEventListeners(): void;
    destroy(): void;
    plotGrid(grid: GridSectionJsonResponse, onClick?: (coordinates: Coordinates) => void): void;
    clearGrid(): void;
    plotSquare(square: LocationJsonResponse["square"]): void;
    plotMarker(address: LocationJsonResponse, callback: (coordinates: Coordinates) => void, markerIcon?: any): void;
    get center(): Coordinates | undefined;
    set center(coordinate: Coordinates);
    get zoom(): number | undefined;
    set zoom(zoom: number);
    /**
     * Retrieves bounds from map instance if present and returns w3w boundingBox object; otherwise returns the set default.
     * @returns Bounds a w3w bounding box object
     */
    get bounds(): Bounds;
    /**
     * Retrieves bounds from map instance if present; otherwise returns the set default.
     * See https://developers.google.com/maps/documentation/javascript/reference/coordinates#LatLngBoundsLiteral
     * @returns mapBounds a LatLngBoundsLiteral object
     */
    get mapBounds(): google.maps.LatLngBoundsLiteral;
    set viewType(type: ViewType);
    set options(options: google.maps.MapOptions);
    set mapTypeControlPosition(position: number);
    set zoomControlPosition(position: number);
    set fullscreenControlPosition(position: number);
    set streetViewControlPosition(position: number);
    set rotateControlPosition(position: number);
    set mapTypeId(id: string);
    panTo(coordinate?: Coordinates): void;
    setMapControlPosition(control: Node, position: number): void;
    getPlacesSuggestions(input: string, origin?: Coordinates, language?: string): Promise<Place[]>;
    getCoordinatesFromPlace(id: string): Promise<Coordinates | null>;
    addControl(control: Node, position: number): void;
    protected createSquare(square: Bounds): google.maps.Rectangle;
    private getGridStrokeColor;
    private getGridStrokeOpacity;
    private isMapControlPosition;
    private onChangePosition;
    private toEvent;
    /**
     * @param gmapsBounds a gmaps literal bounds object
     */
    private convertToW3wBounds;
    /**
     * @param w3wBounds a w3w bounding box object
     */
    private convertToBounds;
}
