// Package handlers contient les handlers HTTP et le routeur de l'API.
package handlers

import (
	"encoding/json"
	"net/http"

	"github.com/jackc/pgx/v5/pgxpool"

	"pdfeditor/internal/auth"
	"pdfeditor/internal/storage"
)

// maxUploadSize est la taille maximale autorisée pour un upload de PDF (50 Mo).
const maxUploadSize = 50 << 20

// API regroupe les dépendances partagées par les handlers.
type API struct {
	DB      *pgxpool.Pool
	Auth    *auth.Manager
	Storage *storage.Store
}

// New crée une instance d'API.
func New(db *pgxpool.Pool, authMgr *auth.Manager, store *storage.Store) *API {
	return &API{DB: db, Auth: authMgr, Storage: store}
}

// writeJSON sérialise v en JSON avec le code de statut donné.
func writeJSON(w http.ResponseWriter, status int, v interface{}) {
	w.Header().Set("Content-Type", "application/json")
	w.WriteHeader(status)
	if v != nil {
		_ = json.NewEncoder(w).Encode(v)
	}
}

// writeError renvoie une erreur au format { "error": "..." }.
func writeError(w http.ResponseWriter, status int, message string) {
	writeJSON(w, status, map[string]string{"error": message})
}

// decodeJSON décode le corps JSON de la requête dans v.
// Retourne false (et écrit une 400) en cas d'échec.
func decodeJSON(w http.ResponseWriter, r *http.Request, v interface{}) bool {
	if err := json.NewDecoder(r.Body).Decode(v); err != nil {
		writeError(w, http.StatusBadRequest, "corps de requête JSON invalide")
		return false
	}
	return true
}
