import SwiftUI

struct CircularProgressBar: View {
    let progress: Double // 0.0 to 1.0
    let onProgressChanged: (Double) -> Void
    let onScrubStart: (() -> Void)?
    let onScrubEnd: (() -> Void)?
    
    @State private var isDragging: Bool = false
    @State private var dragOffset: CGSize = .zero
    
    private let lineWidth: CGFloat = 4
    private let radius: CGFloat = 38 // 80px diameter = 40px radius, minus 2px for stroke width
    
    var body: some View {
        ZStack {
            // Background track
            Circle()
                .stroke(Color.white.opacity(0.1), lineWidth: lineWidth)
                .frame(width: radius * 2, height: radius * 2)
            
            // Progress arc
            Circle()
                .trim(from: 0, to: progress)
                .stroke(
                    Constants.Colors.Accent.brand,
                    style: StrokeStyle(lineWidth: lineWidth, lineCap: .round)
                )
                .frame(width: radius * 2, height: radius * 2)
                .rotationEffect(.degrees(-90)) // Start from top
                .animation(.easeOut(duration: 0.2), value: progress)
            
            // Invisible ring overlay for gesture detection (donut shape to avoid center)
            Circle()
                .stroke(Color.clear, lineWidth: 20) // Ring-shaped tap area
                .frame(width: radius * 2, height: radius * 2)
                .contentShape(Circle().stroke(lineWidth: 20))
                .gesture(
                    DragGesture(minimumDistance: 0)
                        .onChanged { value in
                            if !isDragging {
                                isDragging = true
                                onScrubStart?()
                            }
                            
                            let center = CGPoint(x: radius + 10, y: radius + 10)
                            let angle = angleFromCenter(center: center, point: value.location)
                            let normalizedProgress = max(0, min(1, angle / (2 * .pi)))
                            
                            onProgressChanged(normalizedProgress)
                        }
                        .onEnded { _ in
                            isDragging = false
                            onScrubEnd?()
                        }
                )
        }
    }
    
    private func angleFromCenter(center: CGPoint, point: CGPoint) -> Double {
        let deltaX = point.x - center.x
        let deltaY = point.y - center.y
        let angle = atan2(deltaY, deltaX) + .pi / 2 // Adjust to start from top
        return angle < 0 ? angle + 2 * .pi : angle
    }
}

#Preview {
    VStack(spacing: 20) {
        CircularProgressBar(
            progress: 0.25,
            onProgressChanged: { newProgress in
                print("Progress changed to: \(newProgress)")
            },
            onScrubStart: {
                print("Started scrubbing")
            },
            onScrubEnd: {
                print("Ended scrubbing")
            }
        )
        
        CircularProgressBar(
            progress: 0.67,
            onProgressChanged: { newProgress in
                print("Progress changed to: \(newProgress)")
            },
            onScrubStart: {
                print("Started scrubbing")
            },
            onScrubEnd: {
                print("Ended scrubbing")
            }
        )
    }
    .padding()
    .background(Constants.Colors.Background.primary)
}