import SwiftUI
import FoundationModels
import Observation

@Observable class ApplicationData {
   var response: CityResponse.PartiallyGenerated? = nil
   var prompt: String = ""

   @ObservationIgnored var session: LanguageModelSession

   static let shared: ApplicationData = ApplicationData()
   private init() {
      let instructions = "Determine the city the user is talking about, and return information about it."
      session = LanguageModelSession(tools: [AttractionsTool()], instructions: instructions)
   }
   func sendPrompt() async {
      do {
         let finalPrompt = Prompt {
            prompt
            "Use the AttractionsTool to find attractions."
         }
         let answer = session.streamResponse(to: finalPrompt, generating: CityResponse.self, options: GenerationOptions(sampling: .greedy))
         for try await partial in answer {
            response = partial.content
         }
      } catch {
         print("Error accessing the model: \(error)")
      }
      prompt = ""
   }
}