1→// 2→// DailyRitual.swift 3→// KortexOS 4→// 5→// Daily ritual tracking model based on ZAIROS methodology 6→// 7→ 8→import Foundation 9→ 10→struct DailyRitual: Identifiable, Codable, Hashable { 11→ var id: UUID = UUID() 12→ var date: Date 13→ var items: [RitualItem] 14→ var pushupCount: Int = 0 15→ var squatCount: Int = 0 16→ var meditationMinutes: Int = 0 17→ var notes: String = "" 18→ var modifiedAt: Date = Date() 19→ 20→ // MARK: - Initialization 21→ 22→ init(date: Date = Date(), items: [RitualItem]? = nil) { 23→ self.date = Calendar.current.startOfDay(for: date) 24→ self.items = items ?? RitualItem.defaultItems 25→ self.modifiedAt = Date() 26→ } 27→ 28→ // MARK: - Computed Properties 29→ 30→ var completionPercentage: Double { 31→ guard !items.isEmpty else { return 0 } 32→ let completed = items.filter { $0.isCompleted }.count 33→ return Double(completed) / Double(items.count) 34→ } 35→ 36→ var completedItemsCount: Int { 37→ items.filter { $0.isCompleted }.count 38→ } 39→ 40→ var isComplete: Bool { 41→ completionPercentage >= 1.0 42→ } 43→ 44→ var exerciseProgress: Double { 45→ let pushupProgress = min(Double(pushupCount) / 200.0, 1.0) 46→ let squatProgress = min(Double(squatCount) / 200.0, 1.0) 47→ return (pushupProgress + squatProgress) / 2.0 48→ } 49→ 50→ var totalExercises: Int { 51→ pushupCount + squatCount 52→ } 53→ 54→ var formattedDate: String { 55→ let formatter = DateFormatter() 56→ formatter.locale = Locale(identifier: "pt_BR") 57→ formatter.dateStyle = .long 58→ return formatter.string(from: date) 59→ } 60→ 61→ var dayOfWeek: String { 62→ let formatter = DateFormatter() 63→ formatter.locale = Locale(identifier: "pt_BR") 64→ formatter.dateFormat = "EEEE" 65→ return formatter.string(from: date).capitalized 66→ } 67→ 68→ // MARK: - Methods 69→ 70→ mutating func toggleItem(_ itemId: UUID) { 71→ if let index = items.firstIndex(where: { $0.id == itemId }) { 72→ items[index].toggle() 73→ } 74→ } 75→ 76→ mutating func addPushups(_ count: Int) { 77→ pushupCount = min(pushupCount + count, 999) 78→ updateExerciseItemStatus() 79→ } 80→ 81→ mutating func addSquats(_ count: Int) { 82→ squatCount = min(squatCount + count, 999) 83→ updateExerciseItemStatus() 84→ } 85→ 86→ mutating func resetPushups() { 87→ pushupCount = 0 88→ updateExerciseItemStatus() 89→ } 90→ 91→ mutating func resetSquats() { 92→ squatCount = 0 93→ updateExerciseItemStatus() 94→ } 95→ 96→ mutating func addMeditationMinutes(_ minutes: Int) { 97→ meditationMinutes = min(meditationMinutes + minutes, 120) 98→ updateMeditationItemStatus() 99→ } 100→ 101→ private mutating func updateExerciseItemStatus() { 102→ // Auto-complete "200 Flexões" when count reaches 200 103→ if let pushupIndex = items.firstIndex(where: { $0.title == "200 Flexões" }) { 104→ items[pushupIndex].isCompleted = pushupCount >= 200 105→ items[pushupIndex].completedAt = pushupCount >= 200 ? Date() : nil 106→ } 107→ 108→ // Auto-complete "200 Agachamentos" when count reaches 200 109→ if let squatIndex = items.firstIndex(where: { $0.title == "200 Agachamentos" }) { 110→ items[squatIndex].isCompleted = squatCount >= 200 111→ items[squatIndex].completedAt = squatCount >= 200 ? Date() : nil 112→ } 113→ } 114→ 115→ private mutating func updateMeditationItemStatus() { 116→ // Auto-complete "Meditação" when minutes reaches 10 117→ if let meditationIndex = items.firstIndex(where: { $0.title.contains("Meditação") }) { 118→ items[meditationIndex].isCompleted = meditationMinutes >= 10 119→ items[meditationIndex].completedAt = meditationMinutes >= 10 ? Date() : nil 120→ } 121→ } 122→ 123→ // MARK: - Static Helpers 124→ 125→ static func isToday(_ date: Date) -> Bool { 126→ Calendar.current.isDateInToday(date) 127→ } 128→ 129→ static func isSameDay(_ date1: Date, _ date2: Date) -> Bool { 130→ Calendar.current.isDate(date1, inSameDayAs: date2) 131→ } 132→} 133→ Whenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.