import SwiftUI
import Observation
import Vision

struct ImageData: Identifiable {
   let id: UUID = UUID()
   var fileName: String
   var image: UIImage?
   var categories: [String]
   
   var showCategories: String {
      return categories.joined(separator: ", ")
   }
}
@Observable class ApplicationData {
   var listImages: [ImageData]

   static let shared: ApplicationData = ApplicationData()
   private init() {
      listImages = []
      let list = ["picture1", "picture2", "picture3", "picture4", "picture5", "picture6", "picture7", "picture8", "picture9", "picture10"]
      for name in list {
         listImages.append(ImageData(fileName: name, image: UIImage(named: name), categories: []))
      }
   }
   func recognizeImages() async {
      await withTaskGroup(of: (Int, [String]).self) { group in
         for (index, item) in listImages.enumerated() {
            var categories: [String] = []
            let imageURL = Bundle.main.url(forResource: item.fileName, withExtension: "png")
            if let imageURL = imageURL {
               group.addTask {
                  do {
                     let request = ClassifyImageRequest()
                     var results = try await request.perform(on: imageURL)
                     results = results.filter { $0.hasMinimumPrecision(0.1, forRecall: 0.8) && $0.confidence > 0.1 }
                     categories = results.map(\.identifier)
                  } catch {
                     print("Error performing the request: \(error)")
                  }
                  return (index, categories)
               }
            }
         }
         for await (index, categories) in group {
            await MainActor.run {
               self.listImages[index].categories = categories
            }
         }
      }
   }
}