// // SDVehicle.swift // AutoCatCore // // Created by Selim Mustafaev on 10.06.2025. // Copyright © 2025 Selim Mustafaev. All rights reserved. // import Foundation import SwiftData @Model final class SDVehicle { @Relationship(deleteRule: .cascade) var brand: SDVehicleBrand? @Relationship(deleteRule: .cascade) var model: SDVehicleModel? var color: String? var year: Int var category: String? @Relationship(deleteRule: .cascade) var engine: SDVehicleEngine? @Attribute(.unique) var number: String var currentNumber: String? var vin1: String? var vin2: String? var sts: String? var pts: String? var isRightWheel: Bool? var isJapanese: Bool? var addedDate: TimeInterval var updatedDate: TimeInterval var addedBy: String @Relationship(deleteRule: .cascade) var photos: [SDVehiclePhoto] @Relationship(deleteRule: .cascade) var ownershipPeriods: [SDVehicleOwnershipPeriod] @Relationship(deleteRule: .cascade) var events: [SDVehicleEvent] @Relationship(deleteRule: .cascade) var osagoContracts: [SDOsago] @Relationship(deleteRule: .cascade) var ads: [SDVehicleAd] @Relationship(deleteRule: .cascade) var notes: [SDVehicleNote] @Relationship(deleteRule: .cascade) var debugInfo: SDDebugInfo? var synchronized: Bool init( brand: SDVehicleBrand? = nil, model: SDVehicleModel? = nil, color: String? = nil, year: Int, category: String? = nil, engine: SDVehicleEngine? = nil, number: String, currentNumber: String? = nil, vin1: String? = nil, vin2: String? = nil, sts: String? = nil, pts: String? = nil, isRightWheel: Bool? = nil, isJapanese: Bool? = nil, addedDate: TimeInterval, updatedDate: TimeInterval, addedBy: String, photos: [SDVehiclePhoto], ownershipPeriods: [SDVehicleOwnershipPeriod], events: [SDVehicleEvent], osagoContracts: [SDOsago], ads: [SDVehicleAd], notes: [SDVehicleNote], debugInfo: SDDebugInfo? = nil, synchronized: Bool ) { self.brand = brand self.model = model self.color = color self.year = year self.category = category self.engine = engine self.number = number self.currentNumber = currentNumber self.vin1 = vin1 self.vin2 = vin2 self.sts = sts self.pts = pts self.isRightWheel = isRightWheel self.isJapanese = isJapanese self.addedDate = addedDate self.updatedDate = updatedDate self.addedBy = addedBy self.photos = photos self.ownershipPeriods = ownershipPeriods self.events = events self.osagoContracts = osagoContracts self.ads = ads self.notes = notes self.debugInfo = debugInfo self.synchronized = synchronized } } extension SDVehicle: DtoConvertible { var shallowDto: VehicleDto { var vehicle = VehicleDto() vehicle.number = self.number vehicle.currentNumber = self.currentNumber vehicle.addedDate = self.addedDate vehicle.updatedDate = self.updatedDate vehicle.brand = self.brand?.dto vehicle.synchronized = self.synchronized vehicle.notes = notes.map(\.dto) vehicle.events = events.map(\.dto).sorted { $0.date > $1.date } return vehicle } var dto: VehicleDto { var vehicle = VehicleDto() vehicle.brand = brand?.dto vehicle.model = model?.dto vehicle.color = color vehicle.year = year vehicle.category = category vehicle.engine = engine?.dto vehicle.number = number vehicle.currentNumber = currentNumber vehicle.vin1 = vin1 vehicle.vin2 = vin2 vehicle.sts = sts vehicle.pts = pts vehicle.isRightWheel = isRightWheel vehicle.isJapanese = isJapanese vehicle.addedDate = addedDate vehicle.updatedDate = updatedDate vehicle.addedBy = addedBy vehicle.photos = photos.map(\.dto) vehicle.ownershipPeriods = ownershipPeriods.map(\.dto) vehicle.events = events.map(\.dto) vehicle.osagoContracts = osagoContracts.map(\.dto) vehicle.ads = ads.map(\.dto) vehicle.notes = notes.map(\.dto) vehicle.debugInfo = debugInfo?.dto vehicle.synchronized = synchronized return vehicle } convenience init(dto: VehicleDto) { self.init( brand: SDVehicleBrand(dto: dto.brand), model: SDVehicleModel(dto: dto.model), color: dto.color, year: dto.year, category: dto.category, engine: SDVehicleEngine(dto: dto.engine), number: dto.number, currentNumber: dto.currentNumber, vin1: dto.vin1, vin2: dto.vin2, sts: dto.sts, pts: dto.pts, isRightWheel: dto.isRightWheel, isJapanese: dto.isJapanese, addedDate: dto.addedDate, updatedDate: dto.updatedDate, addedBy: dto.addedBy, photos: dto.photos.map(SDVehiclePhoto.init), ownershipPeriods: dto.ownershipPeriods.map(SDVehicleOwnershipPeriod.init), events: dto.events.map(SDVehicleEvent.init), osagoContracts: dto.osagoContracts.map(SDOsago.init), ads: dto.ads.map(SDVehicleAd.init), notes: dto.notes.map(SDVehicleNote.init), debugInfo: SDDebugInfo(dto: dto.debugInfo), synchronized: dto.synchronized ) } }