import Foundation import CoreData @objc(Workout) public class Workout: NSManagedObject, Identifiable { @NSManaged public var start: Date @NSManaged public var end: Date? @NSManaged private var statusRaw: String @NSManaged public var split: Split? @NSManaged public var logs: NSSet? public var id: NSManagedObjectID { objectID } var status: WorkoutStatus { get { WorkoutStatus(rawValue: statusRaw) ?? .notStarted } set { statusRaw = newValue.rawValue } } var label: String { if status == .completed, let endDate = end { return "\(start.formattedDate())—\(endDate.formattedDate())" } else { return start.formattedDate() } } var statusName: String { return status.displayName } } // MARK: - Convenience Accessors extension Workout { var logsArray: [WorkoutLog] { let set = logs as? Set ?? [] return set.sorted { $0.order < $1.order } } func addToLogs(_ log: WorkoutLog) { let items = mutableSetValue(forKey: "logs") items.add(log) } func removeFromLogs(_ log: WorkoutLog) { let items = mutableSetValue(forKey: "logs") items.remove(log) } } // MARK: - Fetch Request extension Workout { @nonobjc public class func fetchRequest() -> NSFetchRequest { return NSFetchRequest(entityName: "Workout") } static func recentFetchRequest() -> NSFetchRequest { let request = fetchRequest() request.sortDescriptors = [NSSortDescriptor(keyPath: \Workout.start, ascending: false)] return request } static func fetchRequest(for split: Split) -> NSFetchRequest { let request = fetchRequest() request.predicate = NSPredicate(format: "split == %@", split) request.sortDescriptors = [NSSortDescriptor(keyPath: \Workout.start, ascending: false)] return request } }