package com.servicebook.ui.util import android.app.Application import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.createSavedStateHandle import androidx.lifecycle.viewmodel.CreationExtras import com.servicebook.ServiceBookApplication import com.servicebook.ui.records.AddEditRecordViewModel import com.servicebook.ui.records.RecordDetailViewModel import com.servicebook.ui.records.VehicleDetailViewModel import com.servicebook.ui.settings.CategoriesViewModel import com.servicebook.ui.settings.SettingsViewModel import com.servicebook.ui.vehicles.AddEditVehicleViewModel import com.servicebook.ui.vehicles.VehicleListViewModel class ViewModelFactory( private val application: Application, private val extraParams: Map = emptyMap(), ) : ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") override fun create(modelClass: Class): T { return create(modelClass, CreationExtras.Empty) } @Suppress("UNCHECKED_CAST") override fun create( modelClass: Class, extras: CreationExtras, ): T { val app = application as ServiceBookApplication val dependencies = ViewModelDependencies( app = app, appGate = app.appGate, vehicleRepository = app.vehicleRepository, recordRepository = app.recordRepository, categoryRepository = app.categoryRepository, vaultStorage = app.vaultStorage, preferences = app.preferences, billingManager = app.billingManager, debugBillingOverride = app.debugBillingOverride, ) val viewModel = when { modelClass.isAssignableFrom(VehicleListViewModel::class.java) -> { createVehicleListViewModel(extras, dependencies) } modelClass.isAssignableFrom(VehicleDetailViewModel::class.java) -> { createVehicleDetailViewModel(dependencies) } modelClass.isAssignableFrom(AddEditVehicleViewModel::class.java) -> { val vehicleId = extraParams["vehicleId"] as? String AddEditVehicleViewModel(vehicleId, dependencies) } modelClass.isAssignableFrom(RecordDetailViewModel::class.java) -> { createRecordDetailViewModel(dependencies) } modelClass.isAssignableFrom(AddEditRecordViewModel::class.java) -> { createAddEditRecordViewModel(dependencies) } modelClass.isAssignableFrom(CategoriesViewModel::class.java) -> { CategoriesViewModel(dependencies) } modelClass.isAssignableFrom(SettingsViewModel::class.java) -> { SettingsViewModel(dependencies) } else -> throw IllegalArgumentException("Unknown ViewModel class: ${modelClass.name}") } return viewModel as T } private fun createVehicleListViewModel( extras: CreationExtras, dependencies: ViewModelDependencies, ): VehicleListViewModel = VehicleListViewModel(extras.createSavedStateHandle(), dependencies) private fun createVehicleDetailViewModel(dependencies: ViewModelDependencies): VehicleDetailViewModel { val vehicleId = extraParams["vehicleId"] as? String ?: throw IllegalArgumentException("VehicleDetailViewModel requires vehicleId") return VehicleDetailViewModel(vehicleId, dependencies) } private fun createRecordDetailViewModel(dependencies: ViewModelDependencies): RecordDetailViewModel { val vehicleId = extraParams["vehicleId"] as? String ?: throw IllegalArgumentException("RecordDetailViewModel requires vehicleId") val recordId = extraParams["recordId"] as? String ?: throw IllegalArgumentException("RecordDetailViewModel requires recordId") return RecordDetailViewModel(vehicleId, recordId, dependencies) } private fun createAddEditRecordViewModel(dependencies: ViewModelDependencies): AddEditRecordViewModel { val vehicleId = extraParams["vehicleId"] as? String ?: throw IllegalArgumentException("AddEditRecordViewModel requires vehicleId") val recordId = extraParams["recordId"] as? String return AddEditRecordViewModel(vehicleId, recordId, dependencies) } }