import SwiftUI
import Vision

struct ContentView: View {
   @State private var observations: [HumanObservation] = []

   var body: some View {
      VStack {
         Button("Detect") {
            Task {
               await detectBodies()
            }
         }.buttonStyle(.borderedProminent)

         Canvas { context, size in
            // Calculate size and draw image
            let image = UIImage(named: "twopeople")!
            let width = size.width
            let height = image.size.height * width / image.size.width
            let imageFrame = CGRect(origin: .zero, size: CGSize(width: width, height: height))
            context.draw(Image(uiImage: image), in: imageFrame)

            // Calculate size and draw bounding box
            for observation in observations {
               let rect = observation.boundingBox
               let boxFrame = rect.toImageCoordinates(imageFrame.size, origin: .upperLeft)
               context.stroke(Rectangle().path(in: boxFrame), with: .color(.green), lineWidth: 5)
            }
         }
         Spacer()
      }
      .padding()
   }
   func detectBodies() async {
      let imageURL = Bundle.main.url(forResource: "twopeople", withExtension: "png")
      if let imageURL = imageURL {
         do {
            var request = DetectHumanRectanglesRequest()
            request.upperBodyOnly = false
            observations = try await request.perform(on: imageURL)
         } catch {
            print("Error performing the request: \(error)")
         }
      }
   }
}