import SwiftUI


struct CreateView: View {
    @State private var showWorkspace = false
    @State private var showPersonas = false
    @State private var showAudioTrimmerSelection = false
    @State private var lyricsDescription: String = ""
    @State private var styleDescription: String = ""
    @State private var selectedModel: String = "v4.5"
    @State private var isKeyboardVisible: Bool = false

    // Advanced options state
    @State private var weirdnessValue: Double = 0.5
    @State private var styleInfluenceValue: Double = 0.5
    @State private var audioInfluenceValue: Double = 0.5
    @State private var vocalGender: String = "Female"
    @ObservedObject private var creditsManager = CreditsManager.shared
    @ObservedObject private var generationManager = SongGenerationManager.shared
    @Environment(\.dismiss) private var dismiss
    
    // Callbacks for chat integration
    let onSendMessage: ((String) -> Void)?
    let onDismissToChat: (() -> Void)?
    let isEditingLyrics: Bool
    let currentlyPlayingSong: Song?
    let currentlyPlayingSongId: String?
    let onSongPlayPause: ((String) -> Void)?
    let lyricsFocusMode: Bool
    let audioManager: AudioManager?
    
    init(onSendMessage: ((String) -> Void)? = nil, onDismissToChat: (() -> Void)? = nil, initialLyrics: String = "", initialStyle: String = "", isEditingLyrics: Bool = false, currentlyPlayingSong: Song? = nil, currentlyPlayingSongId: String? = nil, onSongPlayPause: ((String) -> Void)? = nil, lyricsFocusMode: Bool = false, audioManager: AudioManager? = nil) {
        self.onSendMessage = onSendMessage
        self.onDismissToChat = onDismissToChat
        self.isEditingLyrics = isEditingLyrics
        self.currentlyPlayingSong = currentlyPlayingSong
        self.currentlyPlayingSongId = currentlyPlayingSongId
        self.onSongPlayPause = onSongPlayPause
        self.audioManager = audioManager
        self.lyricsFocusMode = lyricsFocusMode
        self._lyricsDescription = State(initialValue: initialLyrics)
        self._styleDescription = State(initialValue: initialStyle)
    }
    
    var body: some View {
        GeometryReader { geometry in
            ZStack {
                VStack(spacing: 0) {

                    ScrollViewWithSheetSupport {
                        VStack(spacing: 16) {
                            // Audio Player (when there's a selected song)
                            if let selectedSong = currentlyPlayingSong {
                                CreateAudioPlayer(
                                    songTitle: selectedSong.title,
                                    artworkGradient: createGradientForSong(selectedSong),
                                    isPlaying: currentlyPlayingSongId == selectedSong.id,
                                    onPlayPause: {
                                        onSongPlayPause?(selectedSong.id)
                                    },
                                    audioManager: audioManager
                                )
                            }

                            // Lyrics Description Component
                            LyricsDescription(
                                lyricsText: $lyricsDescription,
                                startExpanded: true,
                                placeholderText: "Write lyrics or prompt",
                                onSaveLyrics: { currentLyricsText in
                                    print("Save lyrics: \(currentLyricsText)")
                                },
                                showOnlyUndo: false,
                                hideFooterControls: false,
                                customHeight: lyricsFocusMode ? 340 : nil
                            )

                            // Style Description Component (collapsed in lyrics focus mode)
                            StyleDescription(
                                styleText: $styleDescription,
                                modelVersion: selectedModel,
                                startExpanded: !lyricsFocusMode
                            ) { currentStyleText in
                                print("Save style: \(currentStyleText)")
                            }

                            // Advanced Options Component
                            AdvancedOptions(
                                weirdnessValue: $weirdnessValue,
                                styleInfluenceValue: $styleInfluenceValue,
                                audioInfluenceValue: $audioInfluenceValue,
                                vocalGender: $vocalGender
                            )


                            // Extra padding at bottom for floating elements in both modes
                            Spacer()
                                .frame(height: 120)

                            // Extra padding at bottom for floating elements
                            Spacer()
                                .frame(height: 40)
                        }
                        .padding(16)
                    }

                }
            }
        }
        .sheet(isPresented: $showWorkspace) {
            WorkspaceView(
                onDismiss: {
                    showWorkspace = false
                },
                onTrackTap: { track in
                    // Handle track tap if needed
                    print("Track tapped: \(track.title)")
                },
                onEditPrompt: {
                    showWorkspace = false
                    // CreateView remains open underneath
                }
            )
            .presentationDetents([.large])
            .presentationDragIndicator(.hidden)
            .presentationBackground {
                Color(Constants.Colors.Background.secondary)
            }
        }
        .sheet(isPresented: $showAudioTrimmerSelection) {
            AudioTrimmerSelectionView(
                isPresented: $showAudioTrimmerSelection,
                totalDuration: 120.0, // Default 2 minutes
                currentPosition: 10.0, // Default 10 seconds
                onCancel: {
                    print("Audio trimmer cancelled")
                },
                onContinue: { startTime, endTime in
                    print("Audio trimmer selection: \(startTime)s to \(endTime)s")
                    // Handle the selected audio segment
                }
            )
            .presentationDetents([.large])
            .presentationDragIndicator(.hidden)
        }
        .preferredColorScheme(.dark)
        .outOfCreditsAlert(isPresented: $creditsManager.showOutOfCreditsAlert) {
            // Handle upgrade action
            print("Upgrade tapped from CreateView")
        }
        .personasSheet(
            isPresented: $showPersonas,
            detents: [.medium, .large],
            onPersonaSelected: { persona in
                print("Selected persona: \(persona.name)")
                // Handle persona selection - could set a state or modify song creation
            },
            onCreatePersona: {
                print("Create new persona from CreateView")
                // Handle persona creation
            }
        )
        .onAppear {
            // Pre-fill fields if in editing mode
            if generationManager.isEditingMode {
                populateFieldsFromGenerationManager()
            }
            
            // Setup keyboard notifications
            NotificationCenter.default.addObserver(
                forName: UIResponder.keyboardWillShowNotification,
                object: nil,
                queue: .main
            ) { _ in
                withAnimation(.easeInOut(duration: 0.3)) {
                    isKeyboardVisible = true
                }
            }
            
            NotificationCenter.default.addObserver(
                forName: UIResponder.keyboardWillHideNotification,
                object: nil,
                queue: .main
            ) { _ in
                withAnimation(.easeInOut(duration: 0.3)) {
                    isKeyboardVisible = false
                }
            }
        }
        .onDisappear {
            // Remove keyboard notifications
            NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
            NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
        }
    }
    
    
    private func populateFieldsFromGenerationManager() {
        print("📝 Populating CreateView fields from generation manager")
        
        // Populate from stored song info
        if let songInfo = generationManager.currentSongInfo as? [String: Any] {
            styleDescription = songInfo["styleDescription"] as? String ?? ""
            lyricsDescription = songInfo["lyricsDescription"] as? String ?? ""
            selectedModel = songInfo["modelVersion"] as? String ?? "v4.5"
        }
        
        print("✅ Fields populated - Style: '\(styleDescription)', Lyrics: '\(lyricsDescription)'")
    }
    
    private func formatSongCreationMessage(lyrics: String, style: String, modelVersion: String) -> String {
        var messageParts: [String] = []
        
        // Add base request
        messageParts.append("Can you create custom a song:")
        
        // Add lyrics if provided
        if !lyrics.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {
            messageParts.append("\n\nLyrics:\n\(lyrics)")
        }
        
        // Add style if provided  
        if !style.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {
            messageParts.append("\n\nStyle:\n\(style)")
        }
        
        // Add model version
        messageParts.append("\n\nModel: \(modelVersion)")
        
        // TODO: Add advanced options when implemented
        
        return messageParts.joined(separator: "")
    }
    
    
    private func createGradientForSong(_ song: Song) -> LinearGradient {
        // Use the same gradient creation logic as ChatView
        guard let artwork = song.artwork else {
            // Default gradient
            return LinearGradient(
                colors: [
                    Color(red: 0.8, green: 0.4, blue: 0.9),
                    Color(red: 0.4, green: 0.6, blue: 1.0)
                ],
                startPoint: .topLeading,
                endPoint: .bottomTrailing
            )
        }
        
        // Create consistent gradient based on artwork string hash
        let hash = artwork.hashValue
        let seed1 = abs(hash % 1000)
        let seed2 = abs((hash / 1000) % 1000)
        
        return LinearGradient(
            colors: [
                Color(
                    red: 0.3 + (Double(seed1 % 600) / 1000.0),
                    green: 0.3 + (Double((seed1 + 200) % 600) / 1000.0),
                    blue: 0.3 + (Double((seed1 + 400) % 600) / 1000.0)
                ),
                Color(
                    red: 0.3 + (Double(seed2 % 600) / 1000.0),
                    green: 0.3 + (Double((seed2 + 200) % 600) / 1000.0),
                    blue: 0.3 + (Double((seed2 + 400) % 600) / 1000.0)
                )
            ],
            startPoint: .topLeading,
            endPoint: .bottomTrailing
        )
    }
}


#Preview {
    CreateView()
}
