import SwiftUI
import FirebaseFirestore

struct ArtistProfileView: View {
    let artist: Artist

    @EnvironmentObject var tweaksManager: TweaksManager

    @State private var selectedSong: UploadedSong?

    @State private var songs: [UploadedSong] = []
    @State private var isLoading: Bool = false
    @State private var errorMessage: String?

    private let db = Firestore.firestore()

    var body: some View {
        ScrollView {
            VStack {
                ArtistProfileHeader(artist: artist)
                
                if isLoading && songs.isEmpty {
                    ProgressView()
                        .padding()
                } else if let error = errorMessage {
                    Text(error)
                        .foregroundStyle(.red)
                        .padding()
                } else {
                    let filteredSongs = tweaksManager.isFocusModeEnabled
                        ? songs.filter { $0.hasBeenRemixed }
                        : songs

                    ForEach(filteredSongs) { song in
                        LibrarySongRow(song: song, playlist: filteredSongs, showRemixIcon: true) { song in
                            selectedSong = song
                        }
                    }
                }
            }
        }
        .ignoresSafeArea(.container, edges: .top)
        .background(Constants.Colors.Background.primary)
        .onAppear {
            fetchArtistSongs()
        }
        .sheet(item: $selectedSong) { item in
            RemixSelectionView(song: item)
        }
    }
    
    private func fetchArtistSongs() {
        isLoading = true
        errorMessage = nil
        
        // Create a reference to the artist
        let artistRef = db.collection("user").document(artist.id)
        
        // Query Firestore for songs where createdBy == this artist
        db.collection("song")
            .whereField("createdBy", isEqualTo: artistRef)
            .order(by: "createdAt", descending: true)
            .getDocuments { querySnapshot, error in
                if let error = error {
                    DispatchQueue.main.async {
                        self.isLoading = false
                        self.errorMessage = "Error fetching songs: \(error.localizedDescription)"
                        print("❌ Error fetching artist songs: \(error)")
                    }
                    return
                }
                
                guard let documents = querySnapshot?.documents else {
                    DispatchQueue.main.async {
                        self.isLoading = false
                        self.songs = []
                    }
                    return
                }
                
                // Parse songs from documents
                let fetchedSongs = documents.compactMap { document -> UploadedSong? in
                    let data = document.data()
                    guard let name = data["name"] as? String,
                          let createdAt = (data["createdAt"] as? Timestamp)?.dateValue(),
                        let lyrics = data["lyrics"] as? String,
                        !lyrics.isEmpty else {
                        return nil
                    }

                    return UploadedSong(
                        id: document.documentID,
                        name: name,
                        artistName: artist.displayName,
                        artistId: artist.id,
                        createdAt: createdAt,
                        imageURL: data["imageURL"] as? String,
                        audioURL: data["audioURL"] as? String,
                        originalPrompt: nil,
                        rewrittenPrompt: nil,
                        hasBeenRemixed: data["hasBeenRemixed"] as? Bool ?? false
                    )
                }

                DispatchQueue.main.async {
                    self.isLoading = false
                    self.songs = fetchedSongs
                    print("✅ Fetched \(fetchedSongs.count) songs for artist \(artist.displayName)")
                }
            }
    }
}

#Preview {
    ZStack {
        Rectangle()
            .foregroundStyle(.black)

        ArtistProfileView(artist: Artist(id: "1", displayName: "Aretha Franklin", isArtist: true, bio: "Just a composer composing things", tags: "classical, opera, piano", avatarURL: "https://firebasestorage.googleapis.com/v0/b/suno-eden.firebasestorage.app/o/users%2F5U9MzHxnq8ODwPLpmZyT%2Favatar_1762473468528.avif?alt=media&token=7ec5a8dd-1965-48d7-bfb3-1d7ed948168c", coverURL: "https://firebasestorage.googleapis.com/v0/b/suno-eden.firebasestorage.app/o/users%2F5U9MzHxnq8ODwPLpmZyT%2Fcover_1762473591490.webp?alt=media&token=09adac33-df9b-4c38-8046-db261778804a"))
    }
}
