OverrideProfilesStateModel.swift 11 KB

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