import OnrampKit

@objc(OnrampSDK)
class OnrampSDK: RCTEventEmitter, OnrampKitDelegate {

	func onDataChanged(_ data: OnrampEventResponse) {
      do{
        let jsonData = try JSONEncoder().encode(data)
		let jsonObject = try JSONSerialization.jsonObject(with: jsonData, options: [])
        if(jsonObject != nil){
          self.sendEvent(withName: "widgetEvents", body: jsonObject)
        }
      } catch {
        print("CONVERSION_ERROR", "Failed to convert Swift object to JSON", error)
      }

    }
    
    @objc
    override static func requiresMainQueueSetup() -> Bool {
      return true;
    }
    
    @objc
    override func constantsToExport() -> [AnyHashable: Any]! {
      return ["initialCount": 0];
    }
    
    @objc
    override func supportedEvents() -> [String]! {
      return ["widgetEvents"]
    }
    
    @available(iOS 13.0, *)
    @objc(startSdk:)
    func startSdk(_ params: NSDictionary){
      if let currentlyPresentedVC = RCTPresentedViewController() {
           DispatchQueue.main.async {
             Onramp.startOnrampSDK(
                 currentlyPresentedVC.self,
                 self,
                 appId: params["appId"] as! Int,
                 walletAddress: params["walletAddress"] as? String,
                 flowType: params["flowType"] as? Int,
                 coinCode: params["coinCode"] as? String,
                 network: params["network"] as? String,
                 coinAmount: params["coinAmount"] as? Double,
                 fiatAmount: params["fiatAmount"] as? Double,
                 merchantRecognitionId: params["merchantRecognitionId"] as? String,
                 paymentMethod: params["paymentMethod"] as? Int,
                 authToken: params["authToken"] as? String,
                 assetDescription: params["assetDescription"] as? String,
                 assetImage: params["assetImage"] as? String,
                 fiatType: params["fiatType"] as? Int,
                 phoneNumber: params["phoneNumber"] as? String,
                 lang: params["lang"] as? String,
                 addressTag: params["addressTag"] as? String,
                 sellCoinCode: params["sellCoinCode"] as? String,
                 receiveCoinCode: params["receiveCoinCode"] as? String,
                 sellAmount: params["sellAmount"] as? Double,
                 receiveAmount: params["receiveAmount"] as? Double,
                 sellNetwork: params["sellNetwork"] as? String,
                 receiveNetwork: params["receiveNetwork"] as? String,
                 redirectUrl: params["redirectUrl"] as? String,
                 defaultCoinCode: params["defaultCoinCode"] as? String,
                 defaultSellCoinCode: params["defaultSellCoinCode"] as? String
             )
           }
        }
    }

	 @available(iOS 13.0, *)
     @objc(startOnrampLogin:)
     func startOnrampLogin(_ params: NSDictionary){
       if let currentlyPresentedVC = RCTPresentedViewController() {
            DispatchQueue.main.async {
                Onramp.startOnrampLogin(currentlyPresentedVC.self, self, appId: params["appId"] as! Int, closeAfterLogin: params["closeAfterLogin"] as! Bool, signature: params["signature"] as? String, phoneNumber: params["phoneNumber"] as? String, lang: params["lang"] as? String)
            }
         }
     }

	@available(iOS 13.0, *)
    @objc(initiateOnrampKyc:)
    func initiateOnrampKyc(_ params: NSDictionary){
      if let currentlyPresentedVC = RCTPresentedViewController() {
           DispatchQueue.main.async {
               Onramp.initiateOnrampKyc(currentlyPresentedVC.self, self, appId: params["appId"] as! Int, payload: params["payload"] as! String, signature: params["signature"] as! String, customerId: params["customerId"] as! String, apiKey: params["apiKey"] as! String, lang: params["lang"] as? String)
           }
        }
    }
    
    @available(iOS 13.0, *)
    @objc(closeSdk)
    func closeSdk() {
        if let currentlyPresentedVC = RCTPresentedViewController() {
             DispatchQueue.main.async {
                 Onramp.stopOnrampSDK(currentlyPresentedVC.self)
             }
          }
    }
    
}
