import SwiftUI

struct LoadingTrack: Identifiable {
    let id = UUID()
}

struct WorkspaceView: View {
    @State private var loadingTracks: [LoadingTrack] = []
    @State private var generatedTracks: [Track] = []
    @State private var showCreateFooter = false
    @State private var currentSongDescription: String = ""
    @State private var currentlyPlayingTrack: Track?
    @State private var showLocalOutOfCreditsAlert = false
    @State private var hasCreatedAnySongs = false
    @State private var showWorkspacesSheet = false
    @State private var searchText: String = ""
    @ObservedObject private var creditsManager = CreditsManager.shared
    @ObservedObject private var generationManager = SongGenerationManager.shared
    let onDismiss: () -> Void
    let onTrackTap: ((Track) -> Void)?
    let onEditPrompt: (() -> Void)?
    let workspaceTitle: String?
    let workspaceImageId: String?
    let chatSongs: [Song]?
    let showBottomBar: Bool
    let showHeader: Bool
    
    init(
        onDismiss: @escaping () -> Void, 
        onTrackTap: ((Track) -> Void)? = nil, 
        onEditPrompt: (() -> Void)? = nil,
        workspaceTitle: String? = nil,
        workspaceImageId: String? = nil,
        chatSongs: [Song]? = nil,
        showBottomBar: Bool = true,
        showHeader: Bool = true
    ) {
        self.onDismiss = onDismiss
        self.onTrackTap = onTrackTap
        self.onEditPrompt = onEditPrompt
        self.workspaceTitle = workspaceTitle
        self.workspaceImageId = workspaceImageId
        self.chatSongs = chatSongs
        self.showBottomBar = showBottomBar
        self.showHeader = showHeader
    }
    
    private let sampleTracks = [
        Track(
            id: "sample-magical-vibes",
            title: "Magical Vibes (Remix)",
            genres: ["Experimental Rock", "Art Rock", "Dance", "Hip-hop"],
            artworkName: "Artwork/1",
            badge: "Cover"
        ),
        Track(
            id: "sample-neon-dreams",
            title: "Neon Dreams (Remix)",
            genres: ["Synthwave", "Electronic", "Ambient"],
            artworkName: "Artwork/2",
            badge: "Cover"
        ),
        Track(
            id: "sample-urban-flow",
            title: "Urban Flow",
            genres: ["Hip-hop", "Trap", "R&B"],
            artworkName: "Artwork/3",
            badge: "Cover"
        ),
        Track(
            id: "sample-ocean-waves",
            title: "Ocean Waves (Extended Mix)",
            genres: ["Ambient", "Chillout", "Downtempo"],
            artworkName: "Artwork/4",
            badge: "Extend"
        ),
        Track(
            id: "sample-digital-horizon",
            title: "Digital Horizon",
            genres: ["Techno", "Industrial", "Electronic"],
            artworkName: "Artwork/5",
            badge: "Cover"
        ),
        Track(
            id: "sample-midnight-jazz",
            title: "Midnight Jazz Session",
            genres: ["Jazz", "Fusion", "Contemporary"],
            artworkName: "Artwork/6",
            badge: "Extend"
        ),
        Track(
            id: "sample-cosmic-journey",
            title: "Cosmic Journey Through Space and Time",
            genres: ["Progressive Rock", "Space Rock", "Psychedelic", "Ambient"],
            artworkName: "Artwork/7",
            badge: "Extend"
        )
    ]
    
    // Convert chat songs to tracks
    private var chatTracks: [Track] {
        guard let songs = chatSongs else { return [] }
        return songs.map { song in
            Track(
                id: song.id,
                title: song.title,
                genres: song.genres,
                artworkName: "Artwork/1", // Placeholder artwork for chat songs
                badge: "Chat"
            )
        }
    }
    
    // Combined tracks to display (chat tracks first, then samples)
    private var displayTracks: [Track] {
        if let _ = chatSongs, !chatTracks.isEmpty {
            // If we have chat songs, show only those
            return chatTracks
        } else {
            // Otherwise show sample tracks
            return sampleTracks
        }
    }
    
    var body: some View {
        VStack(spacing: 0) {
            // Custom Workspace Header (conditional)
            if showHeader {
                HStack {
                // Left side - Back button and title
                HStack(spacing: 12) {
                    Button(action: onDismiss) {
                        Image("Icon/chevron-left")
                            .resizable()
                            .frame(width: 24, height: 24)
                            .foregroundColor(Constants.Colors.Foreground.primary)
                    }
                    .buttonStyle(PlainButtonStyle())
                    
                    HStack(spacing: 8) {
                        if let workspaceImageId = workspaceImageId {
                            Image(workspaceImageId)
                                .resizable()
                                .aspectRatio(contentMode: .fill)
                                .frame(width: 26, height: 26)
                                .clipShape(RoundedRectangle(cornerRadius: 8))
                        }
                        
                        Text(workspaceTitle ?? "Workspace")
                            .font(.custom("PP Neue Montreal", size: 18))
                            .fontWeight(.medium)
                            .foregroundColor(Constants.Colors.Foreground.primary)
                            .tracking(0.36)
                    }
                }
                
                Spacer()
                
                // Right side - Upload and Search buttons
                HStack(spacing: 12) {
                    MediumButton(
                        title: "",
                        leftIconAssetName: "Icon/upload",
                        variant: .primary,
                        isIconOnly: true,
                        action: { print("Upload tapped") }
                    )
                    
                    MediumButton(
                        title: "",
                        leftIconAssetName: "Icon/search",
                        variant: .primary,
                        isIconOnly: true,
                        action: { print("Search tapped") }
                    )
                }
                }
                .padding(.horizontal, 16)
                .padding(.vertical, 12)
                .background(.ultraThinMaterial)
            }
                
            // Filter Navigation
                FilterNavBar()
                
                // Content Area with track cells
                ScrollView {
                    LazyVStack(spacing: 12) {
                        // Loading tracks (shown while generating)
                        ForEach(loadingTracks) { _ in
                            LoadingTrackCell()
                        }
                        
                        // Generated tracks (shown after loading completes)
                        ForEach(generatedTracks, id: \.id) { track in
                            TrackCell(
                                track: track, 
                                onTrackTap: {
                                    print("🎵 WorkspaceView - Track tapped: \(track.title) (ID: \(track.id))")
                                    
                                    // Stop any currently playing track first
                                    if let currentTrack = currentlyPlayingTrack, currentTrack.id != track.id {
                                        print("🛡️ Stopping previous track: \(currentTrack.title)")
                                        NotificationCenter.default.post(
                                            name: NSNotification.Name("PlaybackStateChanged"),
                                            object: nil,
                                            userInfo: [
                                                "trackId": currentTrack.id,
                                                "isPlaying": false
                                            ]
                                        )
                                    }
                                    
                                    // Set the new currently playing track
                                    currentlyPlayingTrack = track
                                    
                                    // Let the MusicPlayer handle the playing state broadcast
                                    onTrackTap?(track)
                                }, 
                                onMoreTap: {
                                    print("More tapped for: \(track.title)")
                                },
                                isCurrentlyPlaying: currentlyPlayingTrack?.id == track.id
                            )
                        }
                        
                        // Display tracks (chat songs if available, otherwise samples)
                        ForEach(displayTracks, id: \.id) { track in
                            TrackCell(
                                track: track, 
                                onTrackTap: {
                                    print("🎵 WorkspaceView - Sample track tapped: \(track.title) (ID: \(track.id))")
                                    
                                    // Stop any currently playing track first
                                    if let currentTrack = currentlyPlayingTrack, currentTrack.id != track.id {
                                        print("🛡️ Stopping previous sample track: \(currentTrack.title)")
                                        NotificationCenter.default.post(
                                            name: NSNotification.Name("PlaybackStateChanged"),
                                            object: nil,
                                            userInfo: [
                                                "trackId": currentTrack.id,
                                                "isPlaying": false
                                            ]
                                        )
                                    }
                                    
                                    // Set the new currently playing track
                                    currentlyPlayingTrack = track
                                    
                                    // Let the MusicPlayer handle the playing state broadcast
                                    onTrackTap?(track)
                                }, 
                                onMoreTap: {
                                    print("More tapped for: \(track.title)")
                                },
                                isCurrentlyPlaying: currentlyPlayingTrack?.id == track.id
                            )
                        }
                        Spacer()
                    }
                    .padding(.vertical, 12)
                }
                .frame(maxWidth: .infinity, maxHeight: .infinity)
                
        }
        .overlay(
            // Combined Floating Footer (Music Player + Create Actions)
            VStack {
                Spacer()
                
                VStack(spacing: 0) {
                    // Music Player (appears above create footer when track is playing)
                    if let currentTrack = currentlyPlayingTrack {
                        MusicPlayer(track: currentTrack)
                            .padding(.horizontal, 8)
                    }
                    
                }
            }
            .allowsHitTesting(true)
        )
        .onAppear {
            print("🚀 WorkspaceView appeared")
            
            // Check if there's already a pending alert
            if creditsManager.showOutOfCreditsAlert {
                showLocalOutOfCreditsAlert = true
                creditsManager.showOutOfCreditsAlert = false
            }
            
            // Sync with generation manager state
            syncWithGenerationManager()
        }
        .onChange(of: generationManager.generationState) { _ in
            // Update workspace when generation state changes
            syncWithGenerationManager()
        }
        .onDisappear {
            NotificationCenter.default.removeObserver(self)
        }
        .onChange(of: creditsManager.showOutOfCreditsAlert) { newValue in
            if newValue {
                // Transfer global alert state to local state
                showLocalOutOfCreditsAlert = true
                creditsManager.showOutOfCreditsAlert = false // Reset global state
            }
        }
        .preferredColorScheme(.dark)
        .outOfCreditsAlert(isPresented: $showLocalOutOfCreditsAlert) {
            // Handle upgrade action
            print("Upgrade tapped from WorkspaceView")
        }
    }
    
    private func syncWithGenerationManager() {
        print("🔄 Syncing workspace with generation manager state: \(generationManager.generationState)")
        
        // Update current song description from generation manager
        if !generationManager.currentSongDescription.isEmpty {
            currentSongDescription = generationManager.currentSongDescription
            print("📝 Updated song description: \(currentSongDescription)")
        }
        
        switch generationManager.generationState {
        case .generating:
            // Convert generated songs to loading tracks
            if !generationManager.currentGeneratedSongs.isEmpty {
                let newLoadingTracks = generationManager.currentGeneratedSongs.compactMap { song in
                    if song.isGenerating {
                        return LoadingTrack()
                    }
                    return nil
                }
                
                if loadingTracks.count != newLoadingTracks.count {
                    loadingTracks = newLoadingTracks
                    hasCreatedAnySongs = true
                    showCreateFooter = true
                }
            }
            
        case .completed:
            // Convert completed generated songs to actual tracks
            let completedSongs = generationManager.currentGeneratedSongs.filter { !$0.isGenerating }
            if !completedSongs.isEmpty {
                // Clear loading tracks
                loadingTracks.removeAll()
                
                // Add completed tracks
                let timestamp = Int(Date().timeIntervalSince1970)
                let newTracks = completedSongs.enumerated().map { index, song in
                    Track(
                        id: "generated-\(timestamp)-\(index)",
                        title: song.title,
                        genres: ["AI Generated", "Electronic"],
                        artworkName: "Artwork/\(index % 8 + 1)",
                        badge: nil
                    )
                }
                
                // Add to generated tracks if not already there
                let newTrackIds = Set(newTracks.map { $0.id })
                let existingTrackIds = Set(generatedTracks.map { $0.id })
                let tracksToAdd = newTracks.filter { !existingTrackIds.contains($0.id) }
                
                if !tracksToAdd.isEmpty {
                    generatedTracks.append(contentsOf: tracksToAdd)
                    hasCreatedAnySongs = true
                    showCreateFooter = true
                }
            }
            
        case .idle, .error:
            // No changes needed for these states
            break
        }
    }
    
    private func addLoadingTracks(hasVideo: Bool, songDescription: String) {
        print("🔄 Starting track generation - HasVideo: \(hasVideo), Description: \(songDescription)")
        print("🔄 Current loadingTracks count: \(loadingTracks.count)")
        print("🔄 Current generatedTracks count: \(generatedTracks.count)")
        
        // Store the song description for the footer
        currentSongDescription = songDescription
        
        // Mark that user has created songs
        hasCreatedAnySongs = true
        
        // Add 2 loading tracks
        loadingTracks.append(contentsOf: [LoadingTrack(), LoadingTrack()])
        print("🔄 Added loading tracks - New count: \(loadingTracks.count)")
        
        // Show create footer immediately when tracks start generating
        showCreateFooter = true
        print("🔄 Set showCreateFooter to true immediately")
        
        // After 3 seconds, replace with actual tracks
        DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) {
            print("🔄 Converting loading tracks to generated tracks...")
            
            // Remove loading tracks
            loadingTracks.removeAll()
            print("🔄 Removed loading tracks - Count now: \(loadingTracks.count)")
            
            // Determine track properties based on video selection
            let trackTitle = hasVideo ? "Wobbly Wiggly (Remix)" : "Untitled"
            let trackBadge = hasVideo ? "Video" : nil // No badge for regular original songs
            let artworkName = hasVideo ? "wobbly_wiggly" : "Artwork/2" // Use default artwork for originals
            
            // Add generated tracks with stable IDs
            let timestamp = Int(Date().timeIntervalSince1970)
            let newTracks = [
                Track(
                    id: "generated-\(timestamp)-1",
                    title: trackTitle,
                    genres: ["Drum n Bass", "Electronic", "Indie"],
                    artworkName: artworkName,
                    badge: trackBadge
                ),
                Track(
                    id: "generated-\(timestamp)-2",
                    title: trackTitle,
                    genres: ["Drum n Bass", "Electronic", "Indie"],
                    artworkName: artworkName,
                    badge: trackBadge
                )
            ]
            
            print("🎵 Generated tracks - Title: \(trackTitle), Badge: \(trackBadge), HasVideo: \(hasVideo)")
            
            // Add to the beginning of generated tracks
            generatedTracks.insert(contentsOf: newTracks, at: 0)
            print("🔄 Added generated tracks - Count now: \(generatedTracks.count)")
        }
    }
    
    private func addRemixTracks(originalTrack: String, description: String) {
        print("🎵 Starting remix track generation - Original: \(originalTrack), Description: \(description)")
        print("🔄 Current loadingTracks count: \(loadingTracks.count)")
        print("🔄 Current generatedTracks count: \(generatedTracks.count)")
        
        // Store the description for the footer
        currentSongDescription = description
        
        // Mark that user has created songs
        hasCreatedAnySongs = true
        
        // Add 2 loading tracks
        loadingTracks.append(contentsOf: [LoadingTrack(), LoadingTrack()])
        print("🔄 Added loading tracks - New count: \(loadingTracks.count)")
        
        // Show create footer immediately when tracks start generating
        showCreateFooter = true
        print("🔄 Set showCreateFooter to true immediately")
        
        // After 3 seconds, replace with actual tracks
        DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) {
            print("🔄 Converting remix loading tracks to generated tracks...")
            
            // Remove loading tracks
            loadingTracks.removeAll()
            print("🔄 Removed loading tracks - Count now: \(loadingTracks.count)")
            
            // Create remix track titles based on original
            let remixTitle1 = "\(originalTrack) (Remix)"
            let remixTitle2 = "\(originalTrack) (Remix)"
            
            // Add generated remix tracks with stable IDs
            let timestamp = Int(Date().timeIntervalSince1970)
            let newTracks = [
                Track(
                    id: "remix-\(timestamp)-1",
                    title: remixTitle1,
                    genres: ["Remix", "Electronic", "Alternative"],
                    artworkName: "Artwork/1",
                    badge: "Cover"
                ),
                Track(
                    id: "remix-\(timestamp)-2",
                    title: remixTitle2,
                    genres: ["Remix", "Extended", "Electronic"],
                    artworkName: "Artwork/2",
                    badge: "Cover"
                )
            ]
            
            print("🎵 Generated remix tracks - Original: \(originalTrack), Count: \(newTracks.count)")
            
            // Add to the beginning of generated tracks
            generatedTracks.insert(contentsOf: newTracks, at: 0)
            print("🔄 Added generated remix tracks - Count now: \(generatedTracks.count)")
        }
    }
}

struct WorkspaceHeader: View {
    let onDismiss: () -> Void
    let title: String?
    
    var body: some View {
        HStack(spacing: 12) {
            // Back Button (Left)
            Button(action: onDismiss) {
                Image("Icon/chevron-left")
                    .resizable()
                    .renderingMode(.template)
                    .foregroundColor(Constants.Colors.Foreground.primary)
                    .frame(width: 24, height: 24)
            }
            .buttonStyle(PlainButtonStyle())
            .frame(width: 40, height: 40)
            .contentShape(Rectangle())
            
            // Workspace Title with dropdown icon and credits
            VStack(alignment: .leading, spacing: 2) {
                HStack(spacing: 2) {
                    Text(title ?? "My Workspace")
                        .font(Constants.Typography.largeTitle)
                        .foregroundColor(Constants.Colors.Foreground.primary)
                        .tracking(0.36)
                    
                    Image("Icon/triangle-down")
                        .resizable()
                        .renderingMode(.template)
                        .foregroundColor(Constants.Colors.Foreground.primary)
                        .frame(width: 16, height: 16)
                }
                
                // Credits Display
                CreditsDisplay()
            }
            
            Spacer()
            
            // Search Button (Right)
            Button(action: {
                // Handle search action
                print("Search workspace")
            }) {
                Image("Icon/search")
                    .resizable()
                    .renderingMode(.template)
                    .foregroundColor(Constants.Colors.Foreground.primary)
                    .frame(width: 16, height: 16)
            }
            .frame(width: 40, height: 40)
            .background(Constants.Colors.Background.tertiary)
            .clipShape(Circle())
        }
        .padding(.horizontal, 16)
        .padding(.bottom, 8)
        .frame(height: 56)
    }
}

// MARK: - Preview
struct WorkspaceWindowOverlay: UIViewRepresentable {
    let onDismiss: () -> Void
    
    func makeUIView(context: Context) -> UIView {
        let view = UIView()
        return view
    }
    
    func updateUIView(_ uiView: UIView, context: Context) {
        // Present the workspace in a new window above the sheet
        DispatchQueue.main.async {
            guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else { return }
            
            let window = UIWindow(windowScene: windowScene)
            window.windowLevel = UIWindow.Level.normal - 1
            window.backgroundColor = .clear
            
            let hostingController = UIHostingController(rootView: 
                WorkspaceView(onDismiss: {
                    window.isHidden = true
                    onDismiss()
                })
            )
            hostingController.view.backgroundColor = .clear
            
            window.rootViewController = hostingController
            window.makeKeyAndVisible()
            
            // Store reference to prevent deallocation
            context.coordinator.window = window
        }
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator()
    }
    
    class Coordinator {
        var window: UIWindow?
        
        deinit {
            window?.isHidden = true
        }
    }
}



#Preview {
    WorkspaceView(
        onDismiss: {}, 
        onTrackTap: nil, 
        onEditPrompt: nil,
        workspaceTitle: "Sample Workspace",
        workspaceImageId: "Artwork/3"
    )
}
