OverrideProfilesStateModel.swift 12 KB

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