import Foundation import SwiftData @Model final class CelestiaSession { var id: UUID var title: String var startTime: Date var endTime: Date? var localAudioPath: String? var isSynced: Bool var cloudSessionId: String? @Relationship(deleteRule: .cascade, inverse: \CelestiaTimelineEvent.session) var events: [CelestiaTimelineEvent] @Relationship(deleteRule: .cascade, inverse: \AudioChunk.session) var audioChunks: [AudioChunk] var durationMs: Int64 { guard let end = endTime else { return 0 } return Int64(end.timeIntervalSince(startTime) * 1000) } var durationFormatted: String { guard let end = endTime else { return "正在录音..." } let interval = end.timeIntervalSince(startTime) let hours = Int(interval) / 3600 let minutes = (Int(interval) % 3600) / 60 let seconds = Int(interval) % 60 if hours > 0 { return String(format: "%d:%02d:%02d", hours, minutes, seconds) } return String(format: "%02d:%02d", minutes, seconds) } var photoCount: Int { events.filter { $0.eventType == "PHOTO" }.count } var noteCount: Int { events.filter { $0.eventType == "NOTE" || $0.eventType == "MARKER" }.count } init(title: String, localAudioPath: String? = nil) { self.id = UUID() self.title = title self.startTime = Date() self.endTime = nil self.localAudioPath = localAudioPath self.isSynced = false self.cloudSessionId = nil self.events = [] self.audioChunks = [] } }