import SwiftUI
import Vision

struct ContentView: View {
   @State private var numberGesture: String = "Detecting..."

   var body: some View {
      VStack {
         Image(uiImage: UIImage(named: "number1")!)
            .resizable()
            .scaledToFit()
         Text(numberGesture)
            .padding()
         Spacer()
      }
      .padding()
      .task {
         let imageURL = Bundle.main.url(forResource: "number1", withExtension: "png")
         if let imageURL = imageURL {
            do {
               let request = DetectHumanHandPoseRequest()
               let observations = try await request.perform(on: imageURL)

               var fingersUp = [0, 0, 0]
               if let observation = observations.first {
                  if let wrist = observation.joint(for: .wrist) {
                     // Check gesture index finger
                     let indexTip = observation.joint(for: .indexTip)
                     let indexDIP = observation.joint(for: .indexDIP)
                     let indexTipDistance = indexTip?.distance(to: wrist) ?? 0
                     let indexDIPDistance = indexDIP?.distance(to: wrist) ?? 0
                     if indexTipDistance > (indexDIPDistance * 1.10) {
                        fingersUp[0] = 1
                     }
                     // Check gesture middle finger
                     let middleTip = observation.joint(for: .middleTip)
                     let middleDIP = observation.joint(for: .middleDIP)
                     let middleTipDistance = middleTip?.distance(to: wrist) ?? 0
                     let middleDIPDistance = middleDIP?.distance(to: wrist) ?? 0
                     if middleTipDistance > (middleDIPDistance * 1.10) {
                        fingersUp[1] = 1
                     }
                     // Check gesture ring finger
                     let ringTip = observation.joint(for: .ringTip)
                     let ringDIP = observation.joint(for: .ringDIP)
                     let ringTipDistance = ringTip?.distance(to: wrist) ?? 0
                     let ringDIPDistance = ringDIP?.distance(to: wrist) ?? 0
                     if ringTipDistance > (ringDIPDistance * 1.10) {
                        fingersUp[2] = 1
                     }
                     if fingersUp == [1, 0, 0] {
                        numberGesture = "Number 1"
                     } else if fingersUp == [1, 1, 0] {
                        numberGesture = "Number 2"
                     } else if fingersUp == [1, 1, 1] {
                        numberGesture = "Number 3"
                     }
                  }
               }
            } catch {
               print("Error performing the request: \(error)")
            }
         }
      }
   }
}