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

import Foundation

enum Event: String, CaseIterable {
	case selectAccount
	case selectAuthenticator
	case pinEnroll
	case pinChange
	case pinValidateForEnrollment
	case pinValidateForPinChange
	case passwordEnroll
	case passwordChange
	case passwordValidateForEnrollment
	case passwordValidateForPasswordChange
	case verifyUser
}

final class EventEmitter: @unchecked Sendable {
	static let shared = EventEmitter()
	private let queue = DispatchQueue(withLabel: "ch.nevis.mobile.authentication.sdk.react.event-emitter")

	// MARK: Properties

	private nonisolated(unsafe) static var eventEmitter: RNEventEmitter!
	lazy var allEvents: [String] = Event.allCases.map(\.rawValue)

	// MARK: Public Interface

	func register(eventEmitter: RNEventEmitter) {
		queue.sync {
			EventEmitter.eventEmitter = eventEmitter
		}
	}

	func dispatch(event: Event, message: ChannelOutMessage) {
		queue.sync {
			do {
				let body = try JsonMapper.encode(message)
				EventEmitter.eventEmitter.sendEvent(withName: event.rawValue, body: body)
			}
			catch {
				Task {
					await OperationCache.shared.delete(by: message.operationId)
				}
				print("Failed to dispatch event. Error: \(error.localizedDescription)")
			}
		}
	}
}
