import Foundation
import Capacitor
import DragonMedicalSpeechKit

@objc public class NuanceSpeechkit: NSObject, DictationSuccess {
    var startCallID: String?
    var bridge: CAPBridgeProtocol?

    @objc public func initSpeechKit(forApplication applicationName: String, partnerGuid: String, organizationToken: String, userName: String) {
        NUSASession.shared().open(forApplication: applicationName, partnerGuid: partnerGuid, licenseGuid: organizationToken, userId: userName)
        
    }
    @objc public func echo(_ value: String) -> String {
        print(value)
        return value
    }
    @objc public func start(_ bridge: CAPBridgeProtocol, callbackId:String) {
        let capBundle = Bundle(for: Self.self)
        guard let storyboardUrl = capBundle.url(forResource: "Resources", withExtension: "bundle") else {
            CAPLog.print("ERROR: Required native-bridge.js file in Capacitor not found. Bridge will not function!")
            return
        }
        
        let bundleURL = capBundle.url(forResource: "Resources", withExtension: "bundle")
        let bundle = Bundle(url: bundleURL!)!
        let storyboard = UIStoryboard(name: "Storyboard", bundle: bundle)

        let dictationViewController = storyboard.instantiateViewController(identifier: "DictationViewController") as DictationViewController
        dictationViewController.delegate = self
        startCallID = callbackId
        self.bridge = bridge
        if let callID = startCallID, let call = bridge.savedCall(withID: callID) {
            let text = call.getString("text") ?? ""
            dictationViewController.previousData = text
        }
        dictationViewController.modalPresentationStyle = .overCurrentContext

        bridge.viewController?.present(dictationViewController, animated: true,completion: nil)
            
    }

}
extension NuanceSpeechkit {
    func didFinish(_ text: String) {
        if let callID = startCallID, let call = bridge?.savedCall(withID: callID) {
            call.resolve(["text": text])
            bridge?.releaseCall(call)
            }
    }
}
