55 lines
1.7 KiB
Swift
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))
|
|
}
|
|
}
|