package server
import (
"log/slog"
"net/http"
"github.com/go-chi/chi/v5"
"sourcecraft.dev/bigbes/huntsman/internal/domain/search"
"sourcecraft.dev/bigbes/huntsman/internal/platform/health"
"sourcecraft.dev/bigbes/huntsman/internal/server/middleware"
)
// Routes wires every HTTP route the service exposes.
//
// Keeping route registration in one file makes it easy to audit the
// public surface area without grepping every handler package.
func Routes(logger *slog.Logger, h *health.Health, searchHandler *search.Handler) http.Handler {
r := chi.NewRouter()
r.Use(middleware.RequestID)
r.Use(middleware.Recovery(logger))
r.Use(middleware.Logging(logger))
r.Get("/healthz", h.Healthz)
r.Get("/readyz", h.Readyz)
r.Get("/", indexHandler)
searchHandler.RegisterRoutes(r)
return r
}
// indexHandler advertises the unified OpenSearch document via a
// <link rel="search"> tag, so browsers offer to add the engine when
// the user visits the root URL.
func indexHandler(w http.ResponseWriter, _ *http.Request) {
const body = `<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>huntsman</title>
<link rel="search"
type="application/opensearchdescription+xml"
title="huntsman"
href="/opensearch.xml">
</head>
<body>
<h1>huntsman</h1>
<p>Multi-provider search router. Use prefixes:</p>
<ul>
<li><code>ud <query></code> — Urban Dictionary</li>
<li><code>gh <query></code> — GitHub</li>
<li><code>steam <query></code> — Steam</li>
</ul>
<p>Endpoints: <code>/search?q=...</code>, <code>/providers</code>,
<code>/opensearch.xml</code>,
<code>/opensearch/{provider}.xml</code>.</p>
</body>
</html>
`
w.Header().Set("Content-Type", "text/html; charset=utf-8")
_, _ = w.Write([]byte(body))
}