// // HealthKitMapping.swift // Workouts (Shared) // // Copyright 2025 Rouslan Zenetl. All Rights Reserved. // import Foundation import HealthKit // Bridges the app's HealthKit-free domain types to HealthKit, and centralizes the // authorization type sets so the watch (which records the session) and the phone // (which writes an estimated workout when no watch ran) request consistent scopes. extension WorkoutActivityType { /// The HealthKit activity type used to tag a saved workout, so it lands in the /// right Apple Health / Fitness category and credits the rings appropriately. var hkActivityType: HKWorkoutActivityType { switch self { case .traditionalStrength: .traditionalStrengthTraining case .functionalStrength: .functionalStrengthTraining case .hiit: .highIntensityIntervalTraining case .coreTraining: .coreTraining case .cardio: .mixedCardio case .cycling: .cycling } } } /// Σ sets×reps×weight across weighted logs — the app-native "how much work" number. /// Computed in the stored weight unit (display-only units never change the value). enum WorkoutVolume { static func total(_ logs: [WorkoutLogDocument]) -> Double { logs.reduce(0) { sum, log in guard LoadType(rawValue: log.loadType) == .weight else { return sum } return sum + Double(log.sets * log.reps * log.weight) } } } /// The HealthKit scopes each side requests. Kept here so the share/read sets stay in /// sync with what the writers actually use. enum WorkoutHealthAuthorization { /// Watch: records a live session (writes the workout + energy, reads HR/energy back). static let watchShare: Set = [ .workoutType(), HKQuantityType(.activeEnergyBurned), ] static let watchRead: Set = [ HKQuantityType(.heartRate), HKQuantityType(.activeEnergyBurned), HKCharacteristicType(.dateOfBirth), // → max HR for zone tracking ] /// Phone: writes an estimated workout when no watch session ran; reads body /// measurements to size the calorie estimate (and HR to display watch data). static let phoneShare: Set = [ .workoutType(), HKQuantityType(.activeEnergyBurned), ] static let phoneRead: Set = [ HKQuantityType(.bodyMass), HKQuantityType(.heartRate), HKCharacteristicType(.dateOfBirth), HKCharacteristicType(.biologicalSex), ] }