package de.krisenvorrat.app.domain.usecase

import de.krisenvorrat.app.domain.model.SettingsKey.StringKey
import de.krisenvorrat.app.domain.model.UpdateCheckResult
import de.krisenvorrat.app.domain.repository.SettingsRepository
import de.krisenvorrat.app.domain.repository.UpdateRepository
import javax.inject.Inject

internal class CheckForUpdateUseCase @Inject constructor(
    private val updateRepository: UpdateRepository,
    private val settingsRepository: SettingsRepository
) {

    suspend operator fun invoke(currentVersionCode: Int): UpdateCheckResult {
        val serverUrl = settingsRepository.getString(StringKey.ServerUrl)
        if (serverUrl.isBlank()) {
            return UpdateCheckResult.NotConfigured
        }

        return updateRepository.checkForUpdate(serverUrl).fold(
            onSuccess = { versionInfo ->
                if (versionInfo.versionCode > currentVersionCode) {
                    UpdateCheckResult.UpdateAvailable(versionInfo)
                } else {
                    UpdateCheckResult.UpToDate
                }
            },
            onFailure = { error ->
                UpdateCheckResult.Error(error)
            }
        )
    }
}
