package health

import (
	"context"
	"net/http"

	"github.com/gin-gonic/gin"

	"security-center-backend/internal/modules/caasm/queue"
	caasmservice "security-center-backend/internal/modules/caasm/service"
)

type Handler struct {
	queueMetricsProvider    func(ctx context.Context) (*queue.QueueMetrics, error)
	schedulerStatusProvider func() caasmservice.SchedulerStatus
}

func NewHandler() *Handler {
	return &Handler{}
}

// SetQueueMetricsProvider sets the function to retrieve queue metrics
func (h *Handler) SetQueueMetricsProvider(provider func(ctx context.Context) (*queue.QueueMetrics, error)) {
	h.queueMetricsProvider = provider
}

// SetSchedulerStatusProvider sets the function to retrieve scheduler status
func (h *Handler) SetSchedulerStatusProvider(provider func() caasmservice.SchedulerStatus) {
	h.schedulerStatusProvider = provider
}

func (h *Handler) RegisterRoutes(rg *gin.RouterGroup) {
	rg.GET("/health", h.Health)
	rg.GET("/version", h.Version)
	rg.GET("/health/queue", h.QueueHealth)
}

func (h *Handler) Health(c *gin.Context) {
	response := gin.H{
		"status": "ok",
	}

	// Add queue metrics if available
	if h.queueMetricsProvider != nil {
		if metrics, err := h.queueMetricsProvider(c.Request.Context()); err == nil && metrics != nil {
			response["job_queue"] = metrics
		} else if err != nil {
			response["job_queue_error"] = err.Error()
		}
	}

	// Add scheduler status if available
	if h.schedulerStatusProvider != nil {
		response["scheduler"] = h.schedulerStatusProvider()
	}

	c.JSON(http.StatusOK, response)
}

// QueueHealth exposes only queue metrics (without other health payload).
func (h *Handler) QueueHealth(c *gin.Context) {
	if h.queueMetricsProvider == nil {
		c.JSON(http.StatusServiceUnavailable, gin.H{"error": "queue metrics unavailable"})
		return
	}
	metrics, err := h.queueMetricsProvider(c.Request.Context())
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}
	c.JSON(http.StatusOK, metrics)
}

func (h *Handler) Version(c *gin.Context) {
	c.JSON(http.StatusOK, gin.H{
		"service": "security-center",
		"version": "0.1.0",
	})
}
