import type { Prettify, PrivateLoadableFrameData, Rect } from "scandit-web-datacapture-core";
import type { AnyDataCaptureActionMessage as CoreAnyDataCaptureActionMessage, CaptureModeDeserializerInstance, DataCaptureActionMessageKey as CoreDataCaptureActionMessageKey, DataCaptureCallbackMessage as CoreDataCaptureCallbackMessage, DataCaptureCallbackMessageKeys as CoreDataCaptureCallbackMessageKeys, EmscriptenClassHandle, Module as CoreModule, WasmFrameData, WorkerResponse as CoreWorkerResponse } from "scandit-web-datacapture-core/build/js/worker/index";
import type { IdCaptureSettingsJSON } from "../IdCaptureSettings";
import type { CapturedIdCommonFieldsJSON, AamvaBarcodeVerificationResultJSON, AamvaVizBarcodeComparisonResultJSON, CapturedIdJSON, IdCaptureSessionJSON, VizMrzComparisonResultJSON, DrivingLicenseDetailsJSON } from "../SerializedTypes";
import type { ShutterButtonState } from "scandit-web-datacapture-id-private";
/**
 * MESSAGES (ACTIONS) SENT TO THE WORKER
 */
export type DataCaptureActionMessageKey = CoreDataCaptureActionMessageKey | "idCaptureApplySettings" | "idCaptureBarcodeVerifyAamvaCapture" | "idCaptureParse" | "idCaptureReset" | "idCaptureSetLastDetectionIssue" | "idCaptureSetLastError" | "idCaptureSetLastLocalizedId" | "idCaptureSetLastResult" | "idCaptureVerifyAamvaCapture" | "idCaptureVerifyVizMrzCapture" | "idCaptureDrivingLicenseDetailsCreateWithBlinkIdData";
export interface IdCaptureVerifyAamvaCaptureResponse {
    result: AamvaVizBarcodeComparisonResultJSON | null;
}
export interface IdCaptureParseResponse {
    result: ParseResult | null;
}
export interface IdCaptureDrivingLicenseDetailsCreateWithBlinkIdDataResponse {
    result: DrivingLicenseDetailsJSON;
}
export interface IdCaptureVerifyVizMrzCaptureResponse {
    result: VizMrzComparisonResultJSON | null;
}
export interface IdCaptureBarcodeVerifyAamvaCaptureResponse {
    result: AamvaBarcodeVerificationResultJSON & {
        error: string;
        serverResponseJSON: string;
        isSuccess: boolean;
    };
}
export type WorkerResponse<C extends DataCaptureActionMessageKey> = C extends "idCaptureVerifyAamvaCapture" ? IdCaptureVerifyAamvaCaptureResponse : C extends "idCaptureBarcodeVerifyAamvaCapture" ? IdCaptureBarcodeVerifyAamvaCaptureResponse : C extends "idCaptureVerifyVizMrzCapture" ? IdCaptureVerifyVizMrzCaptureResponse : C extends "idCaptureParse" ? IdCaptureParseResponse : C extends "idCaptureDrivingLicenseDetailsCreateWithBlinkIdData" ? IdCaptureDrivingLicenseDetailsCreateWithBlinkIdDataResponse : CoreWorkerResponse<C>;
interface DataCaptureActionMessage {
    command: DataCaptureActionMessageKey;
    id: number;
}
export interface IdCaptureSetLastResultDataCaptureAction extends DataCaptureActionMessage {
    command: "idCaptureSetLastResult";
    result: string;
}
export interface IdCaptureSetLastErrorDataCaptureAction extends DataCaptureActionMessage {
    command: "idCaptureSetLastError";
    error: string;
}
export interface IdCaptureSetLastLocalizedIdDataCaptureAction extends DataCaptureActionMessage {
    command: "idCaptureSetLastLocalizedId";
    localizedId: string;
}
export interface IdCaptureSetLastDetectionIssueDataCaptureAction extends DataCaptureActionMessage {
    command: "idCaptureSetLastDetectionIssue";
    issue: string;
}
export interface IdCaptureResetDataCaptureAction extends DataCaptureActionMessage {
    command: "idCaptureReset";
}
export interface IdCaptureApplySettingsDataCaptureAction extends DataCaptureActionMessage {
    command: "idCaptureApplySettings";
    settings: IdCaptureSettingsJSON;
}
export interface IdCaptureParseDataCaptureAction extends DataCaptureActionMessage {
    command: "idCaptureParse";
    code: string;
}
export interface IdCaptureVerifyAamvaCaptureDataCaptureAction extends DataCaptureActionMessage {
    command: "idCaptureVerifyAamvaCapture";
    capturedId: CapturedIdJSON;
}
export interface IdCaptureVerifyVizMrzCaptureDataCaptureAction extends DataCaptureActionMessage {
    command: "idCaptureVerifyVizMrzCapture";
    capturedId: CapturedIdJSON;
}
export interface IdCaptureBarcodeVerifyAamvaCaptureDataCaptureAction extends DataCaptureActionMessage {
    command: "idCaptureBarcodeVerifyAamvaCapture";
    capturedId: CapturedIdJSON;
    endpoint: string | null;
}
export interface IdCaptureDrivingLicenseDetailsCreateWithBlinkIdDataDataCaptureAction extends DataCaptureActionMessage {
    command: "idCaptureDrivingLicenseDetailsCreateWithBlinkIdData";
    details: {
        vehicleClass: string;
        restrictions: string;
        endorsements: string;
    };
}
export type AnyDataCaptureActionMessage = CoreAnyDataCaptureActionMessage | IdCaptureApplySettingsDataCaptureAction | IdCaptureBarcodeVerifyAamvaCaptureDataCaptureAction | IdCaptureParseDataCaptureAction | IdCaptureResetDataCaptureAction | IdCaptureSetLastDetectionIssueDataCaptureAction | IdCaptureSetLastErrorDataCaptureAction | IdCaptureSetLastLocalizedIdDataCaptureAction | IdCaptureSetLastResultDataCaptureAction | IdCaptureVerifyAamvaCaptureDataCaptureAction | IdCaptureVerifyVizMrzCaptureDataCaptureAction | IdCaptureDrivingLicenseDetailsCreateWithBlinkIdDataDataCaptureAction;
export type MessagePayloadByCommand = {
    [key in AnyDataCaptureActionMessage["command"]]: Prettify<Omit<Extract<AnyDataCaptureActionMessage, {
        command: key;
    }>, "command" | "id">>;
};
export type WorkerCall = <C extends keyof MessagePayloadByCommand>(command: C, payload: Prettify<MessagePayloadByCommand[C]>) => Promise<WorkerResponse<C>>;
/**
 * MESSAGES EMITTED BY THE WORKER
 */
type DataCaptureCallbackMessageKeys = CoreDataCaptureCallbackMessageKeys | "idCaptureBackendReset" | "idCaptureDetectionOnlyMode" | "idCaptureDidCaptureId" | "idCaptureDidLocalizeId" | "idCaptureDidRejectId" | "idCaptureDidShutterButtonPositionChanged" | "idCaptureDidShutterButtonStateChanged" | "idCaptureDidTimedOut" | "idCaptureDidUpdateSession" | "idCaptureIdCapturedFeedback" | "idCaptureIdCaptureTimeoutFeedback" | "idCaptureIdRejectedFeedback" | "IdCaptureProcessFrameWithCentaurus";
interface BaseDataCaptureCallbackMessage {
    type: DataCaptureCallbackMessageKeys;
}
interface IdCaptureDidCapture extends BaseDataCaptureCallbackMessage {
    type: "idCaptureDidCaptureId";
    payload: {
        session: IdCaptureSessionJSON;
        frameData: PrivateLoadableFrameData;
    };
}
interface IdCaptureDidUpdateSession extends BaseDataCaptureCallbackMessage {
    type: "idCaptureDidUpdateSession";
    payload: {
        session: IdCaptureSessionJSON;
        frameData: PrivateLoadableFrameData;
    };
}
interface IdCaptureDidReject extends BaseDataCaptureCallbackMessage {
    type: "idCaptureDidRejectId";
    payload: {
        session: IdCaptureSessionJSON;
        frameData: PrivateLoadableFrameData;
    };
}
interface IdCaptureDidLocalizeId extends BaseDataCaptureCallbackMessage {
    type: "idCaptureDidLocalizeId";
    payload: {
        session: IdCaptureSessionJSON;
        frameData: PrivateLoadableFrameData;
    };
}
interface IdCaptureDidTimedOut extends BaseDataCaptureCallbackMessage {
    type: "idCaptureDidTimedOut";
    payload: {
        session: IdCaptureSessionJSON;
        frameData: PrivateLoadableFrameData;
    };
}
interface IdCaptureDidShutterButtonPositionChanged extends BaseDataCaptureCallbackMessage {
    type: "idCaptureDidShutterButtonPositionChanged";
    payload: {
        position: Rect;
    };
}
interface IdCaptureDidShutterButtonStateChanged extends BaseDataCaptureCallbackMessage {
    type: "idCaptureDidShutterButtonStateChanged";
    payload: {
        state: ShutterButtonState;
    };
}
interface IdCaptureIdCapturedFeedback extends BaseDataCaptureCallbackMessage {
    type: "idCaptureIdCapturedFeedback";
}
interface IdCaptureIdRejectedFeedback extends BaseDataCaptureCallbackMessage {
    type: "idCaptureIdRejectedFeedback";
}
interface IdCaptureIdCaptureTimeoutFeedback extends BaseDataCaptureCallbackMessage {
    type: "idCaptureIdCaptureTimeoutFeedback";
}
interface IdCaptureBackendReset extends BaseDataCaptureCallbackMessage {
    type: "idCaptureBackendReset";
}
interface IdCaptureDetectionOnlyMode extends BaseDataCaptureCallbackMessage {
    type: "idCaptureDetectionOnlyMode";
    payload: {
        detectionOnlyMode: boolean;
    };
}
export type DataCaptureCallbackMessage = CoreDataCaptureCallbackMessage | IdCaptureBackendReset | IdCaptureDetectionOnlyMode | IdCaptureDidCapture | IdCaptureDidLocalizeId | IdCaptureDidReject | IdCaptureDidShutterButtonPositionChanged | IdCaptureDidShutterButtonStateChanged | IdCaptureDidTimedOut | IdCaptureDidUpdateSession | IdCaptureIdCapturedFeedback | IdCaptureIdCaptureTimeoutFeedback | IdCaptureIdRejectedFeedback;
export type CapturedIdJSONWithoutCommonFieldsJSON = Omit<CapturedIdJSON, keyof CapturedIdCommonFieldsJSON>;
export type ParseResult = {
    status: "success";
    capturedId: CapturedIdJSON;
} | {
    status: "error";
    error: string;
};
/**
 * OTHERS
 */
export type PayloadForCommand<A, C> = A extends {
    command: C;
} ? A : never;
export interface DataCaptureWorker extends Omit<Worker, "postMessage"> {
    onmessage: ((this: Worker, event_: MessageEvent & {
        data: unknown;
    }) => void) | null;
    postMessage: <C extends AnyDataCaptureActionMessage["command"]>(message: PayloadForCommand<AnyDataCaptureActionMessage, C>, transfer?: Transferable[]) => void;
}
export declare enum IdCaptureBackendErrorType {
    Undefined = "Undefined",
    InitializationError = "InitializationError",
    ParsingError = "ParsingError"
}
export interface IdCaptureBackendError {
    type: IdCaptureBackendErrorType;
    message: string;
}
export interface CapturedIdCommonFieldsGetters extends Pick<EmscriptenClassHandle, "delete"> {
    getFirstName: () => OptionalValueHolder<string>;
    getLastName: () => OptionalValueHolder<string>;
    getSecondaryLastName: () => OptionalValueHolder<string>;
    getFullName: () => string;
    getSex: () => OptionalValueHolder<string>;
    getAge: () => OptionalValueHolder<number | null>;
    isExpired: () => OptionalValueHolder<boolean | null>;
    getNationality: () => OptionalValueHolder<string>;
    getAddress: () => OptionalValueHolder<string>;
    getIssuingCountry: () => OptionalValueHolder<string>;
    getIssuingCountryIso: () => OptionalValueHolder<string>;
    getDocumentNumber: () => OptionalValueHolder<string>;
    getDocumentAdditionalNumber: () => OptionalValueHolder<string>;
    getDateOfBirth: () => OptionalValueHolder<string>;
    getDateOfExpiry: () => OptionalValueHolder<string>;
    getDateOfIssue: () => OptionalValueHolder<string>;
    getDocumentType: () => string;
}
interface ResultOk<T> {
    ok: () => true;
    value: () => T;
}
interface ResultFail<E> {
    ok: () => false;
    error: () => E;
}
export type FailableResult<T, E> = ResultFail<E> | ResultOk<T>;
interface HasValueHolder<T> {
    has_value: () => true;
    value: () => T;
}
interface HasNoValueHolder {
    has_value: () => false;
}
export type OptionalValueHolder<T> = HasNoValueHolder | HasValueHolder<T>;
export interface IdCaptureSessionHolder {
    getCapturedId: () => OptionalValueHolder<CapturedIdCommonFieldsGetters>;
    getLocalizedOnlyId: () => OptionalValueHolder<string>;
    getNewlyRejectedId: () => OptionalValueHolder<string>;
    toJson: () => string;
}
export interface CapturedIdHolder extends CapturedIdCommonFieldsGetters {
    toJson: () => string;
}
export interface SDCIdCaptureMode extends EmscriptenClassHandle {
    reset: () => void;
    applySettings: (settings: string) => void;
    addListener: (listener: unknown) => void;
    setFeedbacks: (idCaptured: unknown, idRejected: unknown, idCaptureTimeout: unknown) => void;
    parse: (code: string) => FailableResult<CapturedIdHolder | null, string>;
}
interface BarcodeVerificationResponse {
    isSuccess: boolean;
    allChecksPassed: boolean;
    error: string;
    serverResponseJson: string;
}
interface IdCaptureModule {
    IdCaptureDeserializer: new (helper: unknown) => CaptureModeDeserializerInstance;
    IdCaptureListener: {
        extend: (target: "IdCaptureListener", parameters: {
            onSessionUpdated: (idCapture: unknown, session: IdCaptureSessionHolder, frameData: WasmFrameData) => void;
            onIdCaptured: (idCapture: unknown, session: IdCaptureSessionHolder, frameData: WasmFrameData) => void;
            onIdLocalized: (idCapture: unknown, session: IdCaptureSessionHolder, frameData: WasmFrameData) => void;
            onIdRejected: (idCapture: unknown, session: IdCaptureSessionHolder, frameData: WasmFrameData) => void;
            onIdCaptureTimedOut: (idCapture: unknown, session: IdCaptureSessionHolder, frameData: WasmFrameData) => void;
            onShutterButtonPositionChanged: (position: string) => void;
            onShutterButtonStateChanged: (state: string) => void;
        }) => new () => EmscriptenClassHandle;
    };
    IdCaptureDeserializerListener: {
        extend: (target: "IdCaptureDeserializerListener", parameters: {
            onModeDeserializationStarted: (deserializer: unknown, mode: SDCIdCaptureMode, json: unknown) => void;
            onModeDeserializationFinished: (deserializer: unknown, mode: SDCIdCaptureMode, json: unknown) => void;
            onSettingsDeserializationStarted: (deserializer: unknown, settings: unknown, json: unknown) => void;
            onSettingsDeserializationFinished: (deserializer: unknown, settings: unknown, json: unknown) => void;
        }) => new () => EmscriptenClassHandle;
    };
    IdCaptureBackend: {
        extend: (target: "IdCaptureBackend", parameters: {
            getLastError: () => string;
            getLastResult: () => string;
            getLocalizedOnlyId: () => string;
            getLastIssue: () => string;
            processFrame: (data: Uint8ClampedArray, width: number, height: number, format: unknown) => void;
            reset: () => void;
            setDetectionOnlyMode: (detectionOnly: boolean) => void;
        }) => new () => {
            delete: () => void;
        };
    };
    IdCaptureDeserializerHelper: {
        extend: (target: "IdCaptureDeserializerHelper", parameters: {
            createMode: (context: unknown, settings: unknown) => SDCIdCaptureMode;
        }) => new () => EmscriptenClassHandle;
    };
    IdCapture: new (context: unknown, idCaptureBackend: unknown, settings: unknown, idCaptureImageHighlighter: unknown) => SDCIdCaptureMode;
    AamvaVizBarcodeComparisonVerifier: new () => {
        verify: (capturedId: string) => {
            toJson: () => string;
        };
    };
    VizMrzComparisonVerifier: new (context: unknown) => {
        verify: (capturedId: string) => {
            toJson: () => string;
        };
    };
    AamvaBarcodeVerifier: {
        extend: (target: "AamvaBarcodeVerifier", parameters: {
            verificationEnded: () => void;
            retriggerVerificationIn: (timeInMilliseconds: number) => void;
        }) => new () => EmscriptenClassHandle & {
            initialize: (context: unknown, endpoint: string) => void;
            startVerification: (capturedId: string) => void;
            getBarcodeVerificationResponse: () => BarcodeVerificationResponse;
        };
    };
    DrivingLicenseDetails: {
        createWithBlinkIdData: (vehicleClass: string, restrictions: string, endorsements: string) => string;
    };
}
export interface Module extends CoreModule, IdCaptureModule {
}
export declare function getValueFromFailable<T, E, U>(holder: FailableResult<T, E>, defaultValue: U): T | U;
export declare function getErrorFromFailable<T, E, U>(holder: FailableResult<T, E>, defaultValue: U): E | U;
export declare function getValueFromOptional<T, U>(holder: OptionalValueHolder<T>, defaultValue: U): T | U;
export type EngineWorkerResponse<C extends DataCaptureActionMessageKey> = WorkerResponse<C> extends Promise<void> | void ? Promise<void> | void : {
    payload: WorkerResponse<C>;
    transferables?: Transferable[];
};
export type AugmentedWorker = Worker & {
    Module: Module;
    OffscreenCanvas: new (w: number, h: number) => OffscreenCanvas;
};
export {};
