-
Notifications
You must be signed in to change notification settings - Fork 2
/
PatchData.swift
167 lines (150 loc) · 5.77 KB
/
PatchData.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
//
// PatchData.swift
// PatchDay
//
// Created by Juliya Smith on 5/13/17.
import Foundation
import PDKit
public class PatchData: NSObject, PatchDataSDK {
override public var description: String {
"Root object for developing with PatchData."
}
let dataSharer: UserDefaultsProtocol
let coreData: PDCoreDataWrapping
let hormoneDataSharer: HormoneDataSharing
public var settings: SettingsManaging
public var hormones: HormoneScheduling
public var sites: SiteScheduling
public var pills: PillScheduling
public let commandFactory: PDCommandFactory
public init(
settings: SettingsManaging,
dataSharer: UserDefaultsProtocol,
hormones: HormoneScheduling,
pills: PillScheduling,
sites: SiteScheduling,
coreData: PDCoreDataWrapping,
hormoneDataSharer: HormoneDataSharing
) {
self.settings = settings
self.dataSharer = dataSharer
self.hormones = hormones
self.pills = pills
self.sites = sites
self.coreData = coreData
self.hormoneDataSharer = hormoneDataSharer
self.commandFactory = PDCommandFactory(hormones: hormones, sites: sites)
super.init()
}
// swiftlint:disable function_body_length
public override convenience init() {
let storeDataStackWrapper = CoreDataStackWrapper()
let hormoneStore = HormoneStore(storeDataStackWrapper)
let pillStore = PillStore(storeDataStackWrapper)
let siteStore = SiteStore(storeDataStackWrapper)
let dataSharer = DataSharer()
let pillDataSharer = PillDataSharer(baseSharer: dataSharer)
let userDefaultsWriter = UserDefaultsWriter(
handler: UserDefaultsWriteHandler(dataSharer: dataSharer),
siteStore: siteStore
)
let hormoneDataSharer = HormoneDataSharer(baseSharer: dataSharer)
let hormones = HormoneSchedule(
store: hormoneStore,
hormoneDataSharer: hormoneDataSharer,
settings: userDefaultsWriter
)
let sites = SiteSchedule(store: siteStore, settings: userDefaultsWriter)
let settings = Settings(
writer: userDefaultsWriter, hormones: hormones, sites: sites
)
let pills = PillSchedule(
store: pillStore, pillDataSharer: pillDataSharer, settings: settings
)
#if DEBUG
// ******************************************************
// Nuke mode: Resets app like it's fresh
// ******************************************************
if PDCli.isNukeMode() {
hormones.reset()
pills.reset()
let newSiteCount = sites.reset()
settings.reset(defaultSiteCount: newSiteCount)
storeDataStackWrapper.nuke()
PDCli.clearNukeFlag()
self.init()
PDLogLevel = PDLogLevels.DEBUG
return
}
// ******************************************************
// New Day Test - Pills completed yesterday
// ******************************************************
else if PDCli.isWakeUpTest() {
let attributes = PillAttributes(
name: "Test Pill",
expirationIntervalSetting: .EveryDay,
xDays: "",
times: "12:00:00,2:00:00",
notify: false,
lastTaken: DateFactory.createDate(daysFrom: -1),
timesTakenToday: "12:02:02,2:03:05",
lastWakeUp: DateFactory.createDate(daysFrom: -1),
isCreated: true
)
pills.set(at: 0, with: attributes)
PDCli.clearWakeUpFlag()
self.init()
PDLogLevel = PDLogLevels.DEBUG
return
}
// ******************************************************
// Debug mode
// ******************************************************
if PDCli.isDebugMode() {
PDLogLevel = PDLogLevels.DEBUG
}
// ******************************************************
// Notifications testing - a Hormone that expires in 20 seconds, a Pill that expires in 12
// ******************************************************
if PDCli.isNotificationsTest() {
let now = Date()
let delay = 20
let seconds = settings.expirationInterval.hours * 60 * 60 - delay
settings.setNotifications(to: true)
let date = DateFactory.createDate(byAddingSeconds: -seconds, to: now)
hormones.setDate(at: 0, with: date!)
let attributes = PillAttributes()
let dueDate = DateFactory.createDate(byAddingSeconds: 61, to: now)!
attributes.expirationInterval.value = .EveryDay
attributes.times = PDDateFormatter.convertTimesToCommaSeparatedString([dueDate])
attributes.lastTaken = DateFactory.createDate(byAddingHours: -23, to: now)!
attributes.notify = true
attributes.timesTakenToday = ""
attributes.name = "Notification Test"
pills.set(at: 0, with: attributes)
}
#endif
self.init(
settings: settings,
dataSharer: dataSharer,
hormones: hormones,
pills: pills,
sites: sites,
coreData: storeDataStackWrapper,
hormoneDataSharer: hormoneDataSharer
)
}
// swiftlint:enable function_body_length
public var isFresh: Bool {
hormones.isEmpty && sites.isDefault
}
public var totalAlerts: Int {
hormones.totalExpired + pills.totalDue
}
public func resetAll() {
hormones.reset()
pills.reset()
let newSiteCount = sites.reset()
settings.reset(defaultSiteCount: newSiteCount)
}
}