// // RotateController.swift // Todos // // Created by Sam Jaffe on 3/13/26. // import Foundation final class RotateController { static func ymd(_ date: Date) -> String { RotateController().ymd(date) } func ymd(_ date: Date) -> String { date.formatted(.iso8601.year().month().day()) } func saveAndRotate(_ items: [Project], _ date: inout Date, _ tracking: inout RotateTracking) { SaveController().save(items, onDate: ymd(date)) tracking.summary = summarize(items) rotate(items, &tracking) date = Date() } func summarize(_ items: [Project]) -> String? { var summary = "" for item in items { item.tasks.filter(isComplete).map(\.name).forEach { name in summary += "- \(item.name) > \(name)\n" } for task in item.tasks { task.subtasks.filter(isComplete).map(\.name).forEach { name in summary += "- \(item.name) > \(task.name) > \(name)\n" } } } return summary.isEmpty ? nil : summary } private func rotate(_ items: [Project], _ tracking: inout RotateTracking) { for item in items { cleanStatuses(&item.tasks) for task in item.tasks { cleanStatuses(&task.subtasks) } } } private func isComplete(_ arg: T) -> Bool { arg.status == .complete } private func cleanStatuses(_ items: inout [T]) { items.removeAll(where: isComplete) for var item in items where item.status == .inProgress { item.status = .todo } } }