MatchDetailViewModel.kt
The snippet can be accessed without any authentication.
Authored by
a6-alrashdi
Edited
MatchDetailViewModel.kt 5.09 KiB
package com.example.match.ui.matchdetail
import android.content.Context
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.example.match.db.PredictionEntity
import com.example.match.model.Fixture
import com.example.match.model.LiveScore
import com.example.match.repository.MatchRepository
import com.example.match.repository.PredictionRepository
import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
import javax.inject.Inject
@HiltViewModel
class MatchDetailViewModel @Inject constructor(
private val matchRepository: MatchRepository,
@ApplicationContext private val appContext: Context
) : ViewModel() {
private val _fixtureState = MutableStateFlow<Fixture?>(null)
val fixtureState: StateFlow<Fixture?> get() = _fixtureState
private val _liveScoreState = MutableStateFlow<LiveScore?>(null)
val liveScoreState: StateFlow<LiveScore?> get() = _liveScoreState
private val _predictionSaved = MutableStateFlow<Boolean?>(null)
val predictionSaved: StateFlow<Boolean?> get() = _predictionSaved
private val _currentUserPrediction = MutableStateFlow<PredictionEntity?>(null)
val currentUserPrediction: StateFlow<PredictionEntity?> get() = _currentUserPrediction
private val _errorMessage = MutableStateFlow<String?>(null)
val errorMessage: StateFlow<String?> = _errorMessage.asStateFlow()
private val _statistics = MutableStateFlow<String>("")
val statistics: StateFlow<String> = _statistics.asStateFlow()
fun fetchMatchDetailById(matchId: String) {
viewModelScope.launch {
try {
val upcoming = matchRepository.getUpcomingMatches()
val live = matchRepository.getLiveScores()
val foundFixture = upcoming.find { it.matchId == matchId }
val foundLive = live.find { it.matchId == matchId }
if (foundFixture != null) {
_fixtureState.value = foundFixture
} else if (foundLive != null) {
_liveScoreState.value = foundLive
checkAndMarkPredictionIfMatchFinished()
} else {
println("Match not found in upcoming or live.")
}
} catch (e: Exception) {
println("Error fetching match details: ${e.message}")
}
}
}
fun fetchUserPrediction(matchId: String, userId: Int) {
viewModelScope.launch {
val existingPred = PredictionRepository.getPredictionForUserAndMatch(
context = appContext,
matchId = matchId,
userId = userId
)
_currentUserPrediction.value = existingPred
}
}
fun saveUserPrediction(
matchId: String,
userId: Int,
homeScore: Int,
awayScore: Int
) {
viewModelScope.launch {
val entity = PredictionEntity(
matchId = matchId,
userId = userId,
homeScore = homeScore,
awayScore = awayScore,
timestamp = System.currentTimeMillis()
)
val result = PredictionRepository.savePrediction(appContext, entity)
_predictionSaved.value = result.isSuccess
if (result.isSuccess) {
val newId = result.getOrNull() ?: 0
_currentUserPrediction.value = entity.copy(id = newId.toInt())
}
}
}
fun checkAndMarkPredictionIfMatchFinished() {
viewModelScope.launch {
val live = _liveScoreState.value
val pred = _currentUserPrediction.value
if (live?.status == -1 && pred != null) {
// match ended
val finalHome = live.homeScore ?: 0
val finalAway = live.awayScore ?: 0
val correct = (finalHome == pred.homeScore && finalAway == pred.awayScore)
val updated = PredictionRepository.updatePredictionCorrect(
context = appContext,
predictionId = pred.id,
isCorrect = correct
)
if (updated) {
_currentUserPrediction.value = pred.copy(isCorrect = correct)
}
}
}
}
fun showError(message: String) {
_errorMessage.value = message
}
fun clearError() {
_errorMessage.value = null
}
fun fetchMatchStatistics(matchId: String) {
viewModelScope.launch {
try {
val result = matchRepository.fetchMatchStatistics(matchId)
_statistics.value = result.toString()
} catch (e: Exception) {
_statistics.value = "Error: ${e.message}"
}
}
}
}
Please register or sign in to comment