package middleware

import (
	"context"
	"strings"

	"go.opencensus.io/plugin/ocgrpc"
	"go.opencensus.io/trace"
	"google.golang.org/grpc"
	"google.golang.org/grpc/stats"

	"github.com/caos/zitadel/internal/api/http"
	"github.com/caos/zitadel/internal/tracing"
)

type GRPCMethod string

func TracingStatsClient(ignoredMethods ...GRPCMethod) grpc.DialOption {
	return grpc.WithStatsHandler(
		&tracingClientHandler{
			ignoredMethods,
			ocgrpc.ClientHandler{
				StartOptions: trace.StartOptions{
					Sampler:  tracing.Sampler(),
					SpanKind: trace.SpanKindClient},
			},
		},
	)
}

func DefaultTracingStatsClient() grpc.DialOption {
	return TracingStatsClient(http.Healthz, http.Readiness, http.Validation)
}

type tracingClientHandler struct {
	IgnoredMethods []GRPCMethod
	ocgrpc.ClientHandler
}

func (s *tracingClientHandler) TagRPC(ctx context.Context, tagInfo *stats.RPCTagInfo) context.Context {
	for _, method := range s.IgnoredMethods {
		if strings.HasSuffix(tagInfo.FullMethodName, string(method)) {
			return ctx
		}
	}
	return s.ClientHandler.TagRPC(ctx, tagInfo)
}