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

import NevisMobileAuthentication

class PinChangeOperationState: OperationState {
	// MARK: OperationState Overrides

	func cancel() {
		fatalError("Must override.")
	}
}

// MARK: -

class PinChangeState: PinChangeOperationState {
	// MARK: Properties

	let context: PinChangeContext?
	let handler: PinChangeHandler?

	// MARK: Initialization

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

	// MARK: Public Interface

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

	// MARK: OperationState Overrides

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

// MARK: -

class PinValidateForPinChangeState: PinChangeOperationState {
	// MARK: Properties

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

	// MARK: Initialization

	init(onSuccess: @escaping () -> (), onValidationError: @escaping (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()
		}
	}
}
