import SwiftUI
@preconcurrency import Translation
import NaturalLanguage

struct ContentView: View {
   @State private var translatedText: String = ""
   @State private var configuration: TranslationSession.Configuration?

   let listPosts = [
      "Das Foto sieht echt toll aus, wo wurde das aufgenommen?",
      "Je peux à peine croire à quelle vitesse le temps passe!",
      "¡Felicidades por tu nuevo trabajo, te lo mereces mucho!",
      "Kann jemand dieses Lied bitte verlinken? Ich liebe es!",
      "Estoy totalmente de acuerdo contigo, pienso exactamente lo mismo."
   ]
   var body: some View {
      VStack {
         Button("Translate") {
            if configuration != nil {
               configuration?.invalidate()
            } else {
               let targetLanguage = Locale.Language(identifier: "en")
               configuration = TranslationSession.Configuration(source: nil, target: targetLanguage)
            }
         }
         .buttonStyle(.borderedProminent)
         ScrollView {
            Text(translatedText)
         }
         Spacer()
      }
      .padding()
      .translationTask(configuration) { session in
         do {
            let listRequests = getRequests()

            var listResponses: [String] = Array(repeating: "Translating...", count: listPosts.count)
            for (_, requests) in listRequests {
               // Process the requests for each language
               for try await response in session.translate(batch: requests) {
                  if let identifier = response.clientIdentifier, let index = Int(identifier) {
                     listResponses[index] = response.targetText
                  }
                  translatedText = listResponses.joined(separator: "\n\n")
               }
            }
         } catch {
            print("Error translating the text: \(error)")
         }
      }
   }
   func getRequests() -> [String: [TranslationSession.Request]] {
      var listRequests: [String: [TranslationSession.Request]] = [:]

      for (index, post) in listPosts.enumerated() {
         // Prepare request
         var request = TranslationSession.Request(sourceText: post)
         request.clientIdentifier = String(index)

         // Detect language in post
         let detect = NLLanguageRecognizer()
         detect.processString(post)
         if let code = detect.dominantLanguage {
            if let language = Locale.current.localizedString(forLanguageCode: code.rawValue) {
               if listRequests[language] == nil {
                  // Add new language to list
                  listRequests[language] = [request]
               } else {
                  // Add request to language
                  listRequests[language]!.append(request)
               }
            }
         }
      }
      return listRequests
   }
}