//
//  ExerciseListView.swift
//  Werkout_ios
//
//  Created by Trey Tartt on 7/7/23.
//

import SwiftUI
import AVKit

struct ExerciseListView: View {
    @AppStorage(Constants.phoneThotStyle) private var phoneThotStyle: ThotStyle = .never
    @ObservedObject var bridgeModule = BridgeModule.shared
    @State var avPlayer = AVPlayer(url: URL(string: "https://dev.werkout.fitness/media/exercise_videos/2_Dumbbell_Lateral_Lunges.mp4")!)
    var workout: Workout
    @Binding var showExecersizeInfo: Bool
    @AppStorage(Constants.thotGenderOption) private var thotGenderOption: String = "female"

    @State var videoExercise: Exercise? {
        didSet {
            if let videoURL = VideoURLCreator.videoURL(
                thotStyle: phoneThotStyle,
                gender: thotGenderOption,
                defaultVideoURLStr: self.videoExercise?.videoURL,
                exerciseName: self.videoExercise?.name,
                workout: bridgeModule.currentExerciseInfo.workout) {
                avPlayer = AVPlayer(url: videoURL)
                avPlayer.play()
            }
        }
    }
    
    var body: some View {
        if let supersets = workout.supersets {
            ScrollViewReader { proxy in
                List() {
                    ForEach(supersets.indices, id: \.self) { supersetIndex in
                        let superset = supersets[supersetIndex]
                        Section(content: {
                            ForEach(superset.exercises.indices, id: \.self) { exerciseIndex in
                                let supersetExecercise = superset.exercises[exerciseIndex]
                                VStack {
                                    HStack {
                                        if bridgeModule.isInWorkout &&
                                            supersetIndex == bridgeModule.currentExerciseInfo.supersetIndex &&
                                            exerciseIndex == bridgeModule.currentExerciseInfo.exerciseIndex {
                                            Image(systemName: "figure.run")
                                                .foregroundColor(Color("appColor"))
                                        }
                                        
                                        Text(supersetExecercise.exercise.extName)
                                        
                                        Spacer()
                                        
                                        if let reps = supersetExecercise.reps,
                                           reps > 0 {
                                            HStack {
                                                Image(systemName: "number")
                                                    .foregroundColor(.white)
                                                    .frame(width: 20, alignment: .leading)
                                                Text("\(reps)")
                                                    .foregroundColor(.white)
                                                    .frame(width: 30, alignment: .trailing)
                                                
                                            }
                                            .padding([.top, .bottom], 5)
                                            .padding([.leading], 10)
                                            .padding([.trailing], 15)
                                            .background(.blue)
                                            .cornerRadius(5, corners: [.topLeft, .bottomLeft])
                                            .frame(alignment: .trailing)
                                        }
                                        
                                        if let duration = supersetExecercise.duration,
                                           duration > 0 {
                                            HStack {
                                                Image(systemName: "stopwatch")
                                                    .foregroundColor(.white)
                                                    .frame(width: 20, alignment: .leading)
                                                Text("\(duration)")
                                                    .foregroundColor(.white)
                                                    .frame(width: 30, alignment: .trailing)
                                            }
                                            .padding([.top, .bottom], 5)
                                            .padding([.leading], 10)
                                            .padding([.trailing], 15)
                                            .background(.green)
                                            .cornerRadius(5, corners: [.topLeft, .bottomLeft])
                                        }
                                    }
                                    .padding(.trailing, -20)
                                    .contentShape(Rectangle())
                                    .onTapGesture {
                                        if bridgeModule.isInWorkout {
                                            bridgeModule.goToExerciseAt(section: supersetIndex, row: exerciseIndex)
                                        } else {
                                            videoExercise = supersetExecercise.exercise
                                        }
                                    }
                                    
                                    if bridgeModule.isInWorkout &&
                                        supersetIndex == bridgeModule.currentExerciseInfo.supersetIndex &&
                                        exerciseIndex == bridgeModule.currentExerciseInfo.exerciseIndex &&
                                        showExecersizeInfo {
                                       detailView(forExercise: supersetExecercise)
                                    }
                                }.id(supersetExecercise.id)
                            }
                        }, header: {
                            HStack {
                                Text(superset.name ?? "--")
                                    .foregroundColor(Color("appColor"))
                                    .bold()
                                Spacer()
                                Text("\(superset.rounds) rounds")
                                    .foregroundColor(Color("appColor"))
                                    .bold()
                                
                                if let estimatedTime = superset.estimatedTime {
                                    Text("@ " + estimatedTime.asString(style: .abbreviated))
                                        .foregroundColor(Color("appColor"))
                                        .bold()
                                }
                            }
                        })
                    }
                }
                .onChange(of: bridgeModule.currentExerciseInfo.allSupersetExecerciseIndex, perform: { newValue in
                    if let newCurrentExercise = bridgeModule.currentExerciseInfo.currentExercise {
                        withAnimation {
                            proxy.scrollTo(newCurrentExercise.id, anchor: .top)
                        }
                    }
                })
                .sheet(item: $videoExercise) { exercise in
                    PlayerView(player: $avPlayer)
                        .onAppear{
                            avPlayer.play()
                        }
                }
            }
        }
    }
    
    func detailView(forExercise supersetExecercise: SupersetExercise) -> some View {
        VStack {
            Text(supersetExecercise.exercise.description)
                .frame(alignment: .leading)
            Divider()
            Text(supersetExecercise.exercise.muscles.map({ $0.name }).joined(separator: ", "))
                .frame(alignment: .leading)
        }
    }
}

//struct ExerciseListView_Previews: PreviewProvider {
//    static var previews: some View {
//        ExerciseListView(workout: PreviewData.workout(), showExecersizeInfo: )
//    }
//}
