package httpserver

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

	"bit.admedia.com/scm/ad/adpilot-indexing-commit-intel.com/internal/platform"
)

type statusResponse struct {
	Service string `json:"service"`
	Status  string `json:"status"`
}

type versionResponse struct {
	Service   string `json:"service"`
	Version   string `json:"version"`
	BuildInfo string `json:"build_info"`
}

func writeJSON(w http.ResponseWriter, status int, payload any) {
	w.Header().Set("Content-Type", "application/json")
	w.WriteHeader(status)
	_ = json.NewEncoder(w).Encode(payload)
}

func handleRoot(serviceName string) http.HandlerFunc {
	return func(w http.ResponseWriter, _ *http.Request) {
		writeJSON(w, http.StatusOK, statusResponse{Service: serviceName, Status: "ok"})
	}
}

func handleHealthz(serviceName string) http.HandlerFunc {
	return func(w http.ResponseWriter, _ *http.Request) {
		writeJSON(w, http.StatusOK, statusResponse{Service: serviceName, Status: "healthy"})
	}
}

func handleReadyz(serviceName string, ready func() bool) http.HandlerFunc {
	return func(w http.ResponseWriter, _ *http.Request) {
		status := "ready"
		code := http.StatusOK
		if !ready() {
			status = "not_ready"
			code = http.StatusServiceUnavailable
		}
		writeJSON(w, code, statusResponse{Service: serviceName, Status: status})
	}
}

func handleVersion(serviceName string) http.HandlerFunc {
	return func(w http.ResponseWriter, _ *http.Request) {
		writeJSON(w, http.StatusOK, versionResponse{
			Service:   serviceName,
			Version:   platform.Version,
			BuildInfo: platform.BuildInfo(),
		})
	}
}
