import { BehaviorConfig, TerraDrawModeBehavior } from "./base.behavior";
import { TerraDrawOnChangeContext, HexColor, OnFinishContext, Projection, TerraDrawAdapterStyling, TerraDrawGeoJSONStore, TerraDrawKeyboardEvent, TerraDrawModeRegisterConfig, TerraDrawModeState, TerraDrawMouseEvent, Validation, HexColorStyling, NumericStyling, UrlStyling } from "../common";
import { FeatureId, GeoJSONStoreFeatures, StoreChangeHandler } from "../store/store";
export type CustomStyling = Record<string, string | number | HexColorStyling | NumericStyling | UrlStyling | [number, number]>;
export declare enum ModeTypes {
    Drawing = "drawing",
    Select = "select",
    Static = "static",
    Render = "render"
}
export declare const DefaultPointerEvents: {
    readonly rightClick: true;
    readonly contextMenu: false;
    readonly leftClick: true;
    readonly onDragStart: true;
    readonly onDrag: true;
    readonly onDragEnd: true;
};
type AllowPointerEvent = boolean | ((event: TerraDrawMouseEvent) => boolean);
export type ModeUpdateOptions<Mode> = Omit<Mode, "modeName">;
export interface PointerEvents {
    leftClick: AllowPointerEvent;
    rightClick: AllowPointerEvent;
    contextMenu: AllowPointerEvent;
    onDragStart: AllowPointerEvent;
    onDrag: AllowPointerEvent;
    onDragEnd: AllowPointerEvent;
}
export type BaseModeOptions<Styling extends CustomStyling> = {
    modeName?: string;
    styles?: Partial<Styling>;
    pointerDistance?: number;
    validation?: Validation;
    projection?: Projection;
    pointerEvents?: PointerEvents;
};
export declare abstract class TerraDrawBaseDrawMode<Styling extends CustomStyling> {
    protected _state: TerraDrawModeState;
    get state(): TerraDrawModeState;
    set state(_: TerraDrawModeState);
    protected _styles: Partial<Styling>;
    get styles(): Partial<Styling>;
    set styles(styling: Partial<Styling>);
    protected pointerEvents: PointerEvents;
    protected behaviors: TerraDrawModeBehavior[];
    protected validate: Validation | undefined;
    protected pointerDistance: number;
    protected coordinatePrecision: number;
    protected undoRedoMaxStackSize?: number;
    protected onStyleChange: StoreChangeHandler<TerraDrawOnChangeContext | undefined>;
    protected store: TerraDrawGeoJSONStore;
    protected projection: Projection;
    protected setDoubleClickToZoom: TerraDrawModeRegisterConfig["setDoubleClickToZoom"];
    protected unproject: TerraDrawModeRegisterConfig["unproject"];
    protected project: TerraDrawModeRegisterConfig["project"];
    protected setCursor: TerraDrawModeRegisterConfig["setCursor"];
    protected registerBehaviors(behaviorConfig: BehaviorConfig): void;
    private isInitialUpdate;
    constructor(options?: BaseModeOptions<Styling>, willCallUpdateOptionsInParentClass?: boolean);
    updateOptions(options?: BaseModeOptions<Styling>): void;
    protected allowPointerEvent(pointerEvent: AllowPointerEvent, event: TerraDrawMouseEvent): boolean;
    type: ModeTypes;
    mode: string;
    protected setDrawing(): void;
    protected setStarted(): void;
    protected setStopped(): void;
    register(config: TerraDrawModeRegisterConfig): void;
    validateFeature(feature: unknown): ReturnType<Validation>;
    afterFeatureAdded(feature: GeoJSONStoreFeatures): void;
    afterFeatureUpdated(feature: GeoJSONStoreFeatures): void;
    private performFeatureValidation;
    protected validateModeFeature(feature: unknown, modeValidationFn: (feature: GeoJSONStoreFeatures) => ReturnType<Validation>): ReturnType<Validation>;
    abstract start(): void;
    abstract stop(): void;
    abstract cleanUp(): void;
    abstract styleFeature(feature: GeoJSONStoreFeatures): TerraDrawAdapterStyling;
    onFinish(finishedId: FeatureId, context: OnFinishContext): void;
    onDeselect(deselectedId: FeatureId): void;
    onSelect(selectedId: FeatureId): void;
    onKeyDown(event: TerraDrawKeyboardEvent): void;
    onKeyUp(event: TerraDrawKeyboardEvent): void;
    undo(): void;
    clearHistory(): void;
    undoSize(): number;
    redoSize(): number;
    redo(): void;
    onMouseMove(event: TerraDrawMouseEvent): void;
    onClick(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;
    protected getHexColorStylingValue(value: HexColor | ((feature: GeoJSONStoreFeatures) => HexColor | undefined) | undefined, defaultValue: HexColor, feature: GeoJSONStoreFeatures): HexColor;
    protected getNumericStylingValue(value: number | ((feature: GeoJSONStoreFeatures) => number | undefined) | undefined, defaultValue: number, feature: GeoJSONStoreFeatures): number;
    protected getUrlStylingValue(value: UrlStyling | undefined, defaultValue: string, feature: GeoJSONStoreFeatures): string;
    private getStylingValue;
}
export declare abstract class TerraDrawBaseSelectMode<Styling extends CustomStyling> extends TerraDrawBaseDrawMode<Styling> {
    type: ModeTypes;
    abstract selectFeature(featureId: FeatureId): void;
    abstract deselectFeature(featureId: FeatureId): void;
}
export {};
