package health

import (
	"context"
	"sync"

	"git.dcentral.systems/toolz/goplt/pkg/health"
)

// Registry manages health checkers.
type Registry struct {
	checkers map[string]health.HealthChecker
	mu       sync.RWMutex
}

// NewRegistry creates a new health check registry.
func NewRegistry() *Registry {
	return &Registry{
		checkers: make(map[string]health.HealthChecker),
	}
}

// Register registers a health checker with the given name.
func (r *Registry) Register(name string, checker health.HealthChecker) {
	r.mu.Lock()
	defer r.mu.Unlock()
	r.checkers[name] = checker
}

// Check performs health checks for all registered checkers.
func (r *Registry) Check(ctx context.Context) health.HealthStatus {
	r.mu.RLock()
	defer r.mu.RUnlock()

	components := make([]health.ComponentStatus, 0, len(r.checkers))
	overallStatus := health.StatusHealthy

	for name, checker := range r.checkers {
		err := checker.Check(ctx)
		status := health.StatusHealthy
		errorMsg := ""

		if err != nil {
			status = health.StatusUnhealthy
			errorMsg = err.Error()
			overallStatus = health.StatusUnhealthy
		}

		components = append(components, health.ComponentStatus{
			Name:   name,
			Status: status,
			Error:  errorMsg,
		})
	}

	return health.HealthStatus{
		Status:     overallStatus,
		Components: components,
	}
}

// LivenessCheck performs a basic liveness check (no dependencies).
func (r *Registry) LivenessCheck(_ context.Context) health.HealthStatus {
	// Liveness is always healthy if the service is running
	return health.HealthStatus{
		Status: health.StatusHealthy,
	}
}

// ReadinessCheck performs a readiness check (includes dependency checks).
func (r *Registry) ReadinessCheck(ctx context.Context) health.HealthStatus {
	return r.Check(ctx)
}
