import SwiftUI import SwiftData @MainActor @Observable final class GamesHistoryViewModel { private let modelContext: ModelContext var allVisits: [StadiumVisit] = [] var selectedSports: Set = [] { didSet { recomputeFilteredData() } } var isLoading = false var error: String? // Pre-computed stored properties (updated via recomputeFilteredData) private(set) var filteredVisits: [StadiumVisit] = [] private(set) var visitsByYear: [Int: [StadiumVisit]] = [:] private(set) var sortedYears: [Int] = [] private(set) var totalGamesCount: Int = 0 init(modelContext: ModelContext) { self.modelContext = modelContext } func loadGames() async { isLoading = true defer { isLoading = false } let descriptor = FetchDescriptor( sortBy: [SortDescriptor(\.visitDate, order: .reverse)] ) do { allVisits = try modelContext.fetch(descriptor) } catch { self.error = "Failed to load games: \(error.localizedDescription)" allVisits = [] } recomputeFilteredData() } func toggleSport(_ sport: Sport) { if selectedSports.contains(sport) { selectedSports.remove(sport) } else { selectedSports.insert(sport) } } func clearFilters() { selectedSports.removeAll() } private func recomputeFilteredData() { if selectedSports.isEmpty { filteredVisits = allVisits } else { filteredVisits = allVisits.filter { visit in guard let stadium = AppDataProvider.shared.stadium(for: visit.stadiumId) else { return false } return selectedSports.contains(stadium.sport) } } let calendar = Calendar.current visitsByYear = Dictionary(grouping: filteredVisits) { visit in calendar.component(.year, from: visit.visitDate) } sortedYears = visitsByYear.keys.sorted(by: >) totalGamesCount = filteredVisits.count } }