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

import NevisMobileAuthentication

protocol PinChangeOperationState: OperationState { /* . */ }

// MARK: -

actor PinChangeState: PinChangeOperationState {
	// MARK: Properties

	let context: PinChangeContext
	let handler: PinChangeHandler

	// MARK: Initialization

	init(context: PinChangeContext, handler: PinChangeHandler) {
		self.context = context
		self.handler = handler
	}

	// MARK: Public Interface

	func changePin(oldPin: String, newPin: String) {
		handler.pins(oldPin, newPin)
	}

	// MARK: OperationState

	func cancel() {
		handler.cancel()
	}
}

// MARK: -

actor PinValidateForPinChangeState: PinChangeOperationState {
	// MARK: Properties

	let onSuccess: @Sendable () -> ()
	let onValidationError: @Sendable (PinChangeValidationError) -> ()

	// MARK: Initialization

	init(onSuccess: @escaping @Sendable () -> (), onValidationError: @escaping @Sendable (PinChangeValidationError) -> ()) {
		self.onSuccess = onSuccess
		self.onValidationError = onValidationError
	}

	// MARK: Public Interface

	func validatePin(errorMessage: String?, cause: String?) {
		if let errorMessage {
			var error: Error? {
				if let cause {
					return PinValidationError.InvalidPin(cause: cause)
				}

				return nil
			}
			onValidationError(.InvalidPin(message: errorMessage, cause: error))
		}
		else {
			onSuccess()
		}
	}
}
