package handlers

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

	"github.com/juanatsap/cv-site/internal/models"
)

// HealthResponse represents the health check response
type HealthResponse struct {
	Status    string     `json:"status"`
	Timestamp time.Time  `json:"timestamp"`
	Version   string     `json:"version"`
	Cache     *CacheInfo `json:"cache,omitempty"`
}

// CacheInfo represents cache statistics
type CacheInfo struct {
	Hits    int64   `json:"hits"`
	Misses  int64   `json:"misses"`
	Size    int     `json:"size"`
	HitRate float64 `json:"hit_rate_percent"`
}

// HealthHandler handles health check requests
type HealthHandler struct {
	version string
}

// NewHealthHandler creates a new health handler
func NewHealthHandler(version string) *HealthHandler {
	return &HealthHandler{
		version: version,
	}
}

// Check performs a health check
func (h *HealthHandler) Check(w http.ResponseWriter, r *http.Request) {
	response := HealthResponse{
		Status:    "ok",
		Timestamp: time.Now(),
		Version:   h.version,
	}

	// Include cache stats if available
	if cache := models.GetCache(); cache != nil {
		stats := cache.GetStats()
		response.Cache = &CacheInfo{
			Hits:    stats.Hits,
			Misses:  stats.Misses,
			Size:    stats.Size,
			HitRate: cache.HitRate(),
		}
	}

	w.Header().Set("Content-Type", "application/json")
	w.WriteHeader(http.StatusOK)
	if err := json.NewEncoder(w).Encode(response); err != nil {
		// Log error but don't change response status (already written)
		log.Printf("ERROR encoding health check response: %v", err)
	}
}
