import OnrampKit

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

    // Convert numbers to strings for native SDK
    private func convertNumbersToStrings(_ dict: NSDictionary) -> [String: Any] {
        var result: [String: Any] = [:]
        for (key, value) in dict {
            guard let keyString = key as? String else { continue }
            if let numValue = value as? NSNumber {
                // Check if it's a boolean (NSNumber can represent bools)
                if CFGetTypeID(numValue) == CFBooleanGetTypeID() {
                    result[keyString] = numValue.boolValue
                } else {
                    // Convert number to string
                    let doubleVal = numValue.doubleValue
                    if doubleVal == Double(Int64(doubleVal)) {
                        result[keyString] = String(Int64(doubleVal))
                    } else {
                        result[keyString] = String(doubleVal)
                    }
                }
            } else if let nestedDict = value as? NSDictionary {
                result[keyString] = convertNumbersToStrings(nestedDict)
            } else {
                result[keyString] = value
            }
        }
        return result
    }

	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() {
           let convertedParams = convertNumbersToStrings(params)
           let workItem = DispatchWorkItem { [weak self] in
             guard let self = self else { return }
             Onramp.startOnrampSDK(
                 currentlyPresentedVC.self,
                 self,
                 params: convertedParams
             )
           }
           DispatchQueue.main.async(execute: workItem)
        }
    }

	 @available(iOS 13.0, *)
     @objc(startOnrampLogin:)
     func startOnrampLogin(_ params: NSDictionary){
       if let currentlyPresentedVC = RCTPresentedViewController() {
            let convertedParams = convertNumbersToStrings(params)
            let workItem = DispatchWorkItem { [weak self] in
                guard let self = self else { return }
                Onramp.startOnrampLogin(currentlyPresentedVC.self, self, params: convertedParams)
            }
            DispatchQueue.main.async(execute: workItem)
         }
     }

	@available(iOS 13.0, *)
    @objc(initiateOnrampKyc:)
    func initiateOnrampKyc(_ params: NSDictionary){
      if let currentlyPresentedVC = RCTPresentedViewController() {
           let convertedParams = convertNumbersToStrings(params)
           let workItem = DispatchWorkItem { [weak self] in
               guard let self = self else { return }
               Onramp.initiateOnrampKyc(currentlyPresentedVC.self, self, params: convertedParams)
           }
           DispatchQueue.main.async(execute: workItem)
        }
    }

    @available(iOS 13.0, *)
    @objc(closeSdk)
    func closeSdk() {
        if let currentlyPresentedVC = RCTPresentedViewController() {
             DispatchQueue.main.async {
                 Onramp.stopOnrampSDK(currentlyPresentedVC.self)
             }
          }
    }

}
