summaryrefslogtreecommitdiffstats
path: root/Shared/Models/SolsticeEvent.swift
blob: 6126d2be7087424ff2e7ee42e5ea06e7b011d0cd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import Foundation

struct SolsticeEvent: Identifiable, Codable {
    let id: UUID
    let date: Date
    let season: Season

    init(date: Date, season: Season) {
        self.id = UUID()
        self.date = date
        self.season = season
    }

    /// Full display name including year, e.g. "Vårjevndøgn 2026".
    var name: String {
        let year = Calendar.current.component(.year, from: date)
        return "\(season.eventName) \(year)"
    }

    /// Event type name without year, e.g. "Vårjevndøgn".
    var shortName: String {
        season.eventName
    }

    func localDateTime() -> Date {
        let utcCalendar = Calendar(identifier: .gregorian)
        let utcComponents = utcCalendar.dateComponents([.year, .month, .day, .hour, .minute, .second], from: date)
        let timeZone = TimeZone.current
        let offset = timeZone.secondsFromGMT(for: date)
        var localCalendar = Calendar.current
        localCalendar.timeZone = timeZone
        var localComponents = utcComponents
        localComponents.second = (localComponents.second ?? 0) + offset
        return localCalendar.date(from: localComponents) ?? date
    }

    func daysUntil(from now: Date = Date()) -> Int {
        let today = Calendar.current.startOfDay(for: now)
        let eventDay = Calendar.current.startOfDay(for: date)
        let components = Calendar.current.dateComponents([.day], from: today, to: eventDay)
        return max(0, components.day ?? 0)
    }
}