package ru.forbion.f7cloud.mobile.ui

import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
import ru.forbion.f7cloud.core.auth.AppPasswordRevoker
import ru.forbion.f7cloud.core.auth.AuthSession
import ru.forbion.f7cloud.core.auth.AuthStore
import ru.forbion.f7cloud.feature.files.OfficeWarmup
import ru.forbion.f7cloud.mobile.OfficeWebViewPool

/**
 * Держит session/auth-жизненный цикл верхнего уровня (вынесено из AppScaffold).
 * В ViewModel сессия переживает пересоздание Activity (поворот и т.п.) — раньше
 * жила в remember и перечитывалась из AuthStore.
 */
class MainViewModel(app: Application) : AndroidViewModel(app) {
    private val authStore = AuthStore(app)
    private val _session = MutableStateFlow(authStore.load())
    val session: StateFlow<AuthSession?> = _session.asStateFlow()

    fun login(newSession: AuthSession) {
        authStore.save(newSession)
        _session.value = newSession
    }

    fun logout() {
        // Best-effort ревокация app password на сервере ДО очистки локальной сессии.
        _session.value?.let { current ->
            viewModelScope.launch { runCatching { AppPasswordRevoker.revoke(current) } }
        }
        OfficeWarmup.clear()
        OfficeWebViewPool.dispose()
        authStore.clear()
        _session.value = null
    }
}
