import Foundation struct Preferences: JSON { var maxIOB: Decimal = 0 var maxDailySafetyMultiplier: Decimal = 3 var currentBasalSafetyMultiplier: Decimal = 4 var autosensMax: Decimal = 1.2 var autosensMin: Decimal = 0.7 var smbDeliveryRatio: Decimal = 0.5 var rewindResetsAutosens: Bool = true var highTemptargetRaisesSensitivity: Bool = false var lowTemptargetLowersSensitivity: Bool = false var sensitivityRaisesTarget: Bool = false var resistanceLowersTarget: Bool = false var advTargetAdjustments: Bool = false var exerciseMode: Bool = false var halfBasalExerciseTarget: Decimal = 160 var maxCOB: Decimal = 120 var wideBGTargetRange: Bool = false var skipNeutralTemps: Bool = false var unsuspendIfNoTemp: Bool = false var min5mCarbimpact: Decimal = 8 var autotuneISFAdjustmentFraction: Decimal = 1.0 var remainingCarbsFraction: Decimal = 1.0 var remainingCarbsCap: Decimal = 90 var enableUAM: Bool = false var a52RiskEnable: Bool = false var enableSMBWithCOB: Bool = false var enableSMBWithTemptarget: Bool = false var enableSMBAlways: Bool = false var enableSMBAfterCarbs: Bool = false var allowSMBWithHighTemptarget: Bool = false var maxSMBBasalMinutes: Decimal = 30 var maxUAMSMBBasalMinutes: Decimal = 30 var smbInterval: Decimal = 3 var bolusIncrement: Decimal = 0.1 var curve: InsulinCurve = .rapidActing var useCustomPeakTime: Bool = false var insulinPeakTime: Decimal = 75 var carbsReqThreshold: Decimal = 1.0 var noisyCGMTargetMultiplier: Decimal = 1.3 var suspendZerosIOB: Bool = false var timestamp: Date? var maxDeltaBGthreshold: Decimal = 0.2 var adjustmentFactor: Decimal = 0.8 var adjustmentFactorSigmoid: Decimal = 0.5 var sigmoid: Bool = false var enableDynamicCR: Bool = false var useNewFormula: Bool = false var useWeightedAverage: Bool = false var weightPercentage: Decimal = 0.65 var tddAdjBasal: Bool = false var enableSMB_high_bg: Bool = false var enableSMB_high_bg_target: Decimal = 110 var threshold_setting: Decimal = 65 var updateInterval: Decimal = 20 } extension Preferences { 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 smbDeliveryRatio = "smb_delivery_ratio" case rewindResetsAutosens = "rewind_resets_autosens" case highTemptargetRaisesSensitivity = "high_temptarget_raises_sensitivity" case lowTemptargetLowersSensitivity = "low_temptarget_lowers_sensitivity" case sensitivityRaisesTarget = "sensitivity_raises_target" case resistanceLowersTarget = "resistance_lowers_target" 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 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 noisyCGMTargetMultiplier case suspendZerosIOB = "suspend_zeros_iob" case maxDeltaBGthreshold = "maxDelta_bg_threshold" case adjustmentFactor case adjustmentFactorSigmoid case sigmoid case enableDynamicCR case useNewFormula case useWeightedAverage case weightPercentage case tddAdjBasal case enableSMB_high_bg case enableSMB_high_bg_target case threshold_setting case updateInterval } } enum InsulinCurve: String, JSON, Identifiable, CaseIterable { case rapidActing = "rapid-acting" case ultraRapid = "ultra-rapid" case bilinear var id: InsulinCurve { self } }