import Foundation import CoreData @objc(WorkoutLog) public class WorkoutLog: NSManagedObject, Identifiable { @NSManaged public var date: Date @NSManaged public var sets: Int32 @NSManaged public var reps: Int32 @NSManaged public var weight: Int32 @NSManaged public var order: Int32 @NSManaged public var exerciseName: String @NSManaged public var currentStateIndex: Int32 @NSManaged public var elapsedSeconds: Int32 @NSManaged public var completed: Bool @NSManaged public var loadType: Int32 @NSManaged public var duration: Date? @NSManaged public var notes: String? @NSManaged public var workout: Workout? public var id: NSManagedObjectID { objectID } var status: WorkoutStatus { get { willAccessValue(forKey: "status") let raw = primitiveValue(forKey: "status") as? String ?? "notStarted" didAccessValue(forKey: "status") return WorkoutStatus(rawValue: raw) ?? .notStarted } set { willChangeValue(forKey: "status") setPrimitiveValue(newValue.rawValue, forKey: "status") didChangeValue(forKey: "status") } } var loadTypeEnum: LoadType { get { LoadType(rawValue: Int(loadType)) ?? .weight } set { loadType = Int32(newValue.rawValue) } } // Duration helpers for minutes/seconds conversion var durationMinutes: Int { get { guard let duration = duration else { return 0 } return Int(duration.timeIntervalSince1970) / 60 } set { let seconds = durationSeconds duration = Date(timeIntervalSince1970: TimeInterval(newValue * 60 + seconds)) } } var durationSeconds: Int { get { guard let duration = duration else { return 0 } return Int(duration.timeIntervalSince1970) % 60 } set { let minutes = durationMinutes duration = Date(timeIntervalSince1970: TimeInterval(minutes * 60 + newValue)) } } } // MARK: - Fetch Request extension WorkoutLog { @nonobjc public class func fetchRequest() -> NSFetchRequest { return NSFetchRequest(entityName: "WorkoutLog") } static func orderedFetchRequest(for workout: Workout) -> NSFetchRequest { let request = fetchRequest() request.predicate = NSPredicate(format: "workout == %@", workout) request.sortDescriptors = [NSSortDescriptor(keyPath: \WorkoutLog.order, ascending: true)] return request } }