import Foundation struct ReadinessResponse: Codable { let score: Int let status: String let recommendation: String let date: String? let factors: ReadinessFactors? } struct ReadinessFactors: Codable { let sleep: FactorScore let hrv: FactorScore let rhr: FactorScore let activity: FactorScore } struct FactorScore: Codable { let score: Int let value: String let baseline: String? } struct LatestHealthResponse: Codable { let sleep: SleepData? let heartRate: HeartRateData? let restingHeartRate: RestingHRData? let hrv: HRVData? let steps: StepsData? let activeEnergy: EnergyData? let bloodOxygen: BloodOxygenData? let respiratoryRate: RespiratoryRateData? let distance: DistanceData? enum CodingKeys: String, CodingKey { case sleep, steps, hrv, distance case heartRate = "heartRate" case restingHeartRate = "restingHeartRate" case activeEnergy = "activeEnergy" case bloodOxygen = "spo2" case respiratoryRate = "respiratoryRate" } } struct BloodOxygenData: Codable { let avg: Double? let min: Double? let max: Double? } struct RespiratoryRateData: Codable { let avg: Double? } struct DistanceData: Codable { let total: Double? let units: String? } struct SleepData: Codable { let totalSleep: Double? let deep: Double? let rem: Double? let core: Double? } // Local-only model for sleep timeline (not from API) struct SleepSegment: Identifiable { let id = UUID() let phase: SleepPhaseType let start: Date let end: Date var duration: TimeInterval { end.timeIntervalSince(start) } } enum SleepPhaseType: String { case deep = "Глубокий" case rem = "REM" case core = "Базовый" case awake = "Пробуждение" var color: Color { switch self { case .deep: return Color(hex: "7c3aed") case .rem: return Color(hex: "a78bfa") case .core: return Color(hex: "c4b5fd") case .awake: return Color(hex: "ff4757") } } var icon: String { switch self { case .deep: return "moon.zzz.fill" case .rem: return "brain.head.profile" case .core: return "moon.fill" case .awake: return "eye.fill" } } } import SwiftUI struct HeartRateData: Codable { let avg: Int? let min: Int? let max: Int? } struct RestingHRData: Codable { let value: Double? } struct HRVData: Codable { let avg: Double? let latest: Double? } struct StepsData: Codable { let total: Int? } struct EnergyData: Codable { let total: Int? let units: String? } // MARK: - Heatmap / Weekly Data struct HeatmapEntry: Codable, Identifiable { let date: String let score: Int? let steps: Int? let sleep: Double? let hrv: Double? let rhr: Double? var id: String { date } var displayDate: String { let parts = date.split(separator: "-") guard parts.count == 3 else { return date } return "\(parts[2]).\(parts[1])" } } struct HeatmapResponse: Codable { let data: [HeatmapEntry] }