import SwiftUI

struct CreateExtendPlayer: View {
    @State private var isPlaying = false
    @State private var selectionEnd: Double = 0.5 // Default to 50% of the track
    @State private var duration: Double = 180 // Default 3:00 in seconds
    
    let trackTitle: String
    let albumArtwork: String?
    let artworkGradient: LinearGradient?
    let onSelectionChanged: ((Double) -> Void)?
    let onExtensionTimeChanged: ((String) -> Void)?
    
    init(
        trackTitle: String = "Nocturnal Apparition", 
        albumArtwork: String? = "Artwork/2",
        artworkGradient: LinearGradient? = nil,
        duration: Double = 180,
        onSelectionChanged: ((Double) -> Void)? = nil,
        onExtensionTimeChanged: ((String) -> Void)? = nil
    ) {
        self.trackTitle = trackTitle
        self.albumArtwork = albumArtwork
        self.artworkGradient = artworkGradient
        self.duration = duration
        self.onSelectionChanged = onSelectionChanged
        self.onExtensionTimeChanged = onExtensionTimeChanged
    }
    
    // Helper function to format time duration
    private func formatTime(_ seconds: TimeInterval) -> String {
        let minutes = Int(seconds) / 60
        let remainingSeconds = Int(seconds) % 60
        return String(format: "%d:%02ds", minutes, remainingSeconds)
    }
    
    var body: some View {
        VStack(spacing: 16) {
            // Header with play button and title
            HStack(spacing: 16) {
                Button(action: { isPlaying.toggle() }) {
                    ZStack {
                        // Use ArtworkShader if gradient is provided, otherwise fallback to image or solid color
                        if let gradient = artworkGradient {
                            ArtworkShader(gradient: gradient, isAlive: isPlaying)
                                .frame(width: 40, height: 40)
                                .cornerRadius(12)
                        } else if let artwork = albumArtwork {
                            Image(artwork)
                                .resizable()
                                .aspectRatio(contentMode: .fill)
                                .frame(width: 40, height: 40)
                                .clipShape(RoundedRectangle(cornerRadius: 12))
                        } else {
                            RoundedRectangle(cornerRadius: 12)
                                .fill(Color.black.opacity(0.5))
                                .frame(width: 40, height: 40)
                        }
                        
                        Image(systemName: isPlaying ? "pause.fill" : "play.fill")
                            .foregroundColor(Constants.Colors.Foreground.primary)
                            .font(.system(size: 12))
                    }
                }
                .buttonStyle(PlainButtonStyle())
                
                Text(trackTitle)
                    .font(Constants.Typography.small)
                    .foregroundColor(Constants.Colors.Foreground.primary)
                    .tracking(0.28)
                    .lineLimit(1)
                
                Spacer()
            }
            
            // RightHandleAudioTrimmer component
            RightHandleAudioTrimmer(
                selectionEnd: $selectionEnd,
                totalDuration: duration,
                onSelectionChanged: { newEnd in
                    onSelectionChanged?(newEnd)
                    onExtensionTimeChanged?(formatTime(newEnd * duration))
                }
            )
            
            // Extension timing info
            Text("Extension begins after \(formatTime(selectionEnd * duration))")
                .font(Constants.Typography.xSmallRegular)
                .foregroundColor(Constants.Colors.Foreground.primary.opacity(0.3))
                .tracking(0.24)
                .multilineTextAlignment(.center)
        }
        .padding(16)
        .background(
            RoundedRectangle(cornerRadius: 16)
                .fill(Constants.Colors.Background.Fog.thin)
        )
        .onAppear {
            // Call the callback initially with the default selection
            onExtensionTimeChanged?(formatTime(selectionEnd * duration))
        }
    }
}

#Preview {
    VStack(spacing: 20) {
        CreateExtendPlayer(
            trackTitle: "Nocturnal Apparition",
            albumArtwork: "Artwork/2",
            duration: 180,
            onSelectionChanged: { newEnd in
                print("Extension point changed to: \(newEnd)")
            }
        )
        
        CreateExtendPlayer(
            trackTitle: "Magical Vibes",
            albumArtwork: nil,
            duration: 240,
            onSelectionChanged: { newEnd in
                print("Extension point changed to: \(newEnd)")
            }
        )
    }
    .padding()
    .background(Constants.Colors.Background.primary)
    .preferredColorScheme(.dark)
}