OverrideProfilesStateModel.swift 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. import CoreData
  2. import SwiftUI
  3. extension OverrideProfilesConfig {
  4. final class StateModel: BaseStateModel<Provider> {
  5. @Published var percentage: Double = 100
  6. @Published var isEnabled = false
  7. @Published var _indefinite = true
  8. @Published var duration: Decimal = 0
  9. @Published var target: Decimal = 0
  10. @Published var override_target: Bool = false
  11. @Published var smbIsOff: Bool = false
  12. @Published var id: String = ""
  13. @Published var profileName: String = ""
  14. @Published var isPreset: Bool = false
  15. @Published var presets: [OverridePresets] = []
  16. @Published var selection: OverridePresets?
  17. @Published var isPromtPresented: Bool = false
  18. @Published var advancedSettings: Bool = false
  19. @Published var isfAndCr: Bool = true
  20. @Published var isf: Bool = true
  21. @Published var cr: Bool = true
  22. @Published var smbIsAlwaysOff: Bool = false
  23. @Published var start: Decimal = 0
  24. @Published var end: Decimal = 23
  25. @Published var smbMinutes: Decimal = 0
  26. @Published var uamMinutes: Decimal = 0
  27. var units: GlucoseUnits = .mmolL
  28. override func subscribe() {
  29. units = settingsManager.settings.units
  30. smbMinutes = settingsManager.preferences.maxSMBBasalMinutes
  31. uamMinutes = settingsManager.preferences.maxUAMSMBBasalMinutes
  32. presets = [OverridePresets(context: coredataContext)]
  33. }
  34. let coredataContext = CoreDataStack.shared.persistentContainer.viewContext
  35. func saveSettings() {
  36. coredataContext.perform { [self] in
  37. let saveOverride = Override(context: self.coredataContext)
  38. saveOverride.duration = self.duration as NSDecimalNumber
  39. saveOverride.indefinite = self._indefinite
  40. saveOverride.percentage = self.percentage
  41. saveOverride.enabled = true
  42. saveOverride.smbIsOff = self.smbIsOff
  43. if self.isPreset {
  44. saveOverride.isPreset = true
  45. saveOverride.id = id
  46. } else { saveOverride.isPreset = false }
  47. saveOverride.date = Date()
  48. if override_target {
  49. if units == .mmolL {
  50. target = target.asMgdL
  51. }
  52. saveOverride.target = target as NSDecimalNumber
  53. } else { saveOverride.target = 0 }
  54. if advancedSettings {
  55. saveOverride.advancedSettings = true
  56. if !isfAndCr {
  57. saveOverride.isfAndCr = false
  58. saveOverride.isf = isf
  59. saveOverride.cr = cr
  60. } else { saveOverride.isfAndCr = true }
  61. if smbIsAlwaysOff {
  62. saveOverride.smbIsAlwaysOff = true
  63. saveOverride.start = start as NSDecimalNumber
  64. saveOverride.end = end as NSDecimalNumber
  65. } else { saveOverride.smbIsAlwaysOff = false }
  66. if smbMinutes != self.settingsManager.preferences.maxSMBBasalMinutes {
  67. saveOverride.smbMinutes = smbMinutes as NSDecimalNumber
  68. }
  69. if uamMinutes != self.settingsManager.preferences.maxUAMSMBBasalMinutes {
  70. saveOverride.uamMinutes = uamMinutes as NSDecimalNumber
  71. }
  72. }
  73. try? self.coredataContext.save()
  74. }
  75. }
  76. func savePreset() {
  77. coredataContext.perform { [self] in
  78. let saveOverride = OverridePresets(context: self.coredataContext)
  79. saveOverride.duration = self.duration as NSDecimalNumber
  80. saveOverride.indefinite = self._indefinite
  81. saveOverride.percentage = self.percentage
  82. saveOverride.smbIsOff = self.smbIsOff
  83. saveOverride.name = self.profileName
  84. id = UUID().uuidString
  85. self.isPreset.toggle()
  86. saveOverride.id = id
  87. saveOverride.date = Date()
  88. if override_target {
  89. if units == .mmolL {
  90. target = target.asMgdL
  91. }
  92. saveOverride.target = target as NSDecimalNumber
  93. } else { saveOverride.target = 0 }
  94. if advancedSettings {
  95. saveOverride.advancedSettings = true
  96. if !isfAndCr {
  97. saveOverride.isfAndCr = false
  98. saveOverride.isf = isf
  99. saveOverride.cr = cr
  100. } else { saveOverride.isfAndCr = true }
  101. if smbIsAlwaysOff {
  102. saveOverride.smbIsAlwaysOff = true
  103. saveOverride.start = start as NSDecimalNumber
  104. saveOverride.end = end as NSDecimalNumber
  105. } else { smbIsAlwaysOff = false }
  106. if smbMinutes != self.settingsManager.preferences.maxSMBBasalMinutes {
  107. saveOverride.smbMinutes = smbMinutes as NSDecimalNumber
  108. }
  109. if uamMinutes != self.settingsManager.preferences.maxUAMSMBBasalMinutes {
  110. saveOverride.uamMinutes = uamMinutes as NSDecimalNumber
  111. }
  112. }
  113. try? self.coredataContext.save()
  114. isPromtPresented = false
  115. }
  116. }
  117. func selectProfile(id_: String) {
  118. guard id_ != "" else { return }
  119. coredataContext.performAndWait {
  120. var profileArray = [OverridePresets]()
  121. let requestProfiles = OverridePresets.fetchRequest() as NSFetchRequest<OverridePresets>
  122. try? profileArray = coredataContext.fetch(requestProfiles)
  123. guard let profile = profileArray.filter({ $0.id == id_ }).first else { return }
  124. let saveOverride = Override(context: self.coredataContext)
  125. saveOverride.duration = (profile.duration ?? 0) as NSDecimalNumber
  126. saveOverride.indefinite = profile.indefinite
  127. saveOverride.percentage = profile.percentage
  128. saveOverride.enabled = true
  129. saveOverride.smbIsOff = profile.smbIsOff
  130. saveOverride.isPreset = true
  131. saveOverride.date = Date()
  132. saveOverride.target = profile.target
  133. saveOverride.id = id_
  134. if profile.advancedSettings {
  135. if !isfAndCr {
  136. saveOverride.isfAndCr = false
  137. saveOverride.isf = profile.isf
  138. saveOverride.cr = profile.cr
  139. } else { saveOverride.isfAndCr = true }
  140. if profile.smbIsAlwaysOff {
  141. saveOverride.smbIsAlwaysOff = true
  142. saveOverride.start = profile.start
  143. saveOverride.end = profile.end
  144. } else { saveOverride.smbIsAlwaysOff = false }
  145. let smb = (profile.smbMinutes ?? 30) as Decimal
  146. if smb != self.settingsManager.preferences.maxSMBBasalMinutes {
  147. saveOverride.smbMinutes = profile.smbMinutes
  148. }
  149. let uam = (profile.uamMinutes ?? 30) as Decimal
  150. if uam != self.settingsManager.preferences.maxUAMSMBBasalMinutes {
  151. saveOverride.uamMinutes = profile.uamMinutes
  152. }
  153. }
  154. try? self.coredataContext.save()
  155. }
  156. }
  157. func savedSettings() {
  158. coredataContext.performAndWait {
  159. var overrideArray = [Override]()
  160. let requestEnabled = Override.fetchRequest() as NSFetchRequest<Override>
  161. let sortIsEnabled = NSSortDescriptor(key: "date", ascending: false)
  162. requestEnabled.sortDescriptors = [sortIsEnabled]
  163. // requestEnabled.fetchLimit = 1
  164. try? overrideArray = coredataContext.fetch(requestEnabled)
  165. isEnabled = overrideArray.first?.enabled ?? false
  166. percentage = overrideArray.first?.percentage ?? 100
  167. _indefinite = overrideArray.first?.indefinite ?? true
  168. duration = (overrideArray.first?.duration ?? 0) as Decimal
  169. smbIsOff = overrideArray.first?.smbIsOff ?? false
  170. advancedSettings = overrideArray.first?.advancedSettings ?? false
  171. isfAndCr = overrideArray.first?.isfAndCr ?? true
  172. smbIsAlwaysOff = overrideArray.first?.smbIsAlwaysOff ?? false
  173. if advancedSettings {
  174. if !isfAndCr {
  175. isf = overrideArray.first?.isf ?? false
  176. cr = overrideArray.first?.cr ?? false
  177. }
  178. if smbIsAlwaysOff {
  179. start = (overrideArray.first?.start ?? 0) as Decimal
  180. end = (overrideArray.first?.end ?? 0) as Decimal
  181. }
  182. let smb = (overrideArray.first?.smbMinutes ?? 30) as Decimal
  183. if smb != self.settingsManager.preferences.maxSMBBasalMinutes {
  184. smbMinutes = (overrideArray.first?.smbMinutes ?? 30) as Decimal
  185. }
  186. let uam = (overrideArray.first?.uamMinutes ?? 30) as Decimal
  187. if uam != self.settingsManager.preferences.maxUAMSMBBasalMinutes {
  188. uamMinutes = (overrideArray.first?.uamMinutes ?? 30) as Decimal
  189. }
  190. }
  191. let overrideTarget = (overrideArray.first?.target ?? 0) as Decimal
  192. var newDuration = Double(duration)
  193. if isEnabled {
  194. let duration = overrideArray.first?.duration ?? 0
  195. let addedMinutes = Int(duration as Decimal)
  196. let date = overrideArray.first?.date ?? Date()
  197. if date.addingTimeInterval(addedMinutes.minutes.timeInterval) < Date(), !_indefinite {
  198. isEnabled = false
  199. }
  200. newDuration = Date().distance(to: date.addingTimeInterval(addedMinutes.minutes.timeInterval)).minutes
  201. if overrideTarget != 0 {
  202. override_target = true
  203. target = units == .mmolL ? overrideTarget.asMmolL : overrideTarget
  204. }
  205. }
  206. if newDuration < 0 { newDuration = 0 } else { duration = Decimal(newDuration) }
  207. if !isEnabled {
  208. _indefinite = true
  209. percentage = 100
  210. duration = 0
  211. target = 0
  212. override_target = false
  213. smbIsOff = false
  214. advancedSettings = false
  215. }
  216. }
  217. }
  218. func cancelProfile() {
  219. _indefinite = true
  220. isEnabled = false
  221. percentage = 100
  222. duration = 0
  223. target = 0
  224. override_target = false
  225. smbIsOff = false
  226. advancedSettings = false
  227. coredataContext.perform { [self] in
  228. let profiles = Override(context: self.coredataContext)
  229. profiles.enabled = false
  230. profiles.date = Date()
  231. try? self.coredataContext.save()
  232. }
  233. }
  234. }
  235. }