import { RnExecutorchError } from '../errors/errorUtils';
import { LabelEnum, ResourceSource, Triple, Frame, PixelData } from './common';
import { Bbox } from './objectDetection';
/**
 * Raw instance returned from the native C++ side, carrying a numeric
 * `classIndex` instead of a resolved label string.
 * @internal
 */
export interface NativeSegmentedInstance {
    bbox: Bbox;
    mask: Uint8Array;
    maskWidth: number;
    maskHeight: number;
    classIndex: number;
    score: number;
}
/**
 * Represents a single detected instance in instance segmentation output.
 * @typeParam L - The label map type for the model, must conform to {@link LabelEnum}.
 * @category Types
 * @property {Bbox} bbox - The bounding box of the instance.
 * @property {Uint8Array} mask - Binary mask (0 or 1) representing the instance.
 * @property {number} maskWidth - Width of the mask array.
 * @property {number} maskHeight - Height of the mask array.
 * @property {keyof L} label - The class label of the instance.
 * @property {number} score - Confidence score [0, 1].
 */
export interface SegmentedInstance<L extends LabelEnum> {
    bbox: Bbox;
    mask: Uint8Array;
    maskWidth: number;
    maskHeight: number;
    label: keyof L;
    score: number;
}
/**
 * Options for instance segmentation forward pass.
 * @typeParam L - The label map type for the model, must conform to {@link LabelEnum}.
 * @category Types
 */
export interface InstanceSegmentationOptions<L extends LabelEnum> {
    /**
     * Minimum confidence threshold for including instances.
     * Defaults to model's defaultConfidenceThreshold (typically 0.5).
     */
    confidenceThreshold?: number;
    /**
     * IoU threshold for non-maximum suppression.
     * Defaults to model's defaultIouThreshold (typically 0.5).
     */
    iouThreshold?: number;
    /**
     * Maximum number of instances to return. Default: 100
     */
    maxInstances?: number;
    /**
     * Filter to include only specific classes.
     */
    classesOfInterest?: (keyof L)[];
    /**
     * Whether to return masks at original image resolution. Default: true
     */
    returnMaskAtOriginalResolution?: boolean;
    /**
     * Input size for the model (e.g., 384, 512, 640).
     * Must be one of the model's availableInputSizes.
     * Defaults to model's defaultInputSize.
     */
    inputSize?: number;
}
/**
 * Configuration for an instance segmentation model.
 * @typeParam T - The label map type for the model, must conform to {@link LabelEnum}.
 * @category Types
 * @remarks
 * The `availableInputSizes` and `defaultInputSize` fields are mutually inclusive:
 * - **Either both must be provided** (for models with multiple input sizes), or
 * - **Both must be omitted** (for models with a single input size).
 *
 * This discriminated union ensures type safety and prevents partial configuration.
 */
export type InstanceSegmentationConfig<T extends LabelEnum> = {
    labelMap: T;
    preprocessorConfig?: {
        normMean?: Triple<number>;
        normStd?: Triple<number>;
    };
    postprocessorConfig?: {
        applyNMS?: boolean;
    };
    defaultConfidenceThreshold?: number;
    defaultIouThreshold?: number;
} & ({
    availableInputSizes: readonly number[];
    defaultInputSize: number;
} | {
    availableInputSizes?: undefined;
    defaultInputSize?: undefined;
});
/**
 * Per-model config for {@link InstanceSegmentationModule.fromModelName}.
 * Each model name maps to its required fields.
 * @category Types
 */
export type InstanceSegmentationModelSources = {
    modelName: 'yolo26n-seg';
    modelSource: ResourceSource;
} | {
    modelName: 'yolo26s-seg';
    modelSource: ResourceSource;
} | {
    modelName: 'yolo26m-seg';
    modelSource: ResourceSource;
} | {
    modelName: 'yolo26l-seg';
    modelSource: ResourceSource;
} | {
    modelName: 'yolo26x-seg';
    modelSource: ResourceSource;
} | {
    modelName: 'rfdetr-nano-seg';
    modelSource: ResourceSource;
};
/**
 * Union of all built-in instance segmentation model names.
 * @category Types
 */
export type InstanceSegmentationModelName = InstanceSegmentationModelSources['modelName'];
/**
 * Extracts the instance segmentation model name from a {@link InstanceSegmentationModelSources} config object.
 * @category Types
 */
export type InstanceModelNameOf<C extends InstanceSegmentationModelSources> = C['modelName'];
/**
 * Props for the `useInstanceSegmentation` hook.
 * @typeParam C - A {@link InstanceSegmentationModelSources} config specifying which built-in model to load.
 * @property model - The model config containing `modelName` and `modelSource`.
 * @property {boolean} [preventLoad] - Boolean that can prevent automatic model loading (and downloading the data if you load it for the first time) after running the hook.
 * @category Types
 */
export interface InstanceSegmentationProps<C extends InstanceSegmentationModelSources> {
    model: C;
    preventLoad?: boolean;
}
/**
 * Return type for the `useInstanceSegmentation` hook.
 * Manages the state and operations for instance segmentation models.
 * @typeParam L - The label map type for the model, must conform to {@link LabelEnum}.
 * @category Types
 */
export interface InstanceSegmentationType<L extends LabelEnum> {
    /**
     * Contains the error object if the model failed to load, download, or encountered a runtime error during segmentation.
     */
    error: RnExecutorchError | null;
    /**
     * Indicates whether the instance segmentation model is loaded and ready to process images.
     */
    isReady: boolean;
    /**
     * Indicates whether the model is currently processing an image.
     */
    isGenerating: boolean;
    /**
     * Represents the download progress of the model binary as a value between 0 and 1.
     */
    downloadProgress: number;
    /**
     * Executes the model's forward pass to perform instance segmentation on the provided image.
     * @param imageSource - A string (e.g., a file path, URI ) or PixelData representing the image source to be processed.
     * @param options - Optional configuration for the segmentation process.
     * @returns A Promise resolving to an array of {@link SegmentedInstance} objects.
     * @throws {RnExecutorchError} If the model is not loaded or is currently processing another image.
     */
    forward: (imageSource: string | PixelData, options?: InstanceSegmentationOptions<L>) => Promise<SegmentedInstance<L>[]>;
    /**
     * Returns the available input sizes for this model, or undefined if the model accepts single forward input size.
     * @returns An array of available input sizes, or undefined if not constrained.
     */
    getAvailableInputSizes: () => readonly number[] | undefined;
    /**
     * Synchronous worklet function for real-time VisionCamera frame processing.
     * Automatically handles native buffer extraction and cleanup.
     *
     * **Use this for VisionCamera frame processing in worklets.**
     * For async processing, use `forward()` instead.
     *
     * `null` until the model is ready (`isReady: true`). The property itself is
     * `null` when the model has not loaded yet — the function always returns an
     * array (never `null`) once called.
     * @param frame - VisionCamera Frame object
     * @param isFrontCamera - Whether the front camera is active (for mirroring correction).
     * @param options - Optional configuration for the segmentation process.
     * @returns Array of SegmentedInstance objects representing detected items in the frame.
     */
    runOnFrame: ((frame: Frame, isFrontCamera: boolean, options?: InstanceSegmentationOptions<L>) => SegmentedInstance<L>[]) | null;
}
//# sourceMappingURL=instanceSegmentation.d.ts.map