import Foundation import CoreData import DifferenceKit public struct Vehicle: Decodable { public var number: String public var currentNumber: String? public var brand: VBrand? public var model: VModel? public var addedDate: TimeInterval public var updatedDate: TimeInterval public var color: String? public var year: Int64? public var category: String? public var vin1: String? public var vin2: String? public var sts: String? public var pts: String? public var isRightWheel: Bool? public var isJapanese: Bool? public var addedBy: String? public var engine: VEngine? public var photos: [VPhoto]? public var ownershipPeriods: [VOwnershipPeriod]? public var events: [VEvent]? public var osagoContracts: [VOsago]? public var ads: [VAd]? public var notes: [VNote]? public var debugInfo: DebugInfo? public init(number: String, brandName: String, addedDate: TimeInterval, updatedDate: TimeInterval) { self.number = number self.currentNumber = number self.addedDate = addedDate self.updatedDate = updatedDate self.brand = VBrand(name: VName(original: brandName)) } } extension CDVehicle: Dated { public var updatedAt: Date { Date(timeIntervalSince1970: updatedDate) } public var addedAt: Date { Date(timeIntervalSince1970: addedDate) } } extension CDVehicle: Differentiable { public var differenceIdentifier: String { number! } public func isContentEqual(to source: CDVehicle) -> Bool { return number == source.number && addedDate == source.addedDate && updatedDate == source.updatedDate } } extension CDVehicle { public convenience init(vehicle: Vehicle, context: NSManagedObjectContext) { self.init(context: context) self.number = vehicle.number self.currentNumber = vehicle.currentNumber self.addedDate = vehicle.addedDate/1000 self.updatedDate = vehicle.updatedDate/1000 self.color = vehicle.color self.brand = CDVBrand(vbrand: vehicle.brand, context: context) self.model = CDVModel(model: vehicle.model, context: context) self.year = vehicle.year ?? 0 self.category = category self.vin1 = vehicle.vin1 self.vin2 = vehicle.vin2 self.sts = vehicle.sts self.pts = vehicle.pts self.isRightWheel = vehicle.isRightWheel ?? false self.isJapanese = vehicle.isJapanese ?? false self.addedBy = vehicle.addedBy self.synchronized = true self.engine = CDVEngine(model: vehicle.engine, context: context) let photos = vehicle.photos?.map { CDVPhoto(model: $0, context: context) } ?? [] self.photos = NSSet(array: photos) let ownershipPeriods = vehicle.ownershipPeriods?.map { CDVOwnershipPeriod(model: $0, context: context) } ?? [] self.ownershipPeriods = NSSet(array: ownershipPeriods) let events = vehicle.events?.map { CDVEvent(model: $0, context: context) } ?? [] self.events = NSSet(array: events) let osagoContracts = vehicle.osagoContracts?.map { CDVOsago(model: $0, context: context) } ?? [] self.osagoContracts = NSSet(array: osagoContracts) let ads = vehicle.ads?.map { CDVAd(model: $0, context: context) } ?? [] self.ads = NSSet(array: ads) let notes = vehicle.notes?.map { CDVNote(model: $0, context: context) } ?? [] self.notes = NSSet(array: notes) self.debugInfo = CDDebugInfo(model: vehicle.debugInfo, context: context) } public var unrecognized: Bool { return self.brand == nil } public var outdated: Bool { if let current = self.currentNumber { return current != self.number } else { return false } } }