import Foundation struct Profile: JSON { var maxIOB: Double var maxDailySafetyMultiplier: Double var currentBasalSafetyMultiplier: Double var autosensMax: Double var autosensMin: Double var rewindResetsAutosens: Bool var highTemptargetRaisesSensitivity: Bool var lowTemptargetLowersSensitivity: Bool var sensitivityRaisesTarget: Bool var resistanceLowersTarget: Bool var advTargetAdjustments: Bool var exerciseMode: Bool var halfBasalExerciseTarget: Double var maxCOB: Double var wideBGTargetRange: Bool var skipNeutralTemps: Bool var unsuspendIfNoTemp: Bool var bolusSnoozeDIADivisor: Double var min5mCarbimpact: Double var autotuneISFAdjustmentFraction: Double var remainingCarbsFraction: Double var remainingCarbsCap: Double var enableUAM: Bool var a52RiskEnable: Bool var enableSMBWithCOB: Bool var enableSMBWithTemptarget: Bool var enableSMBAlways: Bool var enableSMBAfterCarbs: Bool var allowSMBWithHighTemptarget: Bool var maxSMBBasalMinutes: Double var maxUAMSMBBasalMinutes: Double var smbInterval: Double var bolusIncrement: Double var curve: InsulinCurve var useCustomPeakTime: Bool var insulinPeakTime: Double var carbsReqThreshold: Double var offlineHotspot: Bool // unused, for compatibility var noisyCGMTargetMultiplier: Double var suspendZerosIOB: Bool var enableEnliteBgproxy: Bool // unused, for compatibility init( maxIOB: Double = 0, maxDailySafetyMultiplier: Double = 3, currentBasalSafetyMultiplier: Double = 4, autosensMax: Double = 1.2, autosensMin: Double = 0.7, rewindResetsAutosens: Bool = true, highTemptargetRaisesSensitivity: Bool = false, lowTemptargetLowersSensitivity: Bool = false, sensitivityRaisesTarget: Bool = true, resistanceLowersTarget: Bool = false, advTargetAdjustments: Bool = false, exerciseMode: Bool = false, halfBasalExerciseTarget: Double = 160, maxCOB: Double = 120, wideBGTargetRange: Bool = false, skipNeutralTemps: Bool = false, unsuspendIfNoTemp: Bool = false, bolusSnoozeDIADivisor: Double = 2, min5mCarbimpact: Double = 8, autotuneISFAdjustmentFraction: Double = 1.0, remainingCarbsFraction: Double = 1.0, remainingCarbsCap: Double = 90, enableUAM: Bool = false, a52RiskEnable: Bool = false, enableSMBWithCOB: Bool = false, enableSMBWithTemptarget: Bool = false, enableSMBAlways: Bool = false, enableSMBAfterCarbs: Bool = false, allowSMBWithHighTemptarget: Bool = false, maxSMBBasalMinutes: Double = 30, maxUAMSMBBasalMinutes: Double = 30, smbInterval: Double = 3, bolusIncrement: Double = 0.1, curve: InsulinCurve = .rapidActing, useCustomPeakTime: Bool = false, insulinPeakTime: Double = 75, carbsReqThreshold: Double = 1, offlineHotspot: Bool = false, // unused, for compatibility noisyCGMTargetMultiplier: Double = 1.3, suspendZerosIOB: Bool = true, enableEnliteBgproxy: Bool = false // unused, for compatibility ) { self.maxIOB = maxIOB self.maxDailySafetyMultiplier = maxDailySafetyMultiplier self.currentBasalSafetyMultiplier = currentBasalSafetyMultiplier self.autosensMax = autosensMax self.autosensMin = autosensMin self.rewindResetsAutosens = rewindResetsAutosens self.highTemptargetRaisesSensitivity = highTemptargetRaisesSensitivity self.lowTemptargetLowersSensitivity = lowTemptargetLowersSensitivity self.sensitivityRaisesTarget = sensitivityRaisesTarget self.resistanceLowersTarget = resistanceLowersTarget self.advTargetAdjustments = advTargetAdjustments self.exerciseMode = exerciseMode self.halfBasalExerciseTarget = halfBasalExerciseTarget self.maxCOB = maxCOB self.wideBGTargetRange = wideBGTargetRange self.skipNeutralTemps = skipNeutralTemps self.unsuspendIfNoTemp = unsuspendIfNoTemp self.bolusSnoozeDIADivisor = bolusSnoozeDIADivisor self.min5mCarbimpact = min5mCarbimpact self.autotuneISFAdjustmentFraction = autotuneISFAdjustmentFraction self.remainingCarbsFraction = remainingCarbsFraction self.remainingCarbsCap = remainingCarbsCap self.enableUAM = enableUAM self.a52RiskEnable = a52RiskEnable self.enableSMBWithCOB = enableSMBWithCOB self.enableSMBWithTemptarget = enableSMBWithTemptarget self.enableSMBAlways = enableSMBAlways self.enableSMBAfterCarbs = enableSMBAfterCarbs self.allowSMBWithHighTemptarget = allowSMBWithHighTemptarget self.maxSMBBasalMinutes = maxSMBBasalMinutes self.maxUAMSMBBasalMinutes = maxUAMSMBBasalMinutes self.smbInterval = smbInterval self.bolusIncrement = bolusIncrement self.curve = curve self.useCustomPeakTime = useCustomPeakTime self.insulinPeakTime = insulinPeakTime self.carbsReqThreshold = carbsReqThreshold self.offlineHotspot = offlineHotspot self.noisyCGMTargetMultiplier = noisyCGMTargetMultiplier self.suspendZerosIOB = suspendZerosIOB self.enableEnliteBgproxy = enableEnliteBgproxy } } extension Profile { private enum CodingKeys: String, CodingKey { case maxIOB = "max_iob" case maxDailySafetyMultiplier = "max_daily_safety_multiplier" case currentBasalSafetyMultiplier = "current_basal_safety_multiplier" case autosensMax = "autosens_max" case autosensMin = "autosens_min" case rewindResetsAutosens = "rewind_resets_autosens" case highTemptargetRaisesSensitivity = "high_temptarget_raises_sensitivity" case lowTemptargetLowersSensitivity = "low_temptarget_lowers_sensitivity" case sensitivityRaisesTarget = "sensitivity_raises_target" case resistanceLowersTarget case advTargetAdjustments = "adv_target_adjustments" case exerciseMode = "exercise_mode" case halfBasalExerciseTarget = "half_basal_exercise_target" case maxCOB case wideBGTargetRange = "wide_bg_target_range" case skipNeutralTemps = "skip_neutral_temps" case unsuspendIfNoTemp = "unsuspend_if_no_temp" case bolusSnoozeDIADivisor = "bolussnooze_dia_divisor" case min5mCarbimpact = "min_5m_carbimpact" case autotuneISFAdjustmentFraction = "autotune_isf_adjustmentFraction" case remainingCarbsFraction case remainingCarbsCap case enableUAM case a52RiskEnable = "A52_risk_enable" case enableSMBWithCOB = "enableSMB_with_COB" case enableSMBWithTemptarget = "enableSMB_with_temptarget" case enableSMBAlways = "enableSMB_always" case enableSMBAfterCarbs = "enableSMB_after_carbs" case allowSMBWithHighTemptarget = "allowSMB_with_high_temptarget" case maxSMBBasalMinutes case maxUAMSMBBasalMinutes case smbInterval = "SMBInterval" case bolusIncrement = "bolus_increment" case curve case useCustomPeakTime case insulinPeakTime case carbsReqThreshold case offlineHotspot = "offline_hotspot" case noisyCGMTargetMultiplier case suspendZerosIOB = "suspend_zeros_iob" case enableEnliteBgproxy } } enum InsulinCurve: String, Codable { case rapidActing = "rapid-acting" case ultraRapid = "ultra-rapid" case bilinear }