AggregatedStatsViewModel.swift 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // LoopFollow
  2. // AggregatedStatsViewModel.swift
  3. import Combine
  4. import Foundation
  5. class AggregatedStatsViewModel: ObservableObject {
  6. var simpleStats: SimpleStatsViewModel
  7. var agpStats: AGPViewModel
  8. var griStats: GRIViewModel
  9. var tirStats: TIRViewModel
  10. let dataService: StatsDataService
  11. @Published var dataAvailability: DataAvailabilityInfo?
  12. init(mainViewController: MainViewController?) {
  13. dataService = StatsDataService(mainViewController: mainViewController)
  14. simpleStats = SimpleStatsViewModel(dataService: dataService)
  15. agpStats = AGPViewModel(dataService: dataService)
  16. griStats = GRIViewModel(dataService: dataService)
  17. tirStats = TIRViewModel(dataService: dataService)
  18. }
  19. func calculateStats() {
  20. simpleStats.calculateStats()
  21. agpStats.calculateAGP()
  22. griStats.calculateGRI()
  23. tirStats.calculateTIR()
  24. dataAvailability = dataService.getDataAvailability()
  25. }
  26. func clearAllStats() {
  27. simpleStats.clearStats()
  28. agpStats.clearStats()
  29. griStats.clearStats()
  30. tirStats.clearStats()
  31. dataAvailability = nil
  32. }
  33. func updatePeriod(_ days: Int, completion: @escaping () -> Void = {}) {
  34. let endDate = Date()
  35. let startDate = dateTimeUtils.displayCalendar().date(byAdding: .day, value: -days, to: endDate) ?? endDate
  36. updateDateRange(start: startDate, end: endDate, completion: completion)
  37. }
  38. func updateDateRange(start: Date, end: Date, completion: @escaping () -> Void = {}) {
  39. dataService.updateDateRange(start: start, end: end)
  40. dataService.ensureDataAvailable(
  41. onProgress: {},
  42. completion: {
  43. self.calculateStats()
  44. completion()
  45. }
  46. )
  47. }
  48. var gmi: Double? { simpleStats.gmi }
  49. var avgGlucose: Double? { simpleStats.avgGlucose }
  50. var stdDeviation: Double? { simpleStats.stdDeviation }
  51. var coefficientOfVariation: Double? { simpleStats.coefficientOfVariation }
  52. var totalDailyDose: Double? { simpleStats.totalDailyDose }
  53. var programmedBasal: Double? { simpleStats.programmedBasal }
  54. var actualBasal: Double? { simpleStats.actualBasal }
  55. var avgBolus: Double? { simpleStats.avgBolus }
  56. var avgCarbs: Double? { simpleStats.avgCarbs }
  57. var agpData: [AGPDataPoint] { agpStats.agpData }
  58. var gri: Double? { griStats.gri }
  59. var griHypoComponent: Double? { griStats.griHypoComponent }
  60. var griHyperComponent: Double? { griStats.griHyperComponent }
  61. var griDataPoints: [(date: Date, value: Double)] { griStats.griDataPoints }
  62. }