Skip to content
Snippets Groups Projects

MatchDetailViewModel.kt

  • Clone with SSH
  • Clone with HTTPS
  • Embed
  • Share
    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}"
                }
            }
        }
    }
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Finish editing this message first!
    Please register or to comment