import SwiftUI
import FirebaseFirestore
import FirebaseAuth

class LibrarySongManager: ObservableObject {
    static let shared = LibrarySongManager()

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

    private let db = Firestore.firestore()
    private var listener: ListenerRegistration?

    private init() {}

    func fetchUserCreatedSongs() {
        isLoading = true
        errorMessage = nil

        // Get the current user
        guard let currentUser = Auth.auth().currentUser else {
            DispatchQueue.main.async {
                self.isLoading = false
                self.errorMessage = "Not logged in"
                self.songs = []
            }
            print("❌ No current user found")
            return
        }

        // Create a reference to the current user
        let userRef = db.collection("user").document(currentUser.uid)

        // Query Firestore for songs where createdBy == current user (ignore isUpload flag)
        listener = db.collection("song")
            .whereField("createdBy", isEqualTo: userRef)
            .order(by: "createdAt", descending: true) // Most recent first
            .addSnapshotListener { [weak self] querySnapshot, error in
                guard let self = self else { return }

                if let error = error {
                    self.isLoading = false
                    self.errorMessage = "Error fetching songs: \(error.localizedDescription)"
                    print("❌ Error fetching user songs: \(error)")
                    return
                }

                guard let documents = querySnapshot?.documents else {
                    self.isLoading = false
                    self.errorMessage = "No songs found"
                    self.songs = []
                    return
                }

                // Fetch all songs with their artist info
                self.fetchSongsWithArtistInfo(creatorName: Auth.auth().currentUser?.displayName ?? "Me", documents: documents)
            }
    }

    private func fetchSongsWithArtistInfo(creatorName: String, documents: [QueryDocumentSnapshot]) {
        var fetchedSongs: [UploadedSong] = []

        for document in documents {
            let data = document.data()
            guard let name = data["name"] as? String,
                  let createdAt = (data["createdAt"] as? Timestamp)?.dateValue(),
                  let createdByRef = data["createdBy"] as? DocumentReference else {
                continue
            }

            let song = UploadedSong(
                id: document.documentID,
                name: data["name"] as? String ?? "",
                artistName: creatorName,
                artistId: createdByRef.documentID,
                createdAt: createdAt,
                imageURL: data["imageURL"] as? String,
                audioURL: data["audioURL"] as? String,
                originalPrompt: data["originalPrompt"] as? String,
                rewrittenPrompt: data["rewrittenPrompt"] as? String,
                status: data["status"] as? String,
                rootRemixSongId: (data["rootRemixSong"] as? DocumentReference)?.documentID,
                isCreatedByCurrentUser: true,
                isLikedByCreator: data["isLikedByCreator"] as? Bool ?? false
            )

            fetchedSongs.append(song)
        }

        print("Fetched \(fetchedSongs.count) library songs")

        self.isLoading = false
        self.songs = fetchedSongs

        LikedSongsManager.shared.migrateIfNeeded()
    }

    func stopListening() {
        listener?.remove()
        listener = nil
    }

    func setIsLikedByCreator(_ isLikedByCreator: Bool, forSongWithId songId: String, completion: @escaping (Error?) -> Void) {
        guard songs.contains(where: { $0.id == songId }) else {
            print("Song not found in library")
            return
        }
        db.collection("song").document(songId).updateData([
            "isLikedByCreator": isLikedByCreator
        ]) { error in
            if let error = error {
                print("❌ Error updating isLikedByCreator: \(error)")
            }
            DispatchQueue.main.async {
                completion(error)
            }
        }
    }
    
    deinit {
        stopListening()
    }
}

