package com.kunzisoft.keepass.viewmodels import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel import com.kunzisoft.keepass.database.ContextualDatabase import com.kunzisoft.keepass.database.crypto.EncryptionAlgorithm import com.kunzisoft.keepass.database.crypto.kdf.KdfEngine import com.kunzisoft.keepass.database.element.Group import com.kunzisoft.keepass.database.element.database.CompressionAlgorithm import com.kunzisoft.keepass.tasks.ActionRunnable import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow class DatabaseViewModel: ViewModel() { var database: ContextualDatabase? = null private set private val mUiState = MutableStateFlow(UIState.Loading) val uiState: StateFlow = mUiState val actionFinished : LiveData get() = _actionFinished private val _actionFinished = SingleLiveEvent() val saveDatabase : LiveData get() = _saveDatabase private val _saveDatabase = SingleLiveEvent() val mergeDatabase : LiveData get() = _mergeDatabase private val _mergeDatabase = SingleLiveEvent() val reloadDatabase : LiveData get() = _reloadDatabase private val _reloadDatabase = SingleLiveEvent() val saveName : LiveData get() = _saveName private val _saveName = SingleLiveEvent() val saveDescription : LiveData get() = _saveDescription private val _saveDescription = SingleLiveEvent() val saveDefaultUsername : LiveData get() = _saveDefaultUsername private val _saveDefaultUsername = SingleLiveEvent() val saveColor : LiveData get() = _saveColor private val _saveColor = SingleLiveEvent() val saveCompression : LiveData get() = _saveCompression private val _saveCompression = SingleLiveEvent() val removeUnlinkData : LiveData get() = _removeUnlinkData private val _removeUnlinkData = SingleLiveEvent() val saveRecycleBin : LiveData get() = _saveRecycleBin private val _saveRecycleBin = SingleLiveEvent() val saveTemplatesGroup : LiveData get() = _saveTemplatesGroup private val _saveTemplatesGroup = SingleLiveEvent() val saveMaxHistoryItems : LiveData get() = _saveMaxHistoryItems private val _saveMaxHistoryItems = SingleLiveEvent() val saveMaxHistorySize : LiveData get() = _saveMaxHistorySize private val _saveMaxHistorySize = SingleLiveEvent() val saveEncryption : LiveData get() = _saveEncryption private val _saveEncryption = SingleLiveEvent() val saveKeyDerivation : LiveData get() = _saveKeyDerivation private val _saveKeyDerivation = SingleLiveEvent() val saveIterations : LiveData get() = _saveIterations private val _saveIterations = SingleLiveEvent() val saveMemoryUsage : LiveData get() = _saveMemoryUsage private val _saveMemoryUsage = SingleLiveEvent() val saveParallelism : LiveData get() = _saveParallelism private val _saveParallelism = SingleLiveEvent() fun defineDatabase(database: ContextualDatabase?) { this.database = database this.mUiState.value = UIState.OnDatabaseRetrieved(database) } fun onActionFinished(database: ContextualDatabase, actionTask: String, result: ActionRunnable.Result) { this._actionFinished.value = ActionResult(database, actionTask, result) } fun saveDatabase(save: Boolean) { _saveDatabase.value = save } fun mergeDatabase(save: Boolean) { _mergeDatabase.value = save } fun reloadDatabase(fixDuplicateUuid: Boolean) { _reloadDatabase.value = fixDuplicateUuid } fun saveName(oldValue: String, newValue: String, save: Boolean) { _saveName.value = SuperString(oldValue, newValue, save) } fun saveDescription(oldValue: String, newValue: String, save: Boolean) { _saveDescription.value = SuperString(oldValue, newValue, save) } fun saveDefaultUsername(oldValue: String, newValue: String, save: Boolean) { _saveDefaultUsername.value = SuperString(oldValue, newValue, save) } fun saveColor(oldValue: String, newValue: String, save: Boolean) { _saveColor.value = SuperString(oldValue, newValue, save) } fun saveCompression(oldValue: CompressionAlgorithm, newValue: CompressionAlgorithm, save: Boolean) { _saveCompression.value = SuperCompression(oldValue, newValue, save) } fun removeUnlinkedData(save: Boolean) { _removeUnlinkData.value = save } fun saveRecycleBin(oldValue: Group?, newValue: Group?, save: Boolean) { _saveRecycleBin.value = SuperGroup(oldValue, newValue, save) } fun saveTemplatesGroup(oldValue: Group?, newValue: Group?, save: Boolean) { _saveTemplatesGroup.value = SuperGroup(oldValue, newValue, save) } fun saveMaxHistoryItems(oldValue: Int, newValue: Int, save: Boolean) { _saveMaxHistoryItems.value = SuperInt(oldValue, newValue, save) } fun saveMaxHistorySize(oldValue: Long, newValue: Long, save: Boolean) { _saveMaxHistorySize.value = SuperLong(oldValue, newValue, save) } fun saveEncryption(oldValue: EncryptionAlgorithm, newValue: EncryptionAlgorithm, save: Boolean) { _saveEncryption.value = SuperEncryption(oldValue, newValue, save) } fun saveKeyDerivation(oldValue: KdfEngine, newValue: KdfEngine, save: Boolean) { _saveKeyDerivation.value = SuperKeyDerivation(oldValue, newValue, save) } fun saveIterations(oldValue: Long, newValue: Long, save: Boolean) { _saveIterations.value = SuperLong(oldValue, newValue, save) } fun saveMemoryUsage(oldValue: Long, newValue: Long, save: Boolean) { _saveMemoryUsage.value = SuperLong(oldValue, newValue, save) } fun saveParallelism(oldValue: Long, newValue: Long, save: Boolean) { _saveParallelism.value = SuperLong(oldValue, newValue, save) } sealed class UIState { object Loading: UIState() data class OnDatabaseRetrieved( val database: ContextualDatabase? ): UIState() } data class ActionResult(val database: ContextualDatabase, val actionTask: String, val result: ActionRunnable.Result) data class SuperString(val oldValue: String, val newValue: String, val save: Boolean) data class SuperInt(val oldValue: Int, val newValue: Int, val save: Boolean) data class SuperLong(val oldValue: Long, val newValue: Long, val save: Boolean) data class SuperMerge(val fixDuplicateUuid: Boolean, val save: Boolean) data class SuperCompression(val oldValue: CompressionAlgorithm, val newValue: CompressionAlgorithm, val save: Boolean) data class SuperEncryption(val oldValue: EncryptionAlgorithm, val newValue: EncryptionAlgorithm, val save: Boolean) data class SuperKeyDerivation(val oldValue: KdfEngine, val newValue: KdfEngine, val save: Boolean) data class SuperGroup(val oldValue: Group?, val newValue: Group?, val save: Boolean) }