import Foundation
import React
import AppsOnAir_AppRemark

@objc(AppsonairReactNativeAppremark)
class AppsonairReactNativeAppremark: RCTEventEmitter {
  
  private var hasListeners = false
  private var pendingRemarkInfoEvent: [String: Any]? = nil
  
  override static func requiresMainQueueSetup() -> Bool {
    return true
  }
  
  override func supportedEvents() -> [String] {
    return ["onRemarkResponse"]
  }
  
  override func startObserving() {
    hasListeners = true
    if let event = pendingRemarkInfoEvent {
      sendEvent(withName: "onRemarkResponse", body: event)
      pendingRemarkInfoEvent = nil
    }
  }
  
  override func stopObserving() {
    hasListeners = false
  }
  
  @objc(initialize:options:)
  func initialize(_ shakeGestureEnable: Bool, options: NSDictionary) {
    AppRemarkService.shared.initialize(shakeGestureEnable: shakeGestureEnable, options: options) { remarkInfo in
      if self.hasListeners {
        self.sendEvent(withName: "onRemarkResponse", body: remarkInfo)
      } else {
        self.pendingRemarkInfoEvent = remarkInfo
      }
    }
  }
  
  @objc(addRemark:rejecter:)
  func addRemark(_ resolver: @escaping RCTPromiseResolveBlock,
                 rejecter: @escaping RCTPromiseRejectBlock) {
    AppRemarkService.shared.addRemark()
    resolver(nil)
  }
  
  @objc(setAdditionalMetaData:resolver:rejecter:)
  func setAdditionalMetaData(_ extraPayload: NSDictionary,
                             resolver: @escaping RCTPromiseResolveBlock,
                             rejecter: @escaping RCTPromiseRejectBlock) {
    AppRemarkService.shared.setAdditionalMetaData(extraPayload: extraPayload)
    resolver(nil)
  }
}
