// // SolvervApp.swift // Solverv // // Created by Ivar Løvlie on 15/12/2025. // import SwiftUI import SwiftData import CoreLocation import Combine @main struct SolvervApp: App { @StateObject private var locationManager = LocationManager() var sharedModelContainer: ModelContainer = { let schema = Schema([ Item.self, ]) let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false) do { return try ModelContainer(for: schema, configurations: [modelConfiguration]) } catch { fatalError("Could not create ModelContainer: \(error)") } }() var body: some Scene { WindowGroup { ContentView() .onAppear { locationManager.requestLocationPermission() } } .modelContainer(sharedModelContainer) } } class LocationManager: NSObject, CLLocationManagerDelegate, ObservableObject { let manager = CLLocationManager() @Published var objectWillChange = PassthroughSubject() override init() { super.init() manager.delegate = self } func requestLocationPermission() { if manager.authorizationStatus == .notDetermined { manager.requestWhenInUseAuthorization() } else if manager.authorizationStatus == .authorizedWhenInUse || manager.authorizationStatus == .authorizedAlways { fetchLocation() } else { // Use default location (Greenwich) let defaultLocation = AppGroupManager.UserLocation( latitude: 0.0, longitude: 0.0, timestamp: ISO8601DateFormatter().string(from: Date()), isDefaultLocation: true ) AppGroupManager.shared.saveLocation(defaultLocation) } } func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { if status == .authorizedWhenInUse || status == .authorizedAlways { fetchLocation() } } private func fetchLocation() { manager.startUpdatingLocation() } func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { guard let location = locations.last else { return } let userLocation = AppGroupManager.UserLocation( latitude: location.coordinate.latitude, longitude: location.coordinate.longitude, timestamp: ISO8601DateFormatter().string(from: Date()), isDefaultLocation: false ) AppGroupManager.shared.saveLocation(userLocation) // Calculate and cache sunrise/sunset let sunTimes = SunTimes( latitude: location.coordinate.latitude, longitude: location.coordinate.longitude, date: Date() ) if let sunrise = sunTimes.sunrise(), let sunset = sunTimes.sunset() { let formatter = ISO8601DateFormatter() let cachedTimes = AppGroupManager.SunTimes( date: formatter.string(from: Date()).prefix(10).description, sunrise: formatter.string(from: sunrise), sunset: formatter.string(from: sunset), timestamp: formatter.string(from: Date()) ) AppGroupManager.shared.saveSunTimes(cachedTimes) } manager.stopUpdatingLocation() } }