package dev.jdtech.jellyfin.viewmodels import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import dev.jdtech.jellyfin.models.FavoriteSection import dev.jdtech.jellyfin.repository.JellyfinRepository import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.jellyfin.sdk.model.api.BaseItemKind import java.util.* import javax.inject.Inject @HiltViewModel class SearchResultViewModel @Inject constructor( private val jellyfinRepository: JellyfinRepository ) : ViewModel() { private val _uiState = MutableStateFlow(UiState.Loading) val uiState = _uiState.asStateFlow() sealed class UiState { data class Normal(val sections: List) : UiState() object Loading : UiState() data class Error(val error: Exception) : UiState() } fun loadData(query: String) { viewModelScope.launch { _uiState.emit(UiState.Loading) try { val items = jellyfinRepository.getSearchItems(query) if (items.isEmpty()) { _uiState.emit(UiState.Normal(emptyList())) return@launch } val sections = mutableListOf() withContext(Dispatchers.Default) { FavoriteSection( UUID.randomUUID(), "Movies", items.filter { it.type == BaseItemKind.MOVIE }).let { if (it.items.isNotEmpty()) sections.add( it ) } FavoriteSection( UUID.randomUUID(), "Shows", items.filter { it.type == BaseItemKind.SERIES }).let { if (it.items.isNotEmpty()) sections.add( it ) } FavoriteSection( UUID.randomUUID(), "Episodes", items.filter { it.type == BaseItemKind.EPISODE }).let { if (it.items.isNotEmpty()) sections.add( it ) } } _uiState.emit(UiState.Normal(sections)) } catch (e: Exception) { _uiState.emit(UiState.Error(e)) } } } }