//
// Copyright © 2023 Nevis Security AG. All rights reserved.
//

import NevisMobileAuthentication

protocol UserInteractionOperation: StandardOperation {
	var accountSelector: AccountSelector? { get }
	var authenticatorSelector: AuthenticatorSelector { get }
	var pinEnroller: PinEnroller? { get async }
	var passwordEnroller: PasswordEnroller? { get }
	var pinUserVerifier: PinUserVerifier? { get }
	var passwordUserVerifier: PasswordUserVerifier? { get }
	var biometricUserVerifier: BiometricUserVerifier { get }
	var devicePasscodeUserVerifier: DevicePasscodeUserVerifier { get }

	func findAuthenticator(aaid: AuthenticatorAaid) async -> any Authenticator
	func update(state: UserInteractionState) async -> any UserInteractionOperation
}

extension UserInteractionOperation {
	func findAuthenticator(aaid: AuthenticatorAaid) async -> any Authenticator {
		let currentState = await state
		switch currentState {
		case let userInteractionState as UserInteractionState:
			return await userInteractionState.findAuthenticator(aaid: aaid)
		default:
			fatalError("Cannot find authenticator for state \(currentState)!")
		}
	}
}
