package health

import (
	"context"
	"net/http"
	"strconv"
	"time"

	"golang.org/x/exp/slog"
)

// HealthCheckListener runs simple http server on the specified port for
// health check probes
func HealthCheckListener(ctx context.Context, port int, log *slog.Logger) {
	log.Info("Starting health listener", "port", port)

	serveMux := http.NewServeMux()

	serveMux.HandleFunc("/__health", basicHealth)

	srv := &http.Server{
		Addr:         ":" + strconv.Itoa(port),
		ReadTimeout:  10 * time.Second,
		WriteTimeout: 20 * time.Second,
		IdleTimeout:  120 * time.Second,
		Handler:      serveMux,
	}

	go func() {
		err := srv.ListenAndServe()
		if err != http.ErrServerClosed {
			log.Warn("health check server done listening", "err", err)
		}
	}()

	<-ctx.Done()

	if err := srv.Shutdown(ctx); err != nil {
		log.Error("health check server shutdown failed", "err", err)
	}

}

func basicHealth(w http.ResponseWriter, r *http.Request) {
	w.WriteHeader(200)
	w.Write([]byte("ok"))
}