package ru.forbion.f7cloud.core.auth

import android.content.Context

class AuthStore(context: Context) {
    private val prefs = context.getSharedPreferences("f7_auth", Context.MODE_PRIVATE)

    fun save(session: AuthSession) {
        prefs.edit()
            .putString("server_url", session.serverUrl.trimEnd('/'))
            .putString("username", session.username.trim())
            // app password шифруется в покое ключом из AndroidKeystore (см. KeystoreCrypto)
            .putString("app_password", KeystoreCrypto.encrypt(session.appPassword))
            .putBoolean("trust_all_certs", session.trustAllCerts)
            .putString("dav_user_id", session.davUserId)
            .apply()
    }

    fun load(): AuthSession? {
        val serverUrl = prefs.getString("server_url", null) ?: return null
        val username = prefs.getString("username", null) ?: return null
        val storedPassword = prefs.getString("app_password", null) ?: return null

        val appPassword = if (KeystoreCrypto.isEncrypted(storedPassword)) {
            // Расшифровка может упасть, если Keystore-ключ инвалидирован (сброс учётных
            // данных устройства) — трактуем как «сессии нет», пользователь войдёт заново.
            runCatching { KeystoreCrypto.decrypt(storedPassword) }.getOrNull() ?: return null
        } else {
            // Legacy: пароль сохранён plaintext (до шифрования) — используем и МИГРИРУЕМ ниже.
            storedPassword
        }

        val session = AuthSession(
            serverUrl = serverUrl,
            username = username,
            appPassword = appPassword,
            trustAllCerts = prefs.getBoolean("trust_all_certs", false),
            davUserId = prefs.getString("dav_user_id", null),
        )
        if (!KeystoreCrypto.isEncrypted(storedPassword)) {
            runCatching { save(session) } // одноразовая миграция plaintext → ciphertext
        }
        return session
    }

    fun clear() {
        prefs.edit().clear().apply()
    }
}
