import MLKitTranslate

@objc(GoogleMlkitTranslate)
class GoogleMlkitTranslate: NSObject {
    
    @objc(translate:sourceLanguage:targetLanguage:requireWifiToDownloadModel:resolve:reject:)
       func translate(text: String, sourceLanguage: String,targetLanguage:String,requireWifiToDownloadModel:Bool = true,  resolve:@escaping RCTPromiseResolveBlock,reject:@escaping RCTPromiseRejectBlock) -> Void {
           
           // sourceLanguage and targetLanguage must be language code
           let source = TranslateLanguage(rawValue: sourceLanguage)
           let target = TranslateLanguage(rawValue: targetLanguage)
           
           let options = TranslatorOptions(sourceLanguage: source, targetLanguage: target)
           let translator = Translator.translator(options: options)
           
           let conditions = ModelDownloadConditions(
               allowsCellularAccess: !requireWifiToDownloadModel,
               allowsBackgroundDownloading: true
           )
           translator.downloadModelIfNeeded(with: conditions) { error in
               guard error == nil else {
                   reject("Download failed",error?.localizedDescription, nil)
                   return
               }
               
               // Model downloaded successfully. Okay to start translating.
               translator.translate(text) { translatedText, error in
                   guard error == nil, let translatedText = translatedText else {
                       reject("Translate failed",error?.localizedDescription, nil)
                       return
                   }
                   
                   // Translation succeeded.
                   resolve(translatedText)
               }
           }
       }

    @objc(translateMany:sourceLanguage:targetLanguage:requireWifiToDownloadModel:resolve:reject:)
    func translateMany(texts: [String], sourceLanguage: String,targetLanguage:String,requireWifiToDownloadModel:Bool = true,  resolve:@escaping RCTPromiseResolveBlock,reject:@escaping RCTPromiseRejectBlock) -> Void {
        
        // sourceLanguage and targetLanguage must be language code
        let source = TranslateLanguage(rawValue: sourceLanguage)
        let target = TranslateLanguage(rawValue: targetLanguage)
        
        let options = TranslatorOptions(sourceLanguage: source, targetLanguage: target)
        let translator = Translator.translator(options: options)
        
        let conditions = ModelDownloadConditions(
            allowsCellularAccess: !requireWifiToDownloadModel,
            allowsBackgroundDownloading: true
        )
        translator.downloadModelIfNeeded(with: conditions) { error in
            guard error == nil else {
                reject("Download failed",error?.localizedDescription, nil)
                return
            }
            
            var translatedTexts:[String] = []
            for text in texts{
                // Model downloaded successfully. Okay to start translating.
                translator.translate(text) { translatedText, error in
                    guard error == nil, let translatedText = translatedText else {
                        reject("Translate failed",error?.localizedDescription, nil)
                        return
                    }
                    
                    // Translation succeeded.
                    translatedTexts.append(translatedText)
                    if translatedTexts.count == texts.count{
                        resolve(translatedTexts)
                    }
                }
            }
            
        }
    }
}
