/****************************************************************************
 * Copyright 2021 EPAM Systems
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ***************************************************************************/
import { BaseMonomer, Vec2 } from "../../../../domain/entities";
import type { CoreEditor } from "../../Editor";
import { BaseRenderer } from "../../../render/renderers/BaseRenderer";
import type { BaseTool } from "../Tool";
import type { DrawingEntity } from "../../../../domain/entities/DrawingEntity";
import type { MonomersAlignment } from "../types";
declare type GroupCenterSnapResult = {
    snapPosition: Vec2;
    isVertical: boolean;
    absoluteSnapPosition: Vec2;
    monomerPair: [BaseMonomer, BaseMonomer];
    connectionLength: number;
    showGroupCenterSnapping: true;
};
declare abstract class SelectBase implements BaseTool {
    protected readonly editor: CoreEditor;
    readonly name = "select-tool";
    protected mousePositionAfterMove: Vec2;
    protected mousePositionBeforeMove: Vec2;
    protected selectionStartCanvasPosition: Vec2;
    protected previousSelectedEntities: [number, DrawingEntity][];
    private readonly canvasResizeObserver?;
    private firstMonomerPositionBeforeMove;
    mode: 'moving' | 'selecting' | 'standby' | 'rotating' | 'rotating-center';
    protected rotationStartAngle: number;
    protected rotationCenter: Vec2 | null;
    protected currentRotationAngle: number;
    protected static readonly ROTATION_SNAP_ANGLE = 15;
    protected static readonly ROTATION_ANGLE_EPSILON = 0.001;
    protected rotationStartPositions: Map<number, Vec2>;
    protected userRotationCenter: Vec2 | null;
    private readonly rotationHandleUnsubscribe?;
    private readonly rotationCenterUnsubscribe?;
    private readonly selectEntitiesHandler;
    constructor(editor: CoreEditor);
    private startMoveIfNeeded;
    mousedown(event: MouseEvent): void;
    private getCanvasBbox;
    private buildRotationViewParams;
    protected startRotation(event: MouseEvent | PointerEvent): void;
    protected startRotationCenterDrag(event: MouseEvent | PointerEvent): void;
    protected mousedownEntity(renderer: BaseRenderer, shiftKey?: boolean, modKey?: boolean): void;
    protected onSelectionStart(): void;
    isSelectionRunning(): boolean;
    protected abstract createSelectionView(): void;
    protected abstract updateSelectionViewParams(): void;
    protected abstract onSelectionMove(isShiftPressed: boolean): any;
    static calculateAngleSnap(monomerPositionPlusCursorDelta: Vec2, connectedPosition: Vec2, snapAngle: number, snappedDistance?: number): {
        angleSnapPosition: null;
        snappedAngleRad?: undefined;
    } | {
        angleSnapPosition: Vec2;
        snappedAngleRad: number;
    };
    static calculateBondLengthSnap(cursorPosition: Vec2, connectedPosition: Vec2, snappedAngle: number | undefined): {
        bondLengthSnapPosition: null;
    } | {
        bondLengthSnapPosition: Vec2;
    };
    static needApplyGroupCenterSnapForOneAxis(pointToCheck: number, snappingPoint: number, threshold: number, pointToCheckOnAnotherAxis: number, snappingPointOnAnotherAxis: number, thresholdOnAnotherAxis: any): boolean;
    static calculateGroupCenterSnapPosition(selectedEntities: BaseMonomer[], connectedMonomers: BaseMonomer[], movementDelta: Vec2): GroupCenterSnapResult[];
    static determineAlignment(firstPosition: Vec2, secondPosition: Vec2): MonomersAlignment | null;
    static checkMonomersAlignment(firstMonomer: BaseMonomer, secondMonomer: BaseMonomer, snapAlignment: MonomersAlignment, distance: number): boolean;
    static getNextMonomers(currentMonomer: BaseMonomer, visitedMonomers: Set<number>): (BaseMonomer | undefined)[];
    static findRemainingAlignedMonomers(startingMonomer: BaseMonomer, initialState: BaseMonomer[], alignment: MonomersAlignment, distance: number): BaseMonomer[];
    static calculateSideDistanceSnap(cursorPosition: Vec2, initialMonomer: BaseMonomer, connectedMonomer: BaseMonomer): {
        distanceSnapPosition: null;
        snapDistance?: undefined;
        alignment?: undefined;
        alignedMonomers?: undefined;
    } | {
        snapDistance: number;
        distanceSnapPosition: Vec2;
        alignment: "horizontal" | "vertical";
        alignedMonomers: BaseMonomer[];
    };
    static calculateInBetweenDistanceSnap(cursorPosition: Vec2, initialMonomer: BaseMonomer, firstConnectedMonomer: BaseMonomer, secondConnectedMonomer: BaseMonomer, alignment: MonomersAlignment): {
        distanceSnapPosition: null;
        snapDistance?: undefined;
        alignment?: undefined;
        alignedMonomers?: undefined;
    } | {
        snapDistance: number;
        distanceSnapPosition: Vec2;
        alignment: MonomersAlignment;
        alignedMonomers: BaseMonomer[];
    };
    static calculateDistanceSnap(cursorPosition: Vec2, initialMonomer: BaseMonomer, connectedMonomer: BaseMonomer): {
        distanceSnapPosition: null;
        snapDistance?: undefined;
        alignment?: undefined;
        alignedMonomers?: undefined;
    } | {
        snapDistance: number;
        distanceSnapPosition: Vec2;
        alignment: "horizontal" | "vertical";
        alignedMonomers: BaseMonomer[];
    };
    private tryToSnap;
    mousemove(event: MouseEvent): void;
    mouseup(event: MouseEvent): void;
    mouseOverDrawingEntity(event: any): void;
    mouseLeaveDrawingEntity(event: any): void;
    mouseOverPolymerBond(event: any): void;
    mouseLeavePolymerBond(event: any): void;
    setSelectedEntities(): void;
    protected updateRotationView(): void;
    protected handleRotationMove(event: MouseEvent): void;
    protected finishRotation(): void;
    destroy(): void;
    stopMovement(): void;
}
export { SelectBase };
