import type { Image } from 'react-native-nitro-image';
import type { HybridView, HybridViewMethods, HybridViewProps } from 'react-native-nitro-modules';
import type { Point } from '../common-types/Point';
import type { GestureController } from '../gestures/GestureController.nitro';
import type { ScannedObject } from '../instances/ScannedObject.nitro';
import type { MeteringPoint } from '../metering/MeteringPoint.nitro';
import type { CameraPreviewOutput } from '../outputs/CameraPreviewOutput.nitro';
/**
 * Represents the implementation mode for the {@linkcode PreviewView}'s
 * surface on Android.
 * - `'performance'`: Uses [`SurfaceView`](https://developer.android.com/reference/android/view/SurfaceView) for better GPU-accelerated performance.
 * - `'compatible'`: Uses [`TextureView`](https://developer.android.com/reference/android/view/TextureView) for better compatibility and transforms support.
 *
 * @note `'performance'` does not support transparency or view layering.
 * @see See [CameraX: `PreviewView.setImplementationMode(...)`](https://developer.android.com/reference/androidx/camera/view/PreviewView#setImplementationMode(androidx.camera.view.PreviewView.ImplementationMode)) for more information
 * @platform Android
 */
export type PreviewImplementationMode = 'performance' | 'compatible';
/**
 * Represents the resize mode for the {@linkcode PreviewView}.
 * - `'cover'`: Upscales the {@linkcode PreviewView} to cover up the entire view and leave no blank space, possibly performing a center-crop transform
 * to make up for aspect ratio differences.
 * - `'contain'`: Centers the {@linkcode PreviewView} inside the view, possibly leaving blank space around the top/bottom, or left/right edges to
 * make up for aspect ratio differences.
 */
export type PreviewResizeMode = 'cover' | 'contain';
export interface PreviewViewProps extends HybridViewProps {
    /**
     * Sets the {@linkcode CameraPreviewOutput} for the {@linkcode PreviewView}.
     *
     * The {@linkcode CameraPreviewOutput} can be connected to a
     * {@linkcode CameraSession} to start in parallel, possibly
     * even before the {@linkcode PreviewView} is mounted/visible.
     */
    previewOutput?: CameraPreviewOutput;
    /**
     * Sets the {@linkcode PreviewResizeMode} for the {@linkcode PreviewView}.
     *
     * @default 'cover'
     */
    resizeMode?: PreviewResizeMode;
    /**
     * Sets the {@linkcode PreviewImplementationMode} for the {@linkcode PreviewView}.
     *
     * @platform Android
     * @default 'performance'
     */
    implementationMode?: PreviewImplementationMode;
    /**
     * Attaches the given {@linkcode GestureController}s on this {@linkcode PreviewView}.
     *
     * For example, a {@linkcode ZoomGestureController} can be attached to
     * install a native pinch-to-zoom gesture.
     */
    gestureControllers?: GestureController[];
    /**
     * Fires when the {@linkcode PreviewView} started.
     */
    onPreviewStarted?: () => void;
    /**
     * Fires when the {@linkcode PreviewView} stopped.
     */
    onPreviewStopped?: () => void;
}
export interface PreviewViewMethods extends HybridViewMethods {
    /**
     * Creates a {@linkcode MeteringPoint} that can be used for
     * focusing AE/AF/AWB on the Camera via {@linkcode CameraController.focusTo | focusTo(...)}.
     *
     * The coordinates ({@linkcode viewX}, {@linkcode viewY}) are relative to this
     * {@linkcode PreviewView}, and take orientation, scaling and cropping
     * into account.
     * @param viewX The X coordinate within the View's coordinate system.
     * This can be the `x` value of a tap event on the {@linkcode PreviewView}.
     * @param viewY The Y coordinate within the View's coordinate system.
     * This can be the `y` value of a tap event on the {@linkcode PreviewView}.
     * @param size (Optional) The size of the {@linkcode MeteringPoint} within
     * the View's coordinate system.
     *
     * @throws If the {@linkcode PreviewView} isn't ready yet.
     */
    createMeteringPoint(viewX: number, viewY: number, size?: number): MeteringPoint;
    /**
     * Take a snapshot of the current {@linkcode PreviewView}'s
     * contents, and return it as an {@linkcode Image}.
     *
     * @throws If the {@linkcode PreviewView} isn't ready yet.
     * @throws If the {@linkcode PreviewView} doesn't have snapshottable contents.
     * @throws If the {@linkcode PreviewView} doesn't support snapshots.
     * @platform Android
     */
    takeSnapshot(): Promise<Image>;
    /**
     * Converts the given {@linkcode cameraPoint} in
     * camera sensor coordinates into a {@linkcode Point}
     * in view coordinates, relative to this {@linkcode PreviewView}.
     *
     * @note Camera sensor coordinates are not necessarily normalized from `0.0` to `1.0`. Some implementations may have a different opaque coordinate system.
     * @throws If the {@linkcode PreviewView} isn't ready yet.
     * @example
     * ```ts
     * const cameraPoint = { x: 0.5, y: 0.5 }
     * const viewPoint = previewView.convertCameraPointToViewPoint(cameraPoint)
     * console.log(viewPoint) // { x: 196, y: 379.5 }
     * ```
     */
    convertCameraPointToViewPoint(cameraPoint: Point): Point;
    /**
     * Converts the given {@linkcode viewPoint} in
     * view coordinates relative to this {@linkcode PreviewView}
     * into a {@linkcode Point} in camera sensor coordinates.
     *
     * @note Camera sensor coordinates are not necessarily normalized from `0.0` to `1.0`. Some implementations may have a different opaque coordinate system.
     * @throws If the {@linkcode PreviewView} isn't ready yet.
     * @example
     * ```ts
     * const viewPoint = { x: 196, y: 379.5 }
     * const cameraPoint = previewView.convertViewPointToCameraPoint(viewPoint)
     * console.log(cameraPoint) // { x: 0.5, y: 0.5 }
     * ```
     */
    convertViewPointToCameraPoint(viewPoint: Point): Point;
    /**
     * Returns a new {@linkcode ScannedObject} where all coordinates
     * in the given {@linkcode scannedObject} are converted into
     * view coordinates.
     * @param scannedObject The scanned object in its original coordinates.
     * @platform iOS
     */
    convertScannedObjectCoordinatesToViewCoordinates(scannedObject: ScannedObject): ScannedObject;
}
/**
 * The {@linkcode PreviewView} Hybrid View.
 *
 * A {@linkcode PreviewView} can be rendered via the
 * {@linkcode NativePreviewView} component, or by
 * using the higher-level {@linkcode Camera} component.
 *
 * @see {@linkcode PreviewViewProps}
 * @see {@linkcode PreviewViewMethods}
 * @see {@linkcode NativePreviewView}
 */
export type PreviewView = HybridView<PreviewViewProps, PreviewViewMethods>;
