2024-02-01 21:46:08 +01:00

81 lines
2.0 KiB
Swift

import Foundation
import Collections
import HealthKit
private let df: DateFormatter = {
let df = DateFormatter()
df.timeZone = .current
df.dateStyle = .short
df.timeStyle = .short
return df
}()
struct Workout {
let id: Int
/// The distance in km (?)
let totalDistance: Double?
let goal: Goal?
let condenserVersion: Int?
let condenserDate: Date?
let events: [HKWorkoutEvent]
let activities: [HKWorkoutActivity]
let metadata: OrderedDictionary<Metadata.Key, Metadata.Value>
var firstActivityDate: Date? {
activities.map { $0.startDate }.min()
}
var firstEventDate: Date? {
events.map { $0.dateInterval.start }.min()
}
var firstAvailableDate: Date? {
[condenserDate, firstEventDate, firstActivityDate].compactMap { $0 }.min()
}
var dateString: String {
guard let firstAvailableDate else {
return "No date"
}
return df.string(from: firstAvailableDate)
}
var typeString: String {
activities.first?.workoutConfiguration.activityType.description ?? "Unknown activity"
}
init(id: Int, totalDistance: Double? = nil, goalType: Int? = nil, goal: Double? = nil, condenserVersion: Int? = nil, condenserDate: Date? = nil, events: [HKWorkoutEvent] = [], activities: [HKWorkoutActivity] = [], metadata: [Metadata.Key : Metadata.Value] = [:]) {
self.id = id
self.totalDistance = totalDistance
self.goal = .init(goalType: goalType, goal: goal)
self.condenserVersion = condenserVersion
self.condenserDate = condenserDate
self.events = events
self.activities = activities
self.metadata = .init(uniqueKeys: metadata.keys, values: metadata.values)
}
}
extension Workout: Identifiable { }
extension Workout: Equatable {
static func == (lhs: Workout, rhs: Workout) -> Bool {
lhs.id == rhs.id
}
}
extension Workout: Hashable {
func hash(into hasher: inout Hasher) {
hasher.combine(id)
}
}