Files
ChWebsiteApp/CHDataManagement/Workouts/RouteOverview.swift
2025-08-31 16:27:32 +02:00

55 lines
1.7 KiB
Swift

import Foundation
struct RouteOverview {
/// The total active energy in kcal
let energy: Double
/// The total distance of the track in meters
let distance: Double
/// The total duration in seconds
let duration: TimeInterval
/// The total ascended altitude in meters
let ascendedElevation: Double
let start: Date?
let end: Date?
static func combine(_ overviews: [RouteOverview]) -> RouteOverview {
RouteOverview(
energy: overviews.reduce(0) { $0 + $1.energy },
distance: overviews.reduce(0) { $0 + $1.distance },
duration: overviews.reduce(0) { $0 + $1.duration },
ascendedElevation: overviews.reduce(0) { $0 + $1.ascendedElevation },
start: overviews.compactMap { $0.start }.min(),
end: overviews.compactMap { $0.end }.max())
}
var days: Int {
guard let start, let end else {
return 0
}
return start.inclusiveDays(to: end)
}
}
extension RouteOverview {
func update(labels: inout [ContentLabel], language: ContentLanguage) {
let locale = language.locale
let days = self.days
if days != 1 {
labels.insertOrReplace(icon: .calendar, value: language.text(days: days))
} else {
labels.insertOrReplace(icon: .statisticsTime, value: duration.duration(locale: locale))
}
labels.insertOrReplace(icon: .statisticsDistance, value: String(format: "%.1f km", locale: locale, distance / 1000))
labels.insertOrReplace(icon: .statisticsElevationUp, value: ascendedElevation.length(roundingToNearest: 50))
labels.insertOrReplace(icon: .statisticsEnergy, value: energy.energy(roundingToNearest: 50))
}
}