package handlers

import (
	"database/sql"
	"net/http"
	"time"

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

type HealthHandler struct {
	db     *sql.DB
	logger *zap.Logger
}

func NewHealthHandler(db *sql.DB, logger *zap.Logger) *HealthHandler {
	return &HealthHandler{
		db:     db,
		logger: logger,
	}
}

func (h *HealthHandler) Health(c *gin.Context) {
	h.logger.Debug("Health check requested")

	response := gin.H{
		"status":    "healthy",
		"service":   "faas",
		"timestamp": time.Now().UTC().Format(time.RFC3339),
		"version":   "1.0.0",
	}

	c.JSON(http.StatusOK, response)
}

func (h *HealthHandler) Ready(c *gin.Context) {
	h.logger.Debug("Readiness check requested")

	checks := make(map[string]interface{})
	overall := "ready"

	// Check database connection
	if err := h.db.Ping(); err != nil {
		h.logger.Error("Database health check failed", zap.Error(err))
		checks["database"] = gin.H{
			"status": "unhealthy",
			"error":  err.Error(),
		}
		overall = "not ready"
	} else {
		checks["database"] = gin.H{
			"status": "healthy",
		}
	}

	response := gin.H{
		"status":    overall,
		"service":   "faas",
		"timestamp": time.Now().UTC().Format(time.RFC3339),
		"checks":    checks,
	}

	statusCode := http.StatusOK
	if overall != "ready" {
		statusCode = http.StatusServiceUnavailable
	}

	c.JSON(statusCode, response)
}