// Package health wires standard gRPC health and the optional HTTP readiness endpoint.
package health

import (
	"errors"

	"google.golang.org/grpc"
	healthgrpc "google.golang.org/grpc/health/grpc_health_v1"
	"hyapp/pkg/grpchealth"
	"hyapp/pkg/healthhttp"
)

// Config describes one service's shared gRPC health and HTTP readiness endpoint.
type Config struct {
	ServiceName  string
	HTTPAddr     string
	NodeID       string
	Dependencies []grpchealth.Dependency
}

// New registers standard gRPC health and creates the companion HTTP health server.
// Both endpoints share one checker so readiness/draining cannot diverge between CLB and gRPC probes.
func New(server *grpc.Server, cfg Config) (*grpchealth.ServingChecker, *healthhttp.Server, error) {
	if server == nil {
		return nil, nil, errors.New("grpc server is required")
	}
	health := grpchealth.NewServingChecker(cfg.ServiceName, cfg.Dependencies...)
	healthHTTP, err := Register(server, health, cfg.HTTPAddr, cfg.NodeID)
	if err != nil {
		return nil, nil, err
	}
	return health, healthHTTP, nil
}

// Register exposes an existing checker through standard gRPC health and HTTP readiness.
// Services with richer runtime checks keep their domain-specific checker but share the same transport wiring.
func Register(server *grpc.Server, checker grpchealth.Checker, httpAddr string, nodeID string) (*healthhttp.Server, error) {
	if server == nil {
		return nil, errors.New("grpc server is required")
	}
	if checker == nil {
		return nil, errors.New("health checker is required")
	}
	healthgrpc.RegisterHealthServer(server, grpchealth.NewServer(checker))
	return healthhttp.New(httpAddr, nodeID, checker)
}

// NewHTTP creates the shared checker and HTTP readiness endpoint for services that do not expose gRPC.
func NewHTTP(cfg Config) (*grpchealth.ServingChecker, *healthhttp.Server, error) {
	health := grpchealth.NewServingChecker(cfg.ServiceName, cfg.Dependencies...)
	healthHTTP, err := healthhttp.New(cfg.HTTPAddr, cfg.NodeID, health)
	if err != nil {
		return nil, nil, err
	}
	return health, healthHTTP, nil
}
