package de.frigosped.dc.security;

import jakarta.annotation.Priority;
import jakarta.ws.rs.Priorities;
import jakarta.ws.rs.container.ContainerRequestContext;
import jakarta.ws.rs.container.ContainerRequestFilter;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.Provider;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import org.jboss.logging.Logger;

import java.util.Map;
import java.util.Optional;

/**
 * Prüft den X-API-KEY-Header bei allen Anfragen.
 * Konfiguration: dc.api.key (Env: DC_API_KEY)
 * Wenn kein Key konfiguriert ist, läuft der Service ohne Auth (Dev-Modus).
 */
@Provider
@Priority(Priorities.AUTHENTICATION)
public class ApiKeyFilter implements ContainerRequestFilter {

    private static final Logger LOG = Logger.getLogger(ApiKeyFilter.class);
    private static final String HEADER = "X-API-KEY";

    @ConfigProperty(name = "dc.api.key")
    Optional<String> apiKey;

    @Override
    public void filter(ContainerRequestContext ctx) {
        // Health-Endpunkt immer durchlassen (Docker-Healthcheck)
        if (ctx.getUriInfo().getPath().endsWith("/health")) {
            return;
        }

        // Kein Key konfiguriert → Auth deaktiviert (Dev-Modus)
        if (apiKey.isEmpty() || apiKey.get().isBlank()) {
            LOG.warnf("DC_API_KEY nicht gesetzt – Anfrage ohne Auth durchgelassen: %s",
                ctx.getUriInfo().getPath());
            return;
        }

        String provided = ctx.getHeaderString(HEADER);
        if (provided == null || !provided.equals(apiKey.get())) {
            LOG.warnf("Ungültiger oder fehlender API-Key für: %s", ctx.getUriInfo().getPath());
            ctx.abortWith(Response
                .status(Response.Status.UNAUTHORIZED)
                .type(MediaType.APPLICATION_JSON)
                .entity(Map.of("error", "Ungültiger oder fehlender API-Key",
                               "header", HEADER))
                .build());
        }
    }
}
