/**
 * Copyright © 2023-2024 Nevis Security AG. All rights reserved.
 */

import type { TurboModule } from 'react-native';
import { TurboModuleRegistry } from 'react-native';

import type { DeviceInformationCheckResultMessage } from './model/messages/in/DeviceInformationCheckResultMessage';
import type { DeviceInformationSyncResultMessage } from './model/messages/in/DeviceInformationSyncResultMessage';
import type { IsPolicyCompliantInMessage } from './model/messages/in/IsPolicyCompliantInMessage';
import type { LocalAccountsMessage } from './model/messages/in/LocalAccountsMessage';
import type { LocalAuthenticatorsMessage } from './model/messages/in/LocalAuthenticatorsMessage';
import type { LocalDeviceInformationMessage } from './model/messages/in/LocalDeviceInformationMessage';
import type { MetaDataInMessage } from './model/messages/in/MetaDataInMessage';
import type { OnSuccessMessage } from './model/messages/in/OnSuccessMessage';
import { OperationTypeMessage } from './model/messages/in/OperationTypeMessage';
import type { PendingOutOfBandOperationsResultMessage } from './model/messages/in/PendingOutOfBandOperationsResultMessage';

/* eslint-disable @typescript-eslint/no-wrapper-object-types */
export interface Spec extends TurboModule {
	//
	// Basic SDK invocations
	//
	initClient(message: Object): Promise<void>;
	payloadDecode(message: Object): Promise<OnSuccessMessage>;
	oobOperation(message: Object): Promise<OperationTypeMessage>;
	oobRegister(message: Object): Promise<void>;
	oobAuthenticate(message: Object): Promise<OnSuccessMessage>;
	inBandRegister(message: Object): Promise<void>;
	authCloudApiRegister(message: Object): Promise<void>;
	authenticate(message: Object): Promise<OnSuccessMessage>;
	deregister(message: Object): Promise<void>;
	deviceInformationChange(message: Object): Promise<void>;
	deviceInformationCheck(message: Object): Promise<DeviceInformationCheckResultMessage>;
	deviceInformationSync(message: Object): Promise<DeviceInformationSyncResultMessage>;
	pendingOutOfBandOperations(message: Object): Promise<PendingOutOfBandOperationsResultMessage>;
	pinChange(message: Object): Promise<void>;
	passwordChange(message: Object): Promise<void>;
	localAccounts(message: Object): Promise<LocalAccountsMessage>;
	localAuthenticators(message: Object): Promise<LocalAuthenticatorsMessage>;
	localDeleteAuthenticator(message: Object): Promise<void>;
	localDeviceInformation(message: Object): Promise<LocalDeviceInformationMessage>;

	//
	// Auxiliary SDK invocations
	//
	authenticatorAaid(message: Object): Promise<void>;
	pinEnroll(message: Object): Promise<void>;
	pinsChange(message: Object): Promise<void>;
	pinValidatedForEnrollment(message: Object): Promise<void>;
	pinValidatedForPinChange(message: Object): Promise<void>;
	pinVerify(message: Object): Promise<void>;
	passwordEnroll(message: Object): Promise<void>;
	passwordsChange(message: Object): Promise<void>;
	passwordValidatedForEnrollment(message: Object): Promise<void>;
	passwordValidatedForPasswordChange(message: Object): Promise<void>;
	passwordVerify(message: Object): Promise<void>;
	accountUsername(name: Object): Promise<void>;
	cancel(message: Object): Promise<void>;
	isPolicyCompliant(message: Object): Promise<IsPolicyCompliantInMessage>;
	listenForOsCredentials(message: Object): Promise<void>;
	cancelAuthentication(message: Object): Promise<void>;
	pauseListening(message: Object): Promise<void>;
	resumeListening(message: Object): Promise<void>;
	metaData(message: Object): Promise<MetaDataInMessage>;
}
/* eslint-enable @typescript-eslint/no-wrapper-object-types */

export default TurboModuleRegistry.getEnforcing<Spec>('NevisMobileAuthenticationSdkReact');
