import Foundation

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

    @Published private var likedSongIds: Set<String> = []

    private let userDefaults = UserDefaults.standard
    private let likedSongsKey = "likedSongs"

    private init() {
        loadLikedSongs()
    }

    // MARK: - Public Methods

    func isLiked(_ songId: String) -> Bool {
        return likedSongIds.contains(songId)
    }

    func toggleLike(for songId: String) -> Bool {
        if likedSongIds.contains(songId) {
            likedSongIds.remove(songId)
            saveLikedSongs()
            return false
        } else {
            likedSongIds.insert(songId)
            saveLikedSongs()
            return true
        }
    }

    func getLikedCount(for songId: String) -> Int {
        return isLiked(songId) ? 1 : 0
    }

    func getAllLikedSongIds() -> Set<String> {
        return likedSongIds
    }

    func migrateIfNeeded() {
        let libraryManager = LibrarySongManager.shared
        for songId in likedSongIds {
            print("Migrating song \(songId)")
            libraryManager.setIsLikedByCreator(true, forSongWithId: songId) { error in
                if let error = error {
                    print("Failed to migrate song \(songId): \(error)")
                    return
                }
                print("Successfully migrated song \(songId)")
                self.likedSongIds.remove(songId)
                self.saveLikedSongs()
            }
        }
    }

    // MARK: - Private Methods
    
    private func loadLikedSongs() {
        if let data = userDefaults.data(forKey: likedSongsKey),
           let songIds = try? JSONDecoder().decode(Set<String>.self, from: data) {
            likedSongIds = songIds
        }
    }
    
    private func saveLikedSongs() {
        if let data = try? JSONEncoder().encode(likedSongIds) {
            userDefaults.set(data, forKey: likedSongsKey)
        }
    }
}
