// Package httpx implements the application HTTP server: routing, middleware
// (recovery, request id, trusted-proxy client resolution, access logging),
// health endpoints, and shared JSON response helpers. Named httpx to avoid
// clashing with net/http; it lives in internal/http per the repository layout.
package httpx

import (
	"encoding/json"
	"log/slog"
	"net/http"
)

// errorEnvelope is the consistent error body for every JSON error response:
// {"error":{"code":"...","message":"..."}}.
type errorEnvelope struct {
	Error errorBody `json:"error"`
}

type errorBody struct {
	Code    string `json:"code"`
	Message string `json:"message"`
}

func writeJSON(w http.ResponseWriter, status int, v any) {
	w.Header().Set("Content-Type", "application/json; charset=utf-8")
	w.WriteHeader(status)
	if err := json.NewEncoder(w).Encode(v); err != nil {
		slog.Error("write json response", "err", err)
	}
}

func writeError(w http.ResponseWriter, status int, code, message string) {
	writeJSON(w, status, errorEnvelope{Error: errorBody{Code: code, Message: message}})
}
