import UIKit
import SwiftUI
import Foundation
import touchlesslib
import React

@objc(FingerprintSdkReactNative)
class FingerprintSdkReactNative: RCTEventEmitter {
  
  private var hasListeners = false

  // MARK: - RCTEventEmitter overrides
  
  override func startObserving() {
    hasListeners = true
  }
  
  override func stopObserving() {
    hasListeners = false
  }

  override func supportedEvents() -> [String]! {
    return [
      "fingerprint-sdk-react-native/onFingerCapture",
      "fingerprint-sdk-react-native/onStatusChanged",
      "fingerprint-sdk-react-native/onFingerDetected"
    ]
  }

  override static func requiresMainQueueSetup() -> Bool {
    return true
  }

  // MARK: - Native Method Exposed to React Native
  
  @objc(takeFingerprint:withResolver:withRejecter:)
  func takeFingerprint(
    config: NSDictionary,
    resolve: @escaping RCTPromiseResolveBlock,
    reject: @escaping RCTPromiseRejectBlock
  ) -> Void {
    
    let config = Utils.dictionaryToFingerprintConfig(config: config)

    DispatchQueue.main.async {
      guard let rootVC = UIApplication.shared.keyWindow?.rootViewController else {
        reject("no_root_vc", "Root view controller not found", nil)
        return
      }

      let fingerprintView = FingerprintView(
        with: config,
        onFingerCapture: { images, error in
          let event = Utils.onFingerCaptureEventToNativeMap(images: images, error: error)
          if self.hasListeners {
            self.sendEvent(withName: "fingerprint-sdk-react-native/onFingerCapture", body: event)
          }
        },
        onStatusChanged: { status in
          let mapStatus = Utils.onStatusChangedEventToNativeMap(status: status)
          if self.hasListeners {
            self.sendEvent(withName: "fingerprint-sdk-react-native/onStatusChanged", body: mapStatus)
          }
        },
        onFingerDetected: { rects in
          let mapRects = Utils.onFingerDetectedEventToNativeMap(fingerRects: rects)
          if self.hasListeners {
            self.sendEvent(withName: "fingerprint-sdk-react-native/onFingerDetected", body: mapRects)
          }
        }
      )

      let contentView = UIHostingController(rootView: fingerprintView)
      contentView.modalPresentationStyle = .fullScreen
      rootVC.present(contentView, animated: true, completion: nil)

      resolve(true)
    }
  }
}
