import { BehaviorConfig, TerraDrawModeBehavior } from "./base.behavior";
import { OnChangeContext, HexColor, OnFinishContext, Projection, TerraDrawAdapterStyling, TerraDrawGeoJSONStore, TerraDrawKeyboardEvent, TerraDrawModeRegisterConfig, TerraDrawModeState, TerraDrawMouseEvent, Validation } from "../common";
import { FeatureId, GeoJSONStoreFeatures, StoreChangeHandler } from "../store/store";
export type CustomStyling = Record<string, string | number | ((feature: GeoJSONStoreFeatures) => HexColor) | ((feature: GeoJSONStoreFeatures) => 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 interface PointerEvents {
    leftClick: AllowPointerEvent;
    rightClick: AllowPointerEvent;
    contextMenu: AllowPointerEvent;
    onDragStart: AllowPointerEvent;
    onDrag: AllowPointerEvent;
    onDragEnd: AllowPointerEvent;
}
export type BaseModeOptions<Styling extends CustomStyling> = {
    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 onStyleChange: StoreChangeHandler<OnChangeContext | 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;
    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;
    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;
    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, defaultValue: HexColor, feature: GeoJSONStoreFeatures): HexColor;
    protected getNumericStylingValue(value: number | ((feature: GeoJSONStoreFeatures) => number) | undefined, defaultValue: number, feature: GeoJSONStoreFeatures): number;
    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 {};
