import Foundation
import React

let PUSH_EVENT_NAME: String = "ReadyWallet_FOREGROUND_PUSH_EVENT"
let AS_READY_WALLET: String = "@readyio_ready_wallet";
let PUSH_DEEPLINK: String = "ReadyWallet_FOREGROUND_DEEPLINK_EVENT";

@objc(ReadyWallet)
class ReadyWallet: RCTEventEmitter {
    public static var emitter: RCTEventEmitter!
    @objc
    static var isLaunch = false
    @objc
    static var isFontLoaded = false
    
    open override func supportedEvents() -> [String] {
      [PUSH_EVENT_NAME, PUSH_DEEPLINK] 
    }
    override init() {
        super.init()
        UIFont.registerFont(bundle: Bundle.main, fontName: "Inter-Bold", fontExtension: ".ttf")
        UIFont.registerFont(bundle: Bundle.main, fontName: "Inter-Medium", fontExtension: ".ttf")
        UIFont.registerFont(bundle: Bundle.main, fontName: "Inter-Regular", fontExtension: ".ttf")
        ReadyWallet.emitter = self
    }

    @objc(getIsLaunch:withRejecter:)
    func getIsLaunch(resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) {
        resolve(ReadyWallet.isLaunch)
    }

    @objc(sendPushDataEvent:)
    func sendPushDataEvent(params: [String: Any]) {
        if (ReadyWallet.isLaunch) {
            ReadyWallet.emitter.sendEvent(withName: PUSH_EVENT_NAME, body: params)
        }
    }

    @objc(sendDeeplinkDataEvent:)
    func sendDeeplinkDataEvent(params: [String: Any]) {
        if (ReadyWallet.isLaunch) {
            ReadyWallet.emitter.sendEvent(withName: PUSH_DEEPLINK, body: params)
        }
    }
    
    
    @objc(getItem:withResolve:withRejecter:)
    func getItem(key: String, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) {
        let data = UserDefaults.standard.string(forKey: key)
        resolve(data)
    }
    
    
    @objc(setItem:value:)
    func setItem(key: String, value: String) {
        UserDefaults.standard.set(value, forKey: key)
    }
    
    @objc(openApp:)
    func openApp(initProps: [String: Any]) {
        if (!ReadyWallet.isLaunch){
            ReadyWallet.isLaunch = true
     
            
            var bundleURL = Bundle.main.resourceURL
            bundleURL!.appendPathComponent("readyio-rn-wallet.bundle/ReadyWallet.bundle")
            DispatchQueue.main.async {
                let rootView = RCTRootView(bundleURL: bundleURL!, moduleName: "ReadyWallet", initialProperties: initProps, launchOptions: nil)
                let vc = UIViewController()
                vc.modalPresentationStyle = .fullScreen
                vc.view = rootView
                UIApplication.shared.delegate?.window??.rootViewController?.present(vc, animated: true, completion: nil)
                ReadyWalletSplash.showSplash(inRootView: rootView)
            }
        }
    }
    
    @objc(closeApp)
    func closeApp() {
        if ReadyWallet.isLaunch {
            DispatchQueue.main.async {
                UIApplication.shared.delegate?.window??.rootViewController?.dismiss(animated: true, completion: nil)
            }
            ReadyWallet.isLaunch = false
        }
    }
}


extension UIFont {
    static func registerFont(bundle: Bundle, fontName: String, fontExtension: String) -> Bool {
        guard let fontURL = bundle.url(forResource: fontName, withExtension: fontExtension) else {
            print("Couldn't find font Inter")
            return false
        }

        guard let fontDataProvider = CGDataProvider(url: fontURL as CFURL) else {
            print("Couldn't load data from the font Inter")
            return false
        }

        guard let font = CGFont(fontDataProvider) else {
            print("Couldn't create font from data")
            return false
        }

        var error: Unmanaged<CFError>?
        CTFontManagerRegisterGraphicsFont(font, &error)
        return true
    }
}
