package pl.firmatpp.kierowca.data.sync

import java.io.IOException
import kotlinx.coroutines.withTimeoutOrNull
import pl.firmatpp.kierowca.domain.StartupSessionPolicy

class StartupOfflineFallbackLoader(
    private val timeoutMillis: Long = StartupSessionPolicy.OFFLINE_FALLBACK_MILLIS,
) {
    suspend fun <T> load(
        onlineLoad: suspend () -> T,
        offlineLoad: suspend () -> T?,
    ): T {
        val onlineValue = withTimeoutOrNull(timeoutMillis) {
            onlineLoad()
        }
        if (onlineValue != null) {
            return onlineValue
        }

        return offlineLoad()
            ?: throw IOException(
                "Serwer nie odpowiedział w ciągu ${StartupSessionPolicy.OFFLINE_FALLBACK_SECONDS} sekund " +
                    "i w telefonie nie ma zapisanych danych offline.",
            )
    }
}
