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

import Darwin
import NevisMobileAuthentication

extension MobileAuthenticationClientError {
	func asChannelError() -> ChannelError {
		let mirror = mirror
		let type = mirror.label  // enum name
		let params = mirror.params  // associated values (name: value)

		let cause = (params[ErrorKey.cause.rawValue] as? Error)?.localizedDescription
		let fidoError = params[ErrorKey.errorCode.rawValue] as? FidoErrorCode
		var typedSessionProvider: TypedSessionProvider?
		if let sessionProvider = params[ErrorKey.sessionProvider.rawValue] as? SessionProvider {
			typedSessionProvider = TypedSessionProvider(wrapped: sessionProvider)
		}
		let server = params[ErrorKey.server.rawValue] as? (any Server)

		return ChannelError(
			type: type,
			description: localizedDescription,
			innerError: fidoError,
			sessionProvider: typedSessionProvider ?? nil,
			server: server,
			cause: cause
		)
	}
}
