| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 |
- import CoreData
- import SwiftUI
- extension OverrideProfilesConfig {
- final class StateModel: BaseStateModel<Provider> {
- @Published var percentage: Double = 100
- @Published var isEnabled = false
- @Published var _indefinite = true
- @Published var duration: Decimal = 0
- @Published var target: Decimal = 0
- @Published var override_target: Bool = false
- @Published var smbIsOff: Bool = false
- @Published var id: String = ""
- @Published var profileName: String = ""
- @Published var isPreset: Bool = false
- @Published var presets: [OverridePresets] = []
- @Published var selection: OverridePresets?
- @Published var advancedSettings: Bool = false
- @Published var isfAndCr: Bool = true
- @Published var isf: Bool = true
- @Published var cr: Bool = true
- @Published var smbIsAlwaysOff: Bool = false
- @Published var start: Decimal = 0
- @Published var end: Decimal = 23
- @Published var smbMinutes: Decimal = 0
- @Published var uamMinutes: Decimal = 0
- @Published var defaultSmbMinutes: Decimal = 0
- @Published var defaultUamMinutes: Decimal = 0
- var units: GlucoseUnits = .mmolL
- override func subscribe() {
- units = settingsManager.settings.units
- defaultSmbMinutes = settingsManager.preferences.maxSMBBasalMinutes
- defaultUamMinutes = settingsManager.preferences.maxUAMSMBBasalMinutes
- presets = [OverridePresets(context: coredataContext)]
- }
- let coredataContext = CoreDataStack.shared.persistentContainer.viewContext
- func saveSettings() {
- coredataContext.perform { [self] in
- let saveOverride = Override(context: self.coredataContext)
- saveOverride.duration = self.duration as NSDecimalNumber
- saveOverride.indefinite = self._indefinite
- saveOverride.percentage = self.percentage
- saveOverride.enabled = true
- saveOverride.smbIsOff = self.smbIsOff
- if self.isPreset {
- saveOverride.isPreset = true
- saveOverride.id = id
- } else { saveOverride.isPreset = false }
- saveOverride.date = Date()
- if override_target {
- if units == .mmolL {
- target = target.asMgdL
- }
- saveOverride.target = target as NSDecimalNumber
- } else { saveOverride.target = 0 }
- if advancedSettings {
- saveOverride.advancedSettings = true
- if !isfAndCr {
- saveOverride.isfAndCr = false
- saveOverride.isf = isf
- saveOverride.cr = cr
- } else { saveOverride.isfAndCr = true }
- if smbIsAlwaysOff {
- saveOverride.smbIsAlwaysOff = true
- saveOverride.start = start as NSDecimalNumber
- saveOverride.end = end as NSDecimalNumber
- } else { saveOverride.smbIsAlwaysOff = false }
- saveOverride.smbMinutes = smbMinutes as NSDecimalNumber
- saveOverride.uamMinutes = uamMinutes as NSDecimalNumber
- }
- try? self.coredataContext.save()
- }
- }
- func savePreset() {
- coredataContext.perform { [self] in
- let saveOverride = OverridePresets(context: self.coredataContext)
- saveOverride.duration = self.duration as NSDecimalNumber
- saveOverride.indefinite = self._indefinite
- saveOverride.percentage = self.percentage
- saveOverride.smbIsOff = self.smbIsOff
- saveOverride.name = self.profileName
- id = UUID().uuidString
- self.isPreset.toggle()
- saveOverride.id = id
- saveOverride.date = Date()
- if override_target {
- saveOverride.target = (
- units == .mmolL
- ? target.asMgdL
- : target
- ) as NSDecimalNumber
- } else { saveOverride.target = 0 }
- if advancedSettings {
- saveOverride.advancedSettings = true
- if !isfAndCr {
- saveOverride.isfAndCr = false
- saveOverride.isf = isf
- saveOverride.cr = cr
- } else { saveOverride.isfAndCr = true }
- if smbIsAlwaysOff {
- saveOverride.smbIsAlwaysOff = true
- saveOverride.start = start as NSDecimalNumber
- saveOverride.end = end as NSDecimalNumber
- } else { smbIsAlwaysOff = false }
- saveOverride.smbMinutes = smbMinutes as NSDecimalNumber
- saveOverride.uamMinutes = uamMinutes as NSDecimalNumber
- }
- try? self.coredataContext.save()
- }
- }
- func selectProfile(id_: String) {
- guard id_ != "" else { return }
- coredataContext.performAndWait {
- var profileArray = [OverridePresets]()
- let requestProfiles = OverridePresets.fetchRequest() as NSFetchRequest<OverridePresets>
- try? profileArray = coredataContext.fetch(requestProfiles)
- guard let profile = profileArray.filter({ $0.id == id_ }).first else { return }
- let saveOverride = Override(context: self.coredataContext)
- saveOverride.duration = (profile.duration ?? 0) as NSDecimalNumber
- saveOverride.indefinite = profile.indefinite
- saveOverride.percentage = profile.percentage
- saveOverride.enabled = true
- saveOverride.smbIsOff = profile.smbIsOff
- saveOverride.isPreset = true
- saveOverride.date = Date()
- saveOverride.target = profile.target
- saveOverride.id = id_
- if profile.advancedSettings {
- saveOverride.advancedSettings = true
- if !isfAndCr {
- saveOverride.isfAndCr = false
- saveOverride.isf = profile.isf
- saveOverride.cr = profile.cr
- } else { saveOverride.isfAndCr = true }
- if profile.smbIsAlwaysOff {
- saveOverride.smbIsAlwaysOff = true
- saveOverride.start = profile.start
- saveOverride.end = profile.end
- } else { saveOverride.smbIsAlwaysOff = false }
- saveOverride.smbMinutes = (profile.smbMinutes ?? 0) as NSDecimalNumber
- saveOverride.uamMinutes = (profile.uamMinutes ?? 0) as NSDecimalNumber
- }
- try? self.coredataContext.save()
- }
- }
- func savedSettings() {
- coredataContext.performAndWait {
- var overrideArray = [Override]()
- let requestEnabled = Override.fetchRequest() as NSFetchRequest<Override>
- let sortIsEnabled = NSSortDescriptor(key: "date", ascending: false)
- requestEnabled.sortDescriptors = [sortIsEnabled]
- // requestEnabled.fetchLimit = 1
- try? overrideArray = coredataContext.fetch(requestEnabled)
- isEnabled = overrideArray.first?.enabled ?? false
- percentage = overrideArray.first?.percentage ?? 100
- _indefinite = overrideArray.first?.indefinite ?? true
- duration = (overrideArray.first?.duration ?? 0) as Decimal
- smbIsOff = overrideArray.first?.smbIsOff ?? false
- advancedSettings = overrideArray.first?.advancedSettings ?? false
- isfAndCr = overrideArray.first?.isfAndCr ?? true
- smbIsAlwaysOff = overrideArray.first?.smbIsAlwaysOff ?? false
- if advancedSettings {
- if !isfAndCr {
- isf = overrideArray.first?.isf ?? false
- cr = overrideArray.first?.cr ?? false
- }
- if smbIsAlwaysOff {
- start = (overrideArray.first?.start ?? 0) as Decimal
- end = (overrideArray.first?.end ?? 0) as Decimal
- }
- if (overrideArray[0].smbMinutes as Decimal?) != nil {
- smbMinutes = (overrideArray.first?.smbMinutes ?? 30) as Decimal
- }
- if (overrideArray[0].uamMinutes as Decimal?) != nil {
- uamMinutes = (overrideArray.first?.uamMinutes ?? 30) as Decimal
- }
- }
- let overrideTarget = (overrideArray.first?.target ?? 0) as Decimal
- var newDuration = Double(duration)
- if isEnabled {
- let duration = overrideArray.first?.duration ?? 0
- let addedMinutes = Int(duration as Decimal)
- let date = overrideArray.first?.date ?? Date()
- if date.addingTimeInterval(addedMinutes.minutes.timeInterval) < Date(), !_indefinite {
- isEnabled = false
- }
- newDuration = Date().distance(to: date.addingTimeInterval(addedMinutes.minutes.timeInterval)).minutes
- if overrideTarget != 0 {
- override_target = true
- target = units == .mmolL ? overrideTarget.asMmolL : overrideTarget
- }
- }
- if newDuration < 0 { newDuration = 0 } else { duration = Decimal(newDuration) }
- if !isEnabled {
- _indefinite = true
- percentage = 100
- duration = 0
- target = 0
- override_target = false
- smbIsOff = false
- advancedSettings = false
- smbMinutes = defaultSmbMinutes
- uamMinutes = defaultUamMinutes
- }
- }
- }
- func cancelProfile() {
- _indefinite = true
- isEnabled = false
- percentage = 100
- duration = 0
- target = 0
- override_target = false
- smbIsOff = false
- advancedSettings = false
- coredataContext.perform { [self] in
- let profiles = Override(context: self.coredataContext)
- profiles.enabled = false
- profiles.date = Date()
- try? self.coredataContext.save()
- }
- smbMinutes = defaultSmbMinutes
- uamMinutes = defaultUamMinutes
- }
- }
- }
|