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

import NevisMobileAuthentication

extension OutOfBandAuthentication {
	func configure(by outOfBandAuthenticationMessage: OutOfBandAuthenticationMessage, operation outOfBandAuthenticationOperation: OutOfBandAuthenticationOperation) -> OutOfBandAuthentication {
		if let requestHeaders = outOfBandAuthenticationMessage.requestHeaders {
			self.requestHeaders(requestHeaders.namesAndValues)
		}

		if outOfBandAuthenticationMessage.accountSelectorProvided,
		   let accountSelector = outOfBandAuthenticationOperation.accountSelector
		{
			self.accountSelector(accountSelector)
		}

		if outOfBandAuthenticationMessage.authenticatorSelectorProvided {
			authenticatorSelector(outOfBandAuthenticationOperation.authenticatorSelector)
		}

		if outOfBandAuthenticationMessage.pinUserVerifierProvided,
		   let pinUserVerifier = outOfBandAuthenticationOperation.pinUserVerifier
		{
			self.pinUserVerifier(pinUserVerifier)
		}

		if outOfBandAuthenticationMessage.passwordUserVerifierProvided,
		   let passwordUserVerifier = outOfBandAuthenticationOperation.passwordUserVerifier
		{
			self.passwordUserVerifier(passwordUserVerifier)
		}

		if outOfBandAuthenticationMessage.biometricUserVerifierProvided {
			biometricUserVerifier(outOfBandAuthenticationOperation.biometricUserVerifier)
		}

		if outOfBandAuthenticationMessage.devicePasscodeUserVerifierProvided {
			devicePasscodeUserVerifier(outOfBandAuthenticationOperation.devicePasscodeUserVerifier)
		}

		if outOfBandAuthenticationMessage.onSuccessProvided {
			onSuccess { [unowned outOfBandAuthenticationOperation] provider in
				Task {
					await outOfBandAuthenticationOperation.onSuccess(provider)
				}
			}
		}

		if outOfBandAuthenticationMessage.onErrorProvided {
			onError { [unowned outOfBandAuthenticationOperation] error in
				Task {
					await outOfBandAuthenticationOperation.onError(error)
				}
			}
		}

		return self
	}
}
