package grpc

import (
	"context"

	"google.golang.org/grpc/codes"
	grpc_health "google.golang.org/grpc/health/grpc_health_v1"
	"google.golang.org/grpc/status"

	"github.com/pomerium/pomerium/internal/log"
)

type healthCheckSrv struct {
}

// NewHealthCheckServer returns a basic health checker
func NewHealthCheckServer() grpc_health.HealthServer {
	return &healthCheckSrv{}
}

// Check confirms service is reachable, and assumes any service is operational
// an outlier detection should be used to detect runtime malfunction based on consequitive 5xx
func (h *healthCheckSrv) Check(ctx context.Context, req *grpc_health.HealthCheckRequest) (*grpc_health.HealthCheckResponse, error) {
	log.Debug(ctx).Str("service", req.Service).Msg("health check")
	return &grpc_health.HealthCheckResponse{
		Status: grpc_health.HealthCheckResponse_SERVING,
	}, nil
}

// Watch is not implemented as is not used by Envoy
func (h *healthCheckSrv) Watch(req *grpc_health.HealthCheckRequest, _ grpc_health.Health_WatchServer) error {
	log.Error(context.Background()).Str("service", req.Service).Msg("health check watch")
	return status.Errorf(codes.Unimplemented, "method Watch not implemented")
}