import UIKit
import SwiftUI
import Foundation
import touchlesslib
import React

@objc(FingerprintSdkReactNative)
class FingerprintSdkReactNative: RCTEventEmitter {

  var hasListiners = false
    
  override func startObserving() {
    hasListiners = true
  }
  
  override func stopObserving() {
    hasListiners = false
  }
  
  override func supportedEvents() -> [String]! {
    return [
      "fingerprint-sdk-react-native/onFingerCapture",
      "fingerprint-sdk-react-native/onStatusChanged",
      "fingerprint-sdk-react-native/onFingerDetected"
    ]
  }

  @objc(takeFingerprint:withResolver:withRejecter:)
  func takeFingerprint(
    config: NSDictionary,
    resolve: @escaping RCTPromiseResolveBlock,
    reject: @escaping RCTPromiseRejectBlock
  ) -> Void {
    let config = Utils.dictionaryToFingerprintConfig(config: config)
    DispatchQueue.main.async {
      var rootViewController:UIViewController! = UIApplication.shared.keyWindow?.rootViewController
      let fingerprintView = FingerprintView(with: config, onFingerCapture: { images, error  in
        let mapImages = Utils.onFingerCaptureEventToNativeMap(images: images, error: error)
        if (self.hasListiners != nil) {
          self.sendEvent(withName: "fingerprint-sdk-react-native/onFingerCapture", body: mapImages)
        }
      }, onStatusChanged: { state in
        let mapStatus = Utils.onStatusChangedEventToNativeMap(status: state)
        if (self.hasListiners) {
          self.sendEvent(withName: "fingerprint-sdk-react-native/onStatusChanged", body: mapStatus)
        }
      }, onFingerDetected: { rects in
        let mapRects = Utils.onFingerDetectedEventToNativeMap(fingerRects: rects)
        if (self.hasListiners) {
          self.sendEvent(withName: "fingerprint-sdk-react-native/onFingerDetected", body: mapRects)
        }
      })
      let contentView = UIHostingController(rootView: fingerprintView)
      contentView.modalPresentationStyle = .fullScreen
      rootViewController.present(contentView, animated: true, completion: nil)
      resolve(true)
    }
  }
}
