package de.tsschulz.tt_tagebuch.shared.api.http

import io.ktor.client.statement.HttpResponse
import io.ktor.client.statement.bodyAsText
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.jsonPrimitive

private val looseJson = Json { ignoreUnknownKeys = true }

/**
 * Liest JSON-Fehlerantworten (`error`, `message`) wie die Node-API sie oft liefert.
 */
internal suspend fun HttpResponse.userFacingErrorOr(fallback: String): String {
    val raw = runCatching { bodyAsText() }.getOrNull().orEmpty().trim()
    if (raw.isEmpty()) return fallback
    val extracted = runCatching {
        val el = looseJson.parseToJsonElement(raw)
        if (el !is JsonObject) return@runCatching null
        el["error"]?.jsonPrimitive?.content?.takeIf { it.isNotBlank() }
            ?: el["message"]?.jsonPrimitive?.content?.takeIf { it.isNotBlank() }
    }.getOrNull()
    val text = extracted ?: raw.take(500).let { if (raw.length > 500) "$it…" else it }
    return mapKnownBackendErrorTokens(text)
}

private fun mapKnownBackendErrorTokens(raw: String): String {
    return when (raw.trim().lowercase()) {
        "alreadyexists" -> "Ein Verein mit diesem Namen existiert bereits."
        "noaccess" -> "Kein Zugriff auf diese Ressource."
        "internalerror" -> "Serverfehler. Bitte später erneut versuchen."
        "notrequested" -> "Für diesen Verein wurde kein Zugriff beantragt."
        else -> raw
    }
}
