package dev.jdtech.jellyfin.viewmodels import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import dev.jdtech.jellyfin.api.JellyfinApi import dev.jdtech.jellyfin.database.Server import dev.jdtech.jellyfin.database.ServerDatabaseDao import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import timber.log.Timber import javax.inject.Inject @HiltViewModel class AddServerViewModel @Inject constructor( private val jellyfinApi: JellyfinApi, private val database: ServerDatabaseDao ) : ViewModel() { private val _navigateToLogin = MutableLiveData() val navigateToLogin: LiveData = _navigateToLogin private val _error = MutableLiveData() val error: LiveData = _error /** * Run multiple check on the server before continuing: * * - Connect to server and check if it is a Jellyfin server * - Check if server is not already in Database */ fun checkServer(baseUrl: String) { _error.value = null viewModelScope.launch { jellyfinApi.apply { api.baseUrl = baseUrl api.accessToken = null } try { val publicSystemInfo by jellyfinApi.systemApi.getPublicSystemInfo() Timber.d("Remote server: ${publicSystemInfo.id}") if (serverAlreadyInDatabase(publicSystemInfo.id)) { _error.value = "Server already added" _navigateToLogin.value = false } else { _error.value = null _navigateToLogin.value = true } } catch (e: Exception) { Timber.e(e) _error.value = e.message _navigateToLogin.value = false } } } /** * Check if server is already in database using server ID * * @param id Server ID * @return True if server is already in database */ private suspend fun serverAlreadyInDatabase(id: String?): Boolean { val servers: List withContext(Dispatchers.IO) { servers = database.getAllServersSync() } for (server in servers) { Timber.d("Database server: ${server.id}") if (server.id == id) { Timber.w("Server already in the database") return true } } return false } fun onNavigateToLoginDone() { _navigateToLogin.value = false } }