import { LineString, Polygon, Position } from "geojson";
import { StoreChangeHandler, GeoJSONStore, GeoJSONStoreFeatures, FeatureId } from "./store/store";
export type HexColor = `#${string}`;
export type HexColorStyling = HexColor | ((feature: GeoJSONStoreFeatures) => HexColor);
export type NumericStyling = number | ((feature: GeoJSONStoreFeatures) => number);
export interface TerraDrawAdapterStyling {
    pointColor: HexColor;
    pointWidth: number;
    pointOutlineColor: HexColor;
    pointOutlineWidth: number;
    polygonFillColor: HexColor;
    polygonFillOpacity: number;
    polygonOutlineColor: HexColor;
    polygonOutlineWidth: number;
    lineStringWidth: number;
    lineStringColor: HexColor;
    zIndex: number;
}
export type CartesianPoint = {
    x: number;
    y: number;
};
export interface TerraDrawMouseEvent {
    lng: number;
    lat: number;
    containerX: number;
    containerY: number;
    button: "neither" | "left" | "middle" | "right";
    heldKeys: string[];
    isContextMenu: boolean;
}
export interface TerraDrawKeyboardEvent {
    key: string;
    heldKeys: string[];
    preventDefault: () => void;
}
export type Cursor = Parameters<SetCursor>[0];
export type SetCursor = (cursor: "unset" | "grab" | "grabbing" | "crosshair" | "pointer" | "wait" | "move") => void;
export type Project = (lng: number, lat: number) => CartesianPoint;
export type Unproject = (x: number, y: number) => {
    lat: number;
    lng: number;
};
export type GetLngLatFromEvent = (event: PointerEvent | MouseEvent) => {
    lng: number;
    lat: number;
} | null;
export type Projection = "web-mercator" | "globe";
export type OnFinishContext = {
    mode: string;
    action: string;
};
export type OnChangeContext = {
    origin: "api";
};
export type TerraDrawGeoJSONStore = GeoJSONStore<OnChangeContext | undefined, FeatureId>;
export interface TerraDrawModeRegisterConfig {
    mode: string;
    store: TerraDrawGeoJSONStore;
    setDoubleClickToZoom: (enabled: boolean) => void;
    setCursor: SetCursor;
    onChange: StoreChangeHandler<OnChangeContext | undefined>;
    onSelect: (selectedId: string) => void;
    onDeselect: (deselectedId: string) => void;
    onFinish: (finishedId: string, context: OnFinishContext) => void;
    project: Project;
    unproject: Unproject;
    coordinatePrecision: number;
}
export declare enum UpdateTypes {
    Commit = "commit",
    Provisional = "provisional",
    Finish = "finish"
}
type ValidationContext = Pick<TerraDrawModeRegisterConfig, "project" | "unproject" | "coordinatePrecision"> & {
    updateType: UpdateTypes;
};
export type Validation = (feature: GeoJSONStoreFeatures, context: ValidationContext) => {
    valid: boolean;
    reason?: string;
};
export interface Snapping {
    toLine?: boolean;
    toCoordinate?: boolean;
    toCustom?: (event: TerraDrawMouseEvent, context: {
        currentId?: FeatureId;
        currentCoordinate?: number;
        getCurrentGeometrySnapshot: () => (Polygon | LineString) | null;
        project: Project;
        unproject: Unproject;
    }) => Position | undefined;
}
export type TerraDrawModeState = "unregistered" | "registered" | "started" | "drawing" | "selecting" | "stopped";
export interface TerraDrawCallbacks {
    getState: () => TerraDrawModeState;
    onKeyUp: (event: TerraDrawKeyboardEvent) => void;
    onKeyDown: (event: TerraDrawKeyboardEvent) => void;
    onClick: (event: TerraDrawMouseEvent) => void;
    onMouseMove: (event: TerraDrawMouseEvent) => void;
    onDragStart: (event: TerraDrawMouseEvent, setMapDraggability: (enabled: boolean) => void) => void;
    onDrag: (event: TerraDrawMouseEvent, setMapDraggability: (enabled: boolean) => void) => void;
    onDragEnd: (event: TerraDrawMouseEvent, setMapDraggability: (enabled: boolean) => void) => void;
    onClear: () => void;
    onReady?(): void;
}
export interface TerraDrawChanges {
    created: GeoJSONStoreFeatures[];
    updated: GeoJSONStoreFeatures[];
    unchanged: GeoJSONStoreFeatures[];
    deletedIds: FeatureId[];
}
export type TerraDrawStylingFunction = {
    [mode: string]: (feature: GeoJSONStoreFeatures) => TerraDrawAdapterStyling;
};
export interface TerraDrawAdapter {
    project: Project;
    unproject: Unproject;
    setCursor: SetCursor;
    getLngLatFromEvent: GetLngLatFromEvent;
    setDoubleClickToZoom: (enabled: boolean) => void;
    getMapEventElement: () => HTMLElement;
    register(callbacks: TerraDrawCallbacks): void;
    unregister(): void;
    render(changes: TerraDrawChanges, styling: TerraDrawStylingFunction): void;
    clear(): void;
    getCoordinatePrecision(): number;
}
export declare const SELECT_PROPERTIES: {
    readonly SELECTED: "selected";
    readonly MID_POINT: "midPoint";
    readonly SELECTION_POINT_FEATURE_ID: "selectionPointFeatureId";
    readonly SELECTION_POINT: "selectionPoint";
};
export declare const COMMON_PROPERTIES: {
    readonly EDITED: "edited";
    readonly CLOSING_POINT: "closingPoint";
    readonly SNAPPING_POINT: "snappingPoint";
    readonly COORDINATE_POINT: "coordinatePoint";
    readonly COORDINATE_POINT_FEATURE_ID: "coordinatePointFeatureId";
    readonly COORDINATE_POINT_IDS: "coordinatePointIds";
};
export declare const Z_INDEX: {
    readonly LAYER_ONE: 10;
    readonly LAYER_TWO: 20;
    readonly LAYER_THREE: 30;
    readonly LAYER_FOUR: 40;
    readonly LAYER_FIVE: 50;
};
export {};
