import type { PointerEvent as ReactPointerEvent } from 'react';
import type { CropperRef } from 'react-advanced-cropper';
import { type RightAngleRotation, type TransformRect } from '@riverbankcms/media-core';
import { type ImageHotspot } from './cropGeometry';
type ImageCropperDebugLogger = (message: string, details?: Record<string, unknown>) => void;
type UseImageCropperControllerInput = {
    imageUrl: string;
    aspect?: number;
    minSourceWidth?: number;
    minSourceHeight?: number;
    initialRect?: TransformRect | null;
    initialHotspot?: ImageHotspot | null;
    initialRotation?: 0 | 90 | 180 | 270 | null;
    onChange?: (rect: TransformRect | undefined) => void;
    onHotspotChange?: (hotspot: ImageHotspot | undefined) => void;
    onRotationChange?: (rotation: 0 | 90 | 180 | 270 | undefined) => void;
    debugLog: ImageCropperDebugLogger;
};
type UseImageCropperControllerResult = {
    mode: 'crop' | 'hotspot';
    setMode: React.Dispatch<React.SetStateAction<'crop' | 'hotspot'>>;
    cropperRef: React.RefObject<CropperRef | null>;
    canResetCrop: boolean;
    rotation: RightAngleRotation;
    canResetRotation: boolean;
    rotateLeft: () => void;
    rotateRight: () => void;
    resetRotation: () => void;
    hotspot: ImageHotspot | undefined;
    canResetHotspot: boolean;
    setHotspot: React.Dispatch<React.SetStateAction<ImageHotspot | undefined>>;
    minWidth?: number;
    minHeight?: number;
    outputImageSize?: {
        width: number;
        height: number;
    };
    cropConstraintMessage?: string;
    handleCropChange: (cropper: CropperRef) => void;
    handleHotspotPointer: (event: ReactPointerEvent<HTMLDivElement>) => void;
    resetCrop: () => void;
};
export declare function useImageCropperController({ imageUrl, aspect, minSourceWidth, minSourceHeight, initialRect, initialHotspot, initialRotation, onChange, onHotspotChange, onRotationChange, debugLog, }: UseImageCropperControllerInput): UseImageCropperControllerResult;
export {};
