AddCarbsStateModel.swift 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import CoreData
  2. import SwiftUI
  3. extension AddCarbs {
  4. final class StateModel: BaseStateModel<Provider> {
  5. @Injected() var carbsStorage: CarbsStorage!
  6. @Injected() var apsManager: APSManager!
  7. @Injected() var settings: SettingsManager!
  8. @Published var carbs: Decimal = 0
  9. @Published var date = Date()
  10. @Published var protein: Decimal = 0
  11. @Published var fat: Decimal = 0
  12. @Published var carbsRequired: Decimal?
  13. @Published var useFPU: Bool = false
  14. @Published var dish: String = ""
  15. @Published var selection: Presets?
  16. let coredataContext = CoreDataStack.shared.persistentContainer.viewContext // .newBackgroundContext()
  17. @Environment(\.managedObjectContext) var moc
  18. override func subscribe() {
  19. carbsRequired = provider.suggestion?.carbsReq
  20. useFPU = settingsManager.settings.useFPUconversion
  21. }
  22. func add() {
  23. guard carbs > 0 || fat > 0 || protein > 0 else {
  24. showModal(for: nil)
  25. return
  26. }
  27. if useFPU {
  28. // -------------------------- FPU--------------------------------------
  29. let interval = settings.settings.minuteInterval // Interval betwwen carbs
  30. let timeCap = settings.settings.timeCap // Max Duration
  31. let adjustment = settings.settings.individualAdjustmentFactor
  32. let delay = settings.settings.delay // Tme before first future carb entry
  33. let kcal = protein * 4 + fat * 9
  34. let carbEquivalents = (kcal / 10) * adjustment
  35. let fpus = carbEquivalents / 10
  36. // Duration in hours used for extended boluses with Warsaw Method. Here used for total duration of the computed carbquivalents instead, excluding the configurable delay.
  37. var computedDuration = 0
  38. switch fpus {
  39. case ..<2:
  40. computedDuration = 3
  41. case 2 ..< 3:
  42. computedDuration = 4
  43. case 3 ..< 4:
  44. computedDuration = 5
  45. default:
  46. computedDuration = timeCap
  47. }
  48. // Size of each created carb equivalent if 60 minutes interval
  49. var equivalent: Decimal = carbEquivalents / Decimal(computedDuration)
  50. // Adjust for interval setting other than 60 minutes
  51. equivalent /= Decimal(60 / interval)
  52. // Number of equivalents
  53. var numberOfEquivalents = carbEquivalents / equivalent
  54. // Only use delay in first loop
  55. var firstIndex = true
  56. // New date for each carb equivalent
  57. var useDate = date
  58. // Group and Identify all FPUs together
  59. let fpuID = UUID().uuidString
  60. // Create an array of all future carb equivalents.
  61. var futureCarbArray = [CarbsEntry]()
  62. while carbEquivalents > 0, numberOfEquivalents > 0 {
  63. if firstIndex {
  64. useDate = useDate.addingTimeInterval(delay.minutes.timeInterval)
  65. firstIndex = false
  66. } else { useDate = useDate.addingTimeInterval(interval.minutes.timeInterval) }
  67. let eachCarbEntry = CarbsEntry(
  68. id: UUID().uuidString, createdAt: useDate, carbs: equivalent, enteredBy: CarbsEntry.manual, isFPU: true,
  69. fpuID: fpuID
  70. )
  71. futureCarbArray.append(eachCarbEntry)
  72. numberOfEquivalents -= 1
  73. }
  74. // Save the array
  75. if carbEquivalents > 0 {
  76. carbsStorage.storeCarbs(futureCarbArray)
  77. }
  78. } // ------------------------- END OF TPU ----------------------------------------
  79. // Store the real carbs
  80. if carbs > 0 {
  81. carbsStorage
  82. .storeCarbs([CarbsEntry(
  83. id: UUID().uuidString,
  84. createdAt: date,
  85. carbs: carbs,
  86. enteredBy: CarbsEntry.manual,
  87. isFPU: false, fpuID: nil
  88. )])
  89. }
  90. if settingsManager.settings.skipBolusScreenAfterCarbs {
  91. apsManager.determineBasalSync()
  92. showModal(for: nil)
  93. } else {
  94. showModal(for: .bolus(waitForSuggestion: true))
  95. }
  96. }
  97. func deletePreset() {
  98. if selection != nil {
  99. try? coredataContext.delete(selection!)
  100. try? coredataContext.save()
  101. carbs = 0
  102. fat = 0
  103. protein = 0
  104. }
  105. selection = nil
  106. }
  107. }
  108. }