import SwiftUI
import Foundation

class WorkspaceManager: ObservableObject {
    static let shared = WorkspaceManager()
    
    @Published var workspaces: [LibraryWorkspace] = []
    @Published var workspaceSongs: [String: [Song]] = [:] // [workspaceId: [Song]]
    
    private let userDefaults = UserDefaults.standard
    private let workspacesKey = "SavedWorkspaces"
    private let workspaceSongsKey = "WorkspaceSongs"
    
    private init() {
        loadWorkspaces()
        loadWorkspaceSongs()
    }
    
    func createWorkspace(title: String, songCount: Int = 0) -> LibraryWorkspace {
        let workspace = LibraryWorkspace(
            id: UUID().uuidString,
            name: title,
            songCount: songCount,
            lastModified: Date(),
            imageId: getRandomArtworkImage()
        )

        // Add to the beginning of the list (most recent first)
        workspaces.insert(workspace, at: 0)
        saveWorkspaces()

        return workspace
    }
    
    func updateWorkspaceSongCount(id: String, songCount: Int) {
        if let index = workspaces.firstIndex(where: { $0.id == id }) {
            workspaces[index] = LibraryWorkspace(
                id: workspaces[index].id,
                name: workspaces[index].name,
                songCount: songCount,
                lastModified: Date(),
                imageId: workspaces[index].imageId
            )

            // Move updated workspace to top
            let updatedWorkspace = workspaces.remove(at: index)
            workspaces.insert(updatedWorkspace, at: 0)

            saveWorkspaces()
        }
    }
    
    func deleteWorkspace(id: String) {
        workspaces.removeAll { $0.id == id }
        workspaceSongs.removeValue(forKey: id)
        saveWorkspaces()
        saveWorkspaceSongs()
    }
    
    func addSongToWorkspace(workspaceId: String, song: Song) {
        // Add song to workspace
        if workspaceSongs[workspaceId] == nil {
            workspaceSongs[workspaceId] = []
        }
        workspaceSongs[workspaceId]?.insert(song, at: 0) // Add to beginning (most recent first)
        
        // Update workspace song count
        let currentCount = workspaceSongs[workspaceId]?.count ?? 0
        updateWorkspaceSongCount(id: workspaceId, songCount: currentCount)
        
        saveWorkspaceSongs()
    }
    
    func getSongsForWorkspace(workspaceId: String) -> [Song] {
        return workspaceSongs[workspaceId] ?? []
    }
    
    private func loadWorkspaces() {
        if let data = userDefaults.data(forKey: workspacesKey),
           let decodedWorkspaces = try? JSONDecoder().decode([LibraryWorkspace].self, from: data) {
            workspaces = decodedWorkspaces
        } else {
            // Load with sample data if no saved workspaces exist
            loadSampleWorkspaces()
        }
    }
    
    private func saveWorkspaces() {
        if let encoded = try? JSONEncoder().encode(workspaces) {
            userDefaults.set(encoded, forKey: workspacesKey)
        }
    }
    
    private func loadWorkspaceSongs() {
        if let data = userDefaults.data(forKey: workspaceSongsKey),
           let decodedSongs = try? JSONDecoder().decode([String: [Song]].self, from: data) {
            workspaceSongs = decodedSongs
        }
    }
    
    private func saveWorkspaceSongs() {
        if let encoded = try? JSONEncoder().encode(workspaceSongs) {
            userDefaults.set(encoded, forKey: workspaceSongsKey)
        }
    }
    
    private func loadSampleWorkspaces() {
        let now = Date()
        workspaces = [
            LibraryWorkspace(id: "sample-1", name: "My Workspace", songCount: 15, lastModified: now.addingTimeInterval(-120), imageId: "Artwork/1"), // 2 min ago
            LibraryWorkspace(id: "sample-2", name: "Abbot Kinney Beats", songCount: 10, lastModified: now.addingTimeInterval(-7200), imageId: "Artwork/2"), // 2h ago
            LibraryWorkspace(id: "sample-3", name: "NYC Beats", songCount: 3, lastModified: now.addingTimeInterval(-172800), imageId: "Artwork/3"), // 2d ago
            LibraryWorkspace(id: "sample-4", name: "CAM Beats", songCount: 5, lastModified: now.addingTimeInterval(-5184000), imageId: "Artwork/4"), // 2mo ago
            LibraryWorkspace(id: "sample-5", name: "Remixes", songCount: 11, lastModified: now.addingTimeInterval(-63072000), imageId: "Artwork/5") // 2y ago
        ]
    }
    
    private func getRandomArtworkImage() -> String {
        // Generate random number between 1 and 8 (assuming you have Artwork/1 through Artwork/8)
        let randomNumber = Int.random(in: 1...8)
        return "Artwork/\(randomNumber)"
    }
}

