import Foundation struct TimerItem: Identifiable, Codable, Equatable { var id: UUID var name: String /// Gesamtdauer in Sekunden var durationSeconds: Int /// Nur relevant, wenn Timer pausiert oder gestoppt ist var remainingSeconds: Int var isRunning: Bool var completedCount: Int var autoRepeat: Bool /// Zielzeitpunkt. Dadurch bleiben Timer auch über Standby logisch korrekt. var endDate: Date? init( id: UUID = UUID(), name: String, durationSeconds: Int = 10 * 60, remainingSeconds: Int? = nil, isRunning: Bool = false, completedCount: Int = 0, autoRepeat: Bool = false, endDate: Date? = nil ) { self.id = id self.name = name self.durationSeconds = max(60, durationSeconds) self.remainingSeconds = remainingSeconds ?? max(60, durationSeconds) self.isRunning = isRunning self.completedCount = completedCount self.autoRepeat = autoRepeat self.endDate = endDate } var durationMinutes: Int { max(1, durationSeconds / 60) } var progress: Double { guard durationSeconds > 0 else { return 0 } return min(1.0, max(0.0, 1.0 - Double(remainingSeconds) / Double(durationSeconds))) } var formattedRemaining: String { Self.formatHHMMSS(seconds: remainingSeconds) } var formattedDurationHHMM: String { Self.formatHHMM(seconds: durationSeconds) } static func formatHHMM(seconds: Int) -> String { let safe = max(0, seconds) let hours = safe / 3600 let minutes = (safe % 3600) / 60 return String(format: "%02d:%02d", hours, minutes) } static func formatHHMMSS(seconds: Int) -> String { let safe = max(0, seconds) let hours = safe / 3600 let minutes = (safe % 3600) / 60 let seconds = safe % 60 if hours > 0 { return String(format: "%02d:%02d:%02d", hours, minutes, seconds) } else { return String(format: "%02d:%02d", minutes, seconds) } } static func parseHHMM(_ text: String) -> Int? { let cleaned = text.trimmingCharacters(in: .whitespacesAndNewlines) let parts = cleaned.split(separator: ":") guard parts.count == 2 else { return nil } guard let hours = Int(parts[0]), let minutes = Int(parts[1]) else { return nil } guard hours >= 0, minutes >= 0, minutes <= 59 else { return nil } let totalSeconds = hours * 3600 + minutes * 60 return totalSeconds >= 60 ? totalSeconds : nil } }