package handlers

import (
	"net/http"

	"github.com/go-chi/chi/v5"
	"github.com/go-chi/chi/v5/middleware"
	"github.com/go-chi/cors"
)

// Router construit le routeur HTTP complet de l'API.
// corsOrigin est l'origine autorisée pour les requêtes cross-origin.
func (a *API) Router(corsOrigin string) http.Handler {
	r := chi.NewRouter()

	r.Use(middleware.RealIP)
	r.Use(middleware.Logger)
	r.Use(middleware.Recoverer)

	// Configuration CORS pour l'origine du frontend.
	allowedOrigins := []string{"*"}
	if corsOrigin != "" {
		allowedOrigins = []string{corsOrigin}
	}
	r.Use(cors.Handler(cors.Options{
		AllowedOrigins:   allowedOrigins,
		AllowedMethods:   []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
		AllowedHeaders:   []string{"Accept", "Authorization", "Content-Type"},
		ExposedHeaders:   []string{"Content-Disposition"},
		AllowCredentials: true,
		MaxAge:           300,
	}))

	r.Route("/api", func(r chi.Router) {
		r.Get("/health", a.Health)

		// Authentification (routes publiques).
		r.Post("/auth/register", a.Register)
		r.Post("/auth/login", a.Login)
		r.Post("/auth/refresh", a.Refresh)

		// Routes protégées.
		r.Group(func(r chi.Router) {
			r.Use(a.RequireAuth)

			r.Post("/auth/logout", a.Logout)
			r.Get("/me", a.Me)

			r.Get("/documents", a.ListDocuments)
			r.Post("/documents", a.CreateDocument)
			r.Get("/documents/{id}", a.GetDocument)
			r.Get("/documents/{id}/file", a.GetDocumentFile)
			r.Put("/documents/{id}", a.UpdateDocument)
			r.Delete("/documents/{id}", a.DeleteDocument)
		})
	})

	return r
}

// Health répond au healthcheck.
func (a *API) Health(w http.ResponseWriter, r *http.Request) {
	writeJSON(w, http.StatusOK, map[string]string{"status": "ok"})
}
