import * as L from 'leaflet';
import { TurfHelper } from '../turf-helper';
import { PolygonInformationService } from '../polygon-information.service';
import type { Feature, Polygon, MultiPolygon } from 'geojson';
import type { PolydrawConfig, PolydrawPolygon, HistoryAction } from '../types/polydraw-interfaces';
import { ModeManager } from './mode-manager';
import { EventManager } from './event-manager';
import type { LayerManager } from './layer-manager';
export interface InteractionResult {
    success: boolean;
    featureGroups?: L.FeatureGroup[];
    error?: string;
}
export interface PolygonInteractionManagerDependencies {
    turfHelper: TurfHelper;
    polygonInformation: PolygonInformationService;
    map: L.Map;
    config: PolydrawConfig;
    modeManager: ModeManager;
    eventManager: EventManager;
    saveHistoryState?: (action: HistoryAction) => void;
    layerManager?: LayerManager;
}
/**
 * PolygonInteractionManager handles all interactions with existing polygons.
 * This includes dragging polygons, dragging markers, edge interactions, and popup menus.
 */
export declare class PolygonInteractionManager {
    private markerFeatureGroupMap;
    private polygonFeatureGroupMap;
    private markerModifierHandlers;
    private markerTouchListeners;
    private markerEdgeDeletionListeners;
    private _activeMarker;
    private isDraggingMarker;
    private turfHelper;
    private polygonInformation;
    private map;
    private config;
    private modeManager;
    private eventManager;
    private saveHistoryState?;
    private layerManager?;
    private currentDragPolygon;
    private currentDragIsClone;
    private currentModifierDragMode;
    private isModifierKeyHeld;
    private currentCloneGhost;
    private dragCancelHandlersAttached;
    private _boundDragTouchMove;
    private _boundDragTouchEnd;
    private _boundDragMoveListener;
    private _boundDragEndListener;
    private dragUsesPointerEvents;
    private polygonTouchStartListeners;
    private polygonNativeStartListeners;
    private _openMenuPopup;
    private transformModeActive;
    private transformControllers;
    private transformAuxiliaryDisplayValues;
    private deleteMarkerSuppressUntil;
    private readonly onModeChange;
    /**
     * Strongly typed helper to emit polygon updated events without casts.
     * Also saves history state before emitting (except for drag operations which save on dragstart).
     */
    private emitPolygonUpdated;
    private getHistoryActionForOperation;
    /**
     * True when the polygon in the feature group already has holes, or is a MultiPolygon
     * with more than one outer ring (donut mode only supports simple single-ring polygons).
     */
    private donutTargetHasHoles;
    /**
     * Commit handler for donut mode. Decides inward vs outward via containment, assembles a
     * polygon-with-hole, and emits the updated event. On partial overlap / degenerate scale
     * the polygon is restored unchanged.
     */
    private handleDonutCommit;
    private getFeatureGroups;
    private removeFeatureGroup;
    constructor(dependencies: PolygonInteractionManagerDependencies, featureGroupAccess: {
        getFeatureGroups: () => L.FeatureGroup[];
        addFeatureGroup: (fg: L.FeatureGroup) => void;
        removeFeatureGroup: (fg: L.FeatureGroup) => void;
    });
    dispose(): void;
    private getTimestamp;
    private shouldSuppressDeleteMarkerClick;
    suppressDeleteMarkerClicks(durationMs: number): void;
    /**
     * Add markers to a polygon feature group
     */
    addMarkers(latlngs: L.LatLngLiteral[], featureGroup: L.FeatureGroup, options?: {
        optimizationLevel?: number;
        originalOptimizationLevel?: number;
    }): void;
    /**
     * Add hole markers to a polygon feature group, with configurable special markers.
     */
    addHoleMarkers(latlngs: L.LatLngLiteral[], featureGroup: L.FeatureGroup): void;
    /**
     * Add edge click listeners to a polygon
     */
    addEdgeClickListeners(polygon: L.Polygon, featureGroup: L.FeatureGroup): void;
    /**
     * Check whether polygon dragging is allowed for the current mode.
     */
    private isPolygonDragModeActive;
    private isPolygonDragActive;
    /**
     * Check if a polygon belongs to the active layer.
     * Returns true if no layer manager exists (backward compat) or if in active editable layer.
     */
    private isPolygonInActiveLayer;
    /**
     * Check if a feature group belongs to the active layer.
     * Returns true if no layer manager exists (backward compat).
     */
    private isFeatureGroupInActiveLayer;
    private beginPolygonDrag;
    private attachPolygonNativeStartListeners;
    /**
     * Enable polygon dragging functionality
     */
    enablePolygonDragging(polygon: PolydrawPolygon, latlngs: Feature<Polygon | MultiPolygon>): void;
    /**
     * Update marker draggable state based on current mode
     */
    updateMarkerDraggableState(): void;
    /**
     * Update all markers for edge deletion visual feedback
     */
    updateAllMarkersForEdgeDeletion(showFeedback: boolean): void;
    /**
     * Update individual marker for edge deletion visual feedback
     */
    updateMarkerForEdgeDeletion(marker: L.Marker, showFeedback: boolean): void;
    /**
     * Set modifier key held state
     */
    setModifierKeyHeld(isHeld: boolean): void;
    /**
     * Clean up all resources associated with a marker
     * This method ensures proper cleanup of event listeners and WeakMap entries
     */
    cleanupMarker(marker: L.Marker): void;
    /**
     * Clean up all resources associated with a feature group
     * This method ensures proper cleanup of all markers and associated resources
     */
    cleanupFeatureGroup(featureGroup: L.FeatureGroup): void;
    private destroyTransformController;
    private onEdgeClick;
    private highlightEdgeOnHover;
    private deriveImportantMarkerIndices;
    private normalizeMarkerIndex;
    private latLngEquals;
    private isLatLngLiteral;
    private getOrderedMarkers;
    private countLatLngNodes;
    private rebuildLatLngStructure;
    private getOptimizationMetadataFromFeatureGroup;
    private getFeatureMetadataState;
    private getOptimizationMetadataFromPolygonLayer;
    private getDistanceMeters;
    private findClosestVertexIndex;
    private getToleranceForOptimizationLevel;
    private elbowClicked;
    private markerDrag;
    private markerDragEnd;
    private onPolygonMouseMove;
    private onPolygonMouseUp;
    private onPolygonDragCancel;
    private onPolygonDragKeyDown;
    private onDragTouchMove;
    private onDragTouchEnd;
    private readonly onDragDocumentMove;
    private readonly onDragDocumentEnd;
    private attachDragDocumentListeners;
    private detachDragDocumentListeners;
    private attachDragTouchListeners;
    private detachDragTouchListeners;
    private detachPolygonTouchStart;
    private detachPolygonNativeStartListeners;
    private attachDragCancelHandlers;
    private detachDragCancelHandlers;
    private cancelActivePolygonDrag;
    private offsetPolygonCoordinates;
    private updateMarkersAndHoleLinesDuringDrag;
    private updatePolygonAfterDrag;
    private updatePolygonAfterCloneDrag;
    private showCloneGhost;
    private clearCloneGhost;
    private createPolygonFeatureFromLatLngs;
    private getDragSubtractModifierKey;
    private detectDragSubtractModifierKey;
    private setSubtractVisualMode;
    private updateMarkerColorsForSubtractMode;
    private handleModifierToggleDuringDrag;
    private isModifierDragActive;
    private performModifierSubtract;
    private getEdgeDeletionModifierKey;
    private isEdgeDeletionModifierKeyPressed;
    private registerPolygonLayerMappings;
    private findFeatureGroupForPolygon;
    private onMarkerHoverForEdgeDeletion;
    private onMarkerHoverForEdgeDeletionEvent;
    private onMarkerLeaveForEdgeDeletionEvent;
    private getMarkerIndex;
    private ensureMarkerSeparation;
    private findAlternativeMarkerPosition;
    private createDivIcon;
    private getLatLngInfoString;
    private setMarkerVisibility;
    private setTransformAuxiliaryVisibility;
    private isPolydrawAuxiliaryPolyline;
    private getBuiltInMenuButtonConfigs;
    private getBuiltInMenuButtons;
    private getVisualOptimizationToggleButton;
    private getPolygonMenuActionButtons;
    private shouldShowPolygonMenuActionButton;
    private getPolygonMenuActionClassNames;
    private closeOpenMenuPopup;
    private attachMenuPopupCloseHandler;
    private emitBuiltInPolygonMenuAction;
    private attachBuiltInMenuActionHandler;
    private attachTransformHandler;
    private attachOptimizationToggleHandler;
    private attachCustomPolygonMenuActionHandler;
    private attachMenuButtonHandler;
    private startPolygonTransform;
    private handleTransformControllerResult;
    private getPolygonLayer;
    private attachMenuButtonHandlers;
    private enableMenuButtonPointerEvents;
    private generateMenuMarkerPopup;
    private getMenuActionContext;
    private toggleOptimizationVisibility;
    private getPolygonGeoJSONFromFeatureGroup;
    private getTotalPolygonPerimeter;
    private generateInfoMarkerPopup;
}
//# sourceMappingURL=polygon-interaction-manager.d.ts.map