package at.mocode.gateway.auth

import at.mocode.shared.config.AppConfig
import io.ktor.http.*
import io.ktor.server.application.*
import io.ktor.server.auth.*
import io.ktor.server.request.*
import io.ktor.server.response.*

/**
 * Konfiguriert die API-Key-Authentifizierung für die Anwendung.
 * Diese einfache Authentifizierung kann für externe Systeme verwendet werden,
 * die keinen JWT-basierten Zugriff benötigen.
 */
fun Application.configureApiKeyAuth() {
    val apiKey = AppConfig.security.apiKey ?: "api-key-not-configured"

    install(Authentication) {
        register(object : AuthenticationProvider(object : AuthenticationProvider.Config("api-key") {}) {
            override suspend fun onAuthenticate(context: AuthenticationContext) {
                val call = context.call

                val requestApiKey = call.request.header("X-API-Key")
                    ?: call.request.queryParameters["api_key"]

                if (requestApiKey == apiKey) {
                    context.principal(ApiKeyPrincipal(apiKey))
                } else {
                    context.challenge("ApiKeyAuth", AuthenticationFailedCause.InvalidCredentials) { challenge, call ->
                        call.respond(HttpStatusCode.Unauthorized, "Ungültiger API-Key")
                        challenge.complete()
                    }
                }
            }
        })
    }
}

/**
 * Principal für die API-Key-Authentifizierung.
 */
class ApiKeyPrincipal(val apiKey: String)
