package com.jetpackduba.gitnuro.viewmodels import com.jetpackduba.gitnuro.TaskType import com.jetpackduba.gitnuro.git.RefreshType import com.jetpackduba.gitnuro.git.TabState import com.jetpackduba.gitnuro.git.stash.ApplyStashUseCase import com.jetpackduba.gitnuro.git.stash.DeleteStashUseCase import com.jetpackduba.gitnuro.git.stash.PopStashUseCase import com.jetpackduba.gitnuro.models.positiveNotification import com.jetpackduba.gitnuro.ui.SelectedItem import kotlinx.coroutines.Job import org.eclipse.jgit.revwalk.RevCommit import javax.inject.Inject interface ISharedStashViewModel { fun applyStash(stashInfo: RevCommit): Job fun popStash(stash: RevCommit): Job fun deleteStash(stash: RevCommit): Job fun selectStash(stash: RevCommit): Job fun stashDropped(stash: RevCommit): Job } class SharedStashViewModel @Inject constructor( private val applyStashUseCase: ApplyStashUseCase, private val popStashUseCase: PopStashUseCase, private val deleteStashUseCase: DeleteStashUseCase, private val tabState: TabState, ) : ISharedStashViewModel { override fun applyStash(stashInfo: RevCommit) = tabState.safeProcessing( refreshType = RefreshType.UNCOMMITTED_CHANGES_AND_LOG, refreshEvenIfCrashes = true, taskType = TaskType.APPLY_STASH, ) { git -> applyStashUseCase(git, stashInfo) positiveNotification("Stash applied") } override fun popStash(stash: RevCommit) = tabState.safeProcessing( refreshType = RefreshType.UNCOMMITTED_CHANGES_AND_LOG, refreshEvenIfCrashes = true, taskType = TaskType.POP_STASH, ) { git -> popStashUseCase(git, stash) stashDropped(stash) positiveNotification("Stash popped") } override fun deleteStash(stash: RevCommit) = tabState.safeProcessing( refreshType = RefreshType.STASHES, taskType = TaskType.DELETE_STASH, ) { git -> deleteStashUseCase(git, stash) stashDropped(stash) positiveNotification("Stash deleted") } override fun selectStash(stash: RevCommit) = tabState.runOperation( refreshType = RefreshType.NONE, ) { tabState.newSelectedStash(stash) } override fun stashDropped(stash: RevCommit) = tabState.runOperation( refreshType = RefreshType.NONE, ) { val selectedValue = tabState.selectedItem.value if ( selectedValue is SelectedItem.Stash && selectedValue.revCommit.name == stash.name ) { tabState.noneSelected() } } }