summaryrefslogtreecommitdiffstats
path: root/Shared/Models/SolsticeData.swift
diff options
context:
space:
mode:
Diffstat (limited to 'Shared/Models/SolsticeData.swift')
-rw-r--r--Shared/Models/SolsticeData.swift96
1 files changed, 96 insertions, 0 deletions
diff --git a/Shared/Models/SolsticeData.swift b/Shared/Models/SolsticeData.swift
new file mode 100644
index 0000000..9285aad
--- /dev/null
+++ b/Shared/Models/SolsticeData.swift
@@ -0,0 +1,96 @@
+import Foundation
+
+class SolsticeData {
+ static let shared = SolsticeData()
+
+ private let events: [SolsticeEvent]
+
+ private init() {
+ var allEvents: [SolsticeEvent] = []
+
+ // 2025
+ allEvents.append(SolsticeEvent(name: "Vårjevndøgn 2025", date: SolsticeData.dateFromUTC(year: 2025, month: 3, day: 20, hour: 9, minute: 1), season: .spring))
+ allEvents.append(SolsticeEvent(name: "Sommersolverv 2025", date: SolsticeData.dateFromUTC(year: 2025, month: 6, day: 20, hour: 14, minute: 42), season: .summer))
+ allEvents.append(SolsticeEvent(name: "Høstjevndøgn 2025", date: SolsticeData.dateFromUTC(year: 2025, month: 9, day: 22, hour: 18, minute: 20), season: .autumn))
+ allEvents.append(SolsticeEvent(name: "Vintersolverv 2025", date: SolsticeData.dateFromUTC(year: 2025, month: 12, day: 21, hour: 15, minute: 3), season: .winter))
+
+ // 2026
+ allEvents.append(SolsticeEvent(name: "Vårjevndøgn 2026", date: SolsticeData.dateFromUTC(year: 2026, month: 3, day: 20, hour: 14, minute: 46), season: .spring))
+ allEvents.append(SolsticeEvent(name: "Sommersolverv 2026", date: SolsticeData.dateFromUTC(year: 2026, month: 6, day: 21, hour: 8, minute: 25), season: .summer))
+ allEvents.append(SolsticeEvent(name: "Høstjevndøgn 2026", date: SolsticeData.dateFromUTC(year: 2026, month: 9, day: 23, hour: 0, minute: 6), season: .autumn))
+ allEvents.append(SolsticeEvent(name: "Vintersolverv 2026", date: SolsticeData.dateFromUTC(year: 2026, month: 12, day: 21, hour: 20, minute: 50), season: .winter))
+
+ // 2027
+ allEvents.append(SolsticeEvent(name: "Vårjevndøgn 2027", date: SolsticeData.dateFromUTC(year: 2027, month: 3, day: 20, hour: 20, minute: 25), season: .spring))
+ allEvents.append(SolsticeEvent(name: "Sommersolverv 2027", date: SolsticeData.dateFromUTC(year: 2027, month: 6, day: 21, hour: 14, minute: 11), season: .summer))
+ allEvents.append(SolsticeEvent(name: "Høstjevndøgn 2027", date: SolsticeData.dateFromUTC(year: 2027, month: 9, day: 23, hour: 6, minute: 2), season: .autumn))
+ allEvents.append(SolsticeEvent(name: "Vintersolverv 2027", date: SolsticeData.dateFromUTC(year: 2027, month: 12, day: 22, hour: 2, minute: 43), season: .winter))
+
+ // 2028
+ allEvents.append(SolsticeEvent(name: "Vårjevndøgn 2028", date: SolsticeData.dateFromUTC(year: 2028, month: 3, day: 20, hour: 2, minute: 17), season: .spring))
+ allEvents.append(SolsticeEvent(name: "Sommersolverv 2028", date: SolsticeData.dateFromUTC(year: 2028, month: 6, day: 20, hour: 20, minute: 2), season: .summer))
+ allEvents.append(SolsticeEvent(name: "Høstjevndøgn 2028", date: SolsticeData.dateFromUTC(year: 2028, month: 9, day: 22, hour: 11, minute: 45), season: .autumn))
+ allEvents.append(SolsticeEvent(name: "Vintersolverv 2028", date: SolsticeData.dateFromUTC(year: 2028, month: 12, day: 21, hour: 8, minute: 20), season: .winter))
+
+ // 2029
+ allEvents.append(SolsticeEvent(name: "Vårjevndøgn 2029", date: SolsticeData.dateFromUTC(year: 2029, month: 3, day: 20, hour: 8, minute: 1), season: .spring))
+ allEvents.append(SolsticeEvent(name: "Sommersolverv 2029", date: SolsticeData.dateFromUTC(year: 2029, month: 6, day: 21, hour: 1, minute: 48), season: .summer))
+ allEvents.append(SolsticeEvent(name: "Høstjevndøgn 2029", date: SolsticeData.dateFromUTC(year: 2029, month: 9, day: 22, hour: 17, minute: 37), season: .autumn))
+ allEvents.append(SolsticeEvent(name: "Vintersolverv 2029", date: SolsticeData.dateFromUTC(year: 2029, month: 12, day: 21, hour: 14, minute: 14), season: .winter))
+
+ // 2030
+ allEvents.append(SolsticeEvent(name: "Vårjevndøgn 2030", date: SolsticeData.dateFromUTC(year: 2030, month: 3, day: 20, hour: 13, minute: 51), season: .spring))
+ allEvents.append(SolsticeEvent(name: "Sommersolverv 2030", date: SolsticeData.dateFromUTC(year: 2030, month: 6, day: 21, hour: 7, minute: 31), season: .summer))
+ allEvents.append(SolsticeEvent(name: "Høstjevndøgn 2030", date: SolsticeData.dateFromUTC(year: 2030, month: 9, day: 22, hour: 23, minute: 27), season: .autumn))
+ allEvents.append(SolsticeEvent(name: "Vintersolverv 2030", date: SolsticeData.dateFromUTC(year: 2030, month: 12, day: 21, hour: 20, minute: 9), season: .winter))
+
+ self.events = allEvents.sorted { $0.date < $1.date }
+ }
+
+ private static func dateFromUTC(year: Int, month: Int, day: Int, hour: Int, minute: Int) -> Date {
+ var components = DateComponents()
+ components.year = year
+ components.month = month
+ components.day = day
+ components.hour = hour
+ components.minute = minute
+ components.second = 0
+ components.timeZone = TimeZone(abbreviation: "UTC")
+ return Calendar(identifier: .gregorian).date(from: components) ?? Date()
+ }
+
+ func nextEvent(from now: Date = Date()) -> SolsticeEvent? {
+ return events.first { $0.date > now }
+ }
+
+ func upcomingEvents(count: Int, from now: Date = Date()) -> [SolsticeEvent] {
+ let futureEvents = events.filter { $0.date > now }
+ return Array(futureEvents.prefix(count))
+ }
+
+ func progressToNextEvent(from now: Date = Date()) -> (elapsed: Int, total: Int)? {
+ guard let _ = nextEvent(from: now) else { return nil }
+
+ let today = Calendar.current.startOfDay(for: now)
+
+ guard let previousEventIndex = events.firstIndex(where: { $0.date > now }) else {
+ return nil
+ }
+
+ guard previousEventIndex > 0 else { return nil }
+
+ let nextEvent = events[previousEventIndex]
+ let previousEvent = events[previousEventIndex - 1]
+
+ let previousEventDay = Calendar.current.startOfDay(for: previousEvent.date)
+ let eventDay = Calendar.current.startOfDay(for: nextEvent.date)
+
+ let elapsedComponents = Calendar.current.dateComponents([.day], from: previousEventDay, to: today)
+ let totalComponents = Calendar.current.dateComponents([.day], from: previousEventDay, to: eventDay)
+
+ let elapsed = max(0, elapsedComponents.day ?? 0)
+ let total = max(1, totalComponents.day ?? 1)
+
+ return (elapsed: elapsed, total: total)
+ }
+}