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

import NevisMobileAuthentication

class PinPolicyImpl: PinPolicy, Codable {
	// MARK: Properties

	let operationId: String
	var minLength: Int
	var maxLength: Int

	// MARK: Properties

	enum Constants {
		static var minLength = 6
		static var maxLength = 6
	}

	// MARK: Initialization

	init(operationId: String, minLength: Int = 6, maxLength: Int = 6) {
		self.operationId = operationId
		self.minLength = minLength
		self.maxLength = maxLength
	}

	// MARK: PinPolicy

	func validatePinForEnrollment(_ pin: String,
	                              onSuccess: @escaping () -> (),
	                              onError: @escaping (PinEnrollmentValidationError) -> ())
	{
		let operation: UserInteractionOperation = OperationCache.shared.read(by: operationId)
		let authenticator = operation.findAuthenticator(aaid: AuthenticatorAaid.Pin)
		let state = PinValidateForEnrollmentState(authenticator: authenticator,
		                                          onSuccess: onSuccess,
		                                          onValidationError: onError)
		OperationCache.shared.update(by: operationId,
		                             operation: operation.update(state: state))

		let message = PinValidationMessage(operationId: operationId,
		                                   pin: pin)
		EventEmitter.shared.dispatch(event: .pinValidateForEnrollment, message: message)
	}

	func validatePinForPinChange(_ pin: String,
	                             onSuccess: @escaping () -> (),
	                             onError: @escaping (PinChangeValidationError) -> ())
	{
		let operation: PinChangeOperation = OperationCache.shared.read(by: operationId)
		let state = PinValidateForPinChangeState(onSuccess: onSuccess,
		                                         onValidationError: onError)
		OperationCache.shared.update(by: operationId,
		                             operation: operation.update(state: state))

		let message = PinValidationMessage(operationId: operationId,
		                                   pin: pin)
		EventEmitter.shared.dispatch(event: .pinValidateForPinChange, message: message)
	}
}
