import type { Prettify, Rect } from "@scandit/web-datacapture-core";
import type { CaptureModeDeserializerInstance, AnyDataCaptureActionMessage as CoreAnyDataCaptureActionMessage, DataCaptureActionMessageKey as CoreDataCaptureActionMessageKey, DataCaptureCallbackMessage as CoreDataCaptureCallbackMessage, DataCaptureCallbackMessageKeys as CoreDataCaptureCallbackMessageKeys, Module as CoreModule, WorkerResponse as CoreWorkerResponse, EmscriptenClassHandle } from "@scandit/web-datacapture-core/build/js/worker/index";
import type { IdCaptureSettingsJSON } from "../IdCaptureSettings";
import type { AamvaBarcodeVerificationResultJSON, CapturedIdCommonFieldsJSON, CapturedIdJSON, CapturedIdJSONWithRawImageInfo, CentaurusSettingsJSON, DataConsistencyResultJSON, DrivingLicenseDetailsJSON, LocalizedOnlyIdJSON } from "../SerializedTypes";
import type { ShutterButtonState } from "scandit-web-datacapture-id-private";
import type { SafariOOMEventData } from "../safariOOMDetection/types";
/**
 * MESSAGES (ACTIONS) SENT TO THE WORKER
 */
export type DataCaptureActionMessageKey = CoreDataCaptureActionMessageKey | "idCaptureApplySettings" | "idCaptureBarcodeVerifyAamvaCapture" | "idCaptureDataConsistencyVerifyCapture" | "idCaptureGetCentaurusSettings" | "idCaptureParse" | "idCaptureReset" | "idCaptureSetLastDetectionIssue" | "idCaptureSetLastError" | "idCaptureSetLastLocalizedId" | "idCaptureSetLastResult" | "idCaptureDrivingLicenseDetailsCreateWithCentaurusData" | "getIdOpenSourceSoftwareLicenseInfo" | "idCaptureReportSafariAbruptReload" | "idCaptureDispose" | "idCaptureSetExternalTransactionId" | "idCaptureGetExternalTransactionId";
export interface IdCaptureParseResponse {
    result: ParseResult | null;
}
export interface IdCaptureDrivingLicenseDetailsCreateWithCentaurusDataResponse {
    result: DrivingLicenseDetailsJSON;
}
export interface IdCaptureBarcodeVerifyAamvaCaptureResponse {
    result: AamvaBarcodeVerificationResultJSON | null;
}
export interface IdCaptureDataConsistencyVerifyCaptureResponse {
    result: DataConsistencyResultJSON | null;
}
export interface IdCaptureGetCentaurusSettingsResponse {
    result: CentaurusSettingsJSON;
}
export interface GetIdOpenSourceSoftwareLicenseInfoResponse {
    licenseText: string;
}
export interface IdCaptureGetExternalTransactionIdResponse {
    transactionId: string | null;
}
export type WorkerResponse<C extends DataCaptureActionMessageKey> = C extends "idCaptureBarcodeVerifyAamvaCapture" ? IdCaptureBarcodeVerifyAamvaCaptureResponse : C extends "idCaptureDataConsistencyVerifyCapture" ? IdCaptureDataConsistencyVerifyCaptureResponse : C extends "idCaptureGetCentaurusSettings" ? IdCaptureGetCentaurusSettingsResponse : C extends "idCaptureParse" ? IdCaptureParseResponse : C extends "idCaptureDrivingLicenseDetailsCreateWithCentaurusData" ? IdCaptureDrivingLicenseDetailsCreateWithCentaurusDataResponse : C extends "getIdOpenSourceSoftwareLicenseInfo" ? GetIdOpenSourceSoftwareLicenseInfoResponse : C extends "idCaptureGetExternalTransactionId" ? IdCaptureGetExternalTransactionIdResponse : 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 IdCaptureGetCentaurusSettingsDataCaptureAction extends DataCaptureActionMessage {
    command: "idCaptureGetCentaurusSettings";
}
export interface IdCaptureDataConsistencyVerifyCaptureDataCaptureAction extends DataCaptureActionMessage {
    command: "idCaptureDataConsistencyVerifyCapture";
    capturedId: CapturedIdJSON;
}
export interface IdCaptureBarcodeVerifyAamvaCaptureDataCaptureAction extends DataCaptureActionMessage {
    command: "idCaptureBarcodeVerifyAamvaCapture";
    capturedId: CapturedIdJSON;
    endpoint: string | null;
}
export interface IdCaptureDrivingLicenseDetailsCreateWithCentaurusDataDataCaptureAction extends DataCaptureActionMessage {
    command: "idCaptureDrivingLicenseDetailsCreateWithCentaurusData";
    details: {
        vehicleClass: string;
        restrictions: string;
        endorsements: string;
    };
}
export interface GetIdOpenSourceSoftwareLicenseInfoAction extends DataCaptureActionMessage {
    command: "getIdOpenSourceSoftwareLicenseInfo";
}
export interface IdCaptureReportSafariAbruptReloadAction extends DataCaptureActionMessage {
    command: "idCaptureReportSafariAbruptReload";
    environmentData: SafariOOMEventData;
}
export interface IdCaptureDisposeAction extends DataCaptureActionMessage {
    command: "idCaptureDispose";
}
export interface IdCaptureSetExternalTransactionIdAction extends DataCaptureActionMessage {
    command: "idCaptureSetExternalTransactionId";
    transactionId: string | null;
}
export interface IdCaptureGetExternalTransactionIdAction extends DataCaptureActionMessage {
    command: "idCaptureGetExternalTransactionId";
}
export type AnyDataCaptureActionMessage = CoreAnyDataCaptureActionMessage | IdCaptureApplySettingsDataCaptureAction | IdCaptureBarcodeVerifyAamvaCaptureDataCaptureAction | IdCaptureDataConsistencyVerifyCaptureDataCaptureAction | IdCaptureGetCentaurusSettingsDataCaptureAction | IdCaptureParseDataCaptureAction | IdCaptureResetDataCaptureAction | IdCaptureSetLastDetectionIssueDataCaptureAction | IdCaptureSetLastErrorDataCaptureAction | IdCaptureSetLastLocalizedIdDataCaptureAction | IdCaptureSetLastResultDataCaptureAction | IdCaptureDrivingLicenseDetailsCreateWithCentaurusDataDataCaptureAction | GetIdOpenSourceSoftwareLicenseInfoAction | IdCaptureReportSafariAbruptReloadAction | IdCaptureDisposeAction | IdCaptureSetExternalTransactionIdAction | IdCaptureGetExternalTransactionIdAction;
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" | "idCaptureDidPartiallyCaptureId" | "idCaptureDidLocalizeId" | "idCaptureDidRejectId" | "idCaptureDidLocalizeId" | "idCaptureDidShutterButtonPositionChanged" | "idCaptureDidShutterButtonStateChanged" | "idCaptureDidTimedOut" | "idCaptureDidUpdateSession" | "idCaptureIdCapturedFeedback" | "idCaptureIdRejectedFeedback" | "IdCaptureProcessFrameWithCentaurus";
interface BaseDataCaptureCallbackMessage {
    type: DataCaptureCallbackMessageKeys;
}
interface IdCaptureDidCapture extends BaseDataCaptureCallbackMessage {
    type: "idCaptureDidCaptureId";
    payload: {
        capturedId: CapturedIdJSONWithRawImageInfo;
    };
}
interface IdCaptureDidPartiallyCapture extends BaseDataCaptureCallbackMessage {
    type: "idCaptureDidPartiallyCaptureId";
    payload: {
        capturedId: CapturedIdJSONWithRawImageInfo;
    };
}
interface IdCaptureDidReject extends BaseDataCaptureCallbackMessage {
    type: "idCaptureDidRejectId";
    payload: {
        capturedId: CapturedIdJSONWithRawImageInfo | null;
        rejectionReason: string;
    };
}
interface IdCaptureDidLocalize extends BaseDataCaptureCallbackMessage {
    type: "idCaptureDidLocalizeId";
    payload: {
        localization: LocalizedOnlyIdJSON;
    };
}
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 IdCaptureBackendReset extends BaseDataCaptureCallbackMessage {
    type: "idCaptureBackendReset";
}
interface IdCaptureDetectionOnlyMode extends BaseDataCaptureCallbackMessage {
    type: "idCaptureDetectionOnlyMode";
    payload: {
        detectionOnlyMode: boolean;
    };
}
export type DataCaptureCallbackMessage = CoreDataCaptureCallbackMessage | IdCaptureBackendReset | IdCaptureDetectionOnlyMode | IdCaptureDidCapture | IdCaptureDidPartiallyCapture | IdCaptureDidReject | IdCaptureDidLocalize | IdCaptureDidShutterButtonPositionChanged | IdCaptureDidShutterButtonStateChanged | IdCaptureIdCapturedFeedback | IdCaptureIdRejectedFeedback;
export type CapturedIdJSONWithoutCommonFieldsJSON = Omit<CapturedIdJSON, keyof CapturedIdCommonFieldsJSON>;
export type ParseResult = {
    status: "success";
    capturedId: CapturedIdJSONWithRawImageInfo;
} | {
    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: () => string | undefined;
    getLastName: () => string | undefined;
    getSecondaryLastName: () => string | undefined;
    getFullName: () => string;
    getSex: () => string | undefined;
    getAge: () => number | undefined;
    isExpired: () => boolean | undefined;
    getNationality: () => string | undefined;
    getAddress: () => string | undefined;
    getIssuingCountry: () => string | undefined;
    getIssuingCountryIso: () => string | undefined;
    getDocumentNumber: () => string | undefined;
    getDocumentAdditionalNumber: () => string | undefined;
    getDateOfBirth: () => string | undefined;
    getDateOfExpiry: () => string | undefined;
    getDateOfIssue: () => string | undefined;
    getDocumentType: () => string | undefined;
    getDocumentSubtype: () => string | undefined;
    toJson: () => string;
}
interface CapturedIdImages extends EmscriptenClassHandle {
    getFace: () => string | undefined;
    getFrameFront: () => WasmFrameData | null;
    getFrameBack: () => WasmFrameData | null;
    getCroppedDocumentFront: () => string | undefined;
    getCroppedDocumentBack: () => string | undefined;
}
export interface WasmFrameData extends EmscriptenClassHandle {
    getFrameData: () => Uint8Array;
    getWidth: () => number;
    getHeight: () => number;
    getMirrorAxis: () => {
        value: number;
    };
    getOrientation: () => number;
}
export interface WasmCaptureId extends CapturedIdCommonFieldsGetters {
    toJson: () => string;
    getImages: () => CapturedIdImages;
}
interface ResultOk<T> {
    ok: () => true;
    value: () => T;
}
interface ResultFail<E> {
    ok: () => false;
    error: () => E;
}
export type FailableResult<T, E> = ResultFail<E> | ResultOk<T>;
export interface IdCaptureSessionHolder {
    getCapturedId: () => CapturedIdCommonFieldsGetters | undefined;
    getLocalizedOnlyId: () => string | undefined;
    getNewlyRejectedId: () => string | undefined;
    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) => void;
    parse: (code: string) => FailableResult<WasmCaptureId | null, string>;
    setExternalTransactionId: (transactionId: string | null) => void;
    getExternalTransactionId: () => string;
    getCentaurusSettings: () => string;
}
interface BarcodeVerificationResponse {
    isSuccess: boolean;
    allChecksPassed: boolean;
    error: string;
    serverResponseJson: string;
}
interface IdCaptureModule {
    IdCaptureDeserializer: new (helper: unknown) => CaptureModeDeserializerInstance;
    IdCaptureListener: {
        extend: (target: "IdCaptureListener", parameters: {
            onSessionUpdated: (mode: EmscriptenClassHandle, session: EmscriptenClassHandle) => void;
            onIdCaptured: (idCapture: EmscriptenClassHandle, capturedId: WasmCaptureId) => void;
            onIdPartiallyCaptured: (idCapture: EmscriptenClassHandle, capturedId: WasmCaptureId) => void;
            onIdLocalized: (idCapture: EmscriptenClassHandle, localization: string) => void;
            onIdRejected: (idCapture: EmscriptenClassHandle, capturedId: WasmCaptureId, rejectionReason: string) => void;
            onShutterButtonPositionChanged: (position: string) => void;
            onShutterButtonStateChanged: (state: string) => void;
        }) => new () => EmscriptenClassHandle;
    };
    IdCaptureDeserializerListener: {
        extend: (target: "IdCaptureDeserializerListener", parameters: {
            onModeDeserializationStarted: (deserializer: EmscriptenClassHandle, mode: SDCIdCaptureMode, json: EmscriptenClassHandle) => void;
            onModeDeserializationFinished: (deserializer: EmscriptenClassHandle, mode: SDCIdCaptureMode, json: EmscriptenClassHandle) => void;
            onSettingsDeserializationStarted: (deserializer: EmscriptenClassHandle, settings: EmscriptenClassHandle, json: EmscriptenClassHandle) => void;
            onSettingsDeserializationFinished: (deserializer: EmscriptenClassHandle, settings: EmscriptenClassHandle, json: EmscriptenClassHandle) => 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: (hardReset: boolean) => void;
            setDetectionOnlyMode: (detectionOnly: boolean) => void;
        }) => new () => {
            delete: () => void;
        };
    };
    IdCaptureDeserializerHelper: {
        extend: (target: "IdCaptureDeserializerHelper", parameters: {
            createMode: (context: EmscriptenClassHandle, settings: EmscriptenClassHandle) => SDCIdCaptureMode;
        }) => new () => EmscriptenClassHandle;
    };
    IdCapture: new (context: unknown, idCaptureBackend: unknown, settings: unknown, idCaptureImageHighlighter: unknown) => SDCIdCaptureMode;
    DataConsistencyVerifier: new (context: unknown) => EmscriptenClassHandle & {
        verify: (capturedId: string) => (EmscriptenClassHandle & {
            toJson: () => string;
        }) | null;
    };
    AamvaBarcodeVerifier: {
        extend: (target: "AamvaBarcodeVerifier", parameters: {
            verificationEnded: () => void;
            retriggerVerificationIn: (timeInMilliseconds: number) => void;
        }) => new () => EmscriptenClassHandle & {
            initialize: (context: EmscriptenClassHandle, endpoint: string) => void;
            startVerification: (capturedId: string) => void;
            getBarcodeVerificationResponse: () => BarcodeVerificationResponse;
        };
    };
    DrivingLicenseDetails: {
        createWithCentaurusData: (vehicleClass: string, restrictions: string, endorsements: string) => string;
    };
    IdOpenSourceSoftwareLicenseInfo: {
        getLicenseText(): string;
    };
    OutOfMemoryAnalyticsData: new (framesProcessedCount: number, didCaptureCount: number, didRejectCount: number, applySettingsCount: number, upTime: number, videoResolution: string, parentDomain: string | undefined, centaurusEnabled: boolean) => EmscriptenClassHandle;
    OutOfMemoryAnalyticsHelper: {
        storeAnalyticsEvent: (context: unknown, event: unknown) => void;
    };
}
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: T | undefined, 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 {};
