import Foundation import Combine @MainActor final class WorkspaceStore: ObservableObject { @Published private(set) var workspaces: [SonarWorkspace] = [.personal] @Published var selectedWorkspaceID: UUID = SonarWorkspace.personal.id private let driveStore = ICloudDriveStore.shared private let fileName = "workspaces.json" var selectedWorkspace: SonarWorkspace { workspaces.first(where: { $0.id == selectedWorkspaceID }) ?? .personal } init() { load() } func load() { do { guard let saved = try driveStore.read([SonarWorkspace].self, fileName: fileName), !saved.isEmpty else { persist() return } workspaces = saved if !workspaces.contains(where: { $0.id == selectedWorkspaceID }) { selectedWorkspaceID = workspaces.first?.id ?? SonarWorkspace.personal.id } } catch { // Keep Personal usable if iCloud is temporarily unavailable. workspaces = [.personal] } } func createTeam(name: String) { let clean = name.trimmingCharacters(in: .whitespacesAndNewlines) guard !clean.isEmpty else { return } let team = SonarWorkspace(name: clean, kind: .team, role: .owner) workspaces.append(team) selectedWorkspaceID = team.id persist() } func select(_ workspace: SonarWorkspace) { selectedWorkspaceID = workspace.id } private func persist() { try? driveStore.write(workspaces, fileName: fileName) } }