import SwiftUI
import FoundationModels
import MapKit

struct AttractionsTool: Tool {
   let name = "determineAttractionLocation"
   let description = "Finds the longitude and latitude of a location on a map"

   @Generable
   struct Arguments {
      @Guide(description: "The name of the city to find attractions for")
      var city: String
      @Guide(description: "The country the city belongs to")
      var country: String
   }
   @Generable
   struct Attraction {
      let name: String
      let latitude: Double
      let longitude: Double
   }
   func call(arguments: Arguments) async throws -> [Attraction] {
      var attractions: [Attraction] = []
      let city = arguments.city
      let country = arguments.country

      if let request = MKGeocodingRequest(addressString: "\(city), \(country)") {
         if let items = try? await request.mapItems, let mapitem = items.first {
            let region = MKCoordinateRegion(center: mapitem.location.coordinate, latitudinalMeters: 10000, longitudinalMeters: 10000)

            let request = MKLocalSearch.Request()
            request.naturalLanguageQuery = "tourist attractions"
            request.region = region

            let search = MKLocalSearch(request: request)
            do {
               let results = try await search.start()
               
               let items = results.mapItems
               for place in items where attractions.count < 3 {
                  attractions.append(Attraction(name: place.name ?? "Undefined", latitude: place.location.coordinate.latitude, longitude: place.location.coordinate.longitude))
               }
            } catch {
               print("Couldn't find any results: \(error)")
            }
         }
      }
      return attractions
   }
}