package metric

import (
	"context"

	grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus"
	"github.com/tidbcloud/pkgv2/bizerr"
	"github.com/tidbcloud/serverless-service/internal/utils"
	"google.golang.org/grpc"
	"google.golang.org/grpc/status"
)

// UnaryServerInterceptor returns a new unary server interceptor that provides Prometheus monitoring.
func UnaryServerInterceptor() grpc.UnaryServerInterceptor {
	return func(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (any, error) {
		resp, err := handler(ctx, req)
		errorHandler := func(ctx context.Context, req any) (any, error) {
			if bizError, ok := err.(bizerr.BizError); ok {
				return nil, status.Error(utils.BizCode2GrpcCode(bizError.ErrCode()), bizError.ErrMsg())
			}
			return nil, err
		}
		_, _ = grpc_prometheus.UnaryServerInterceptor(ctx, req, info, errorHandler) // record the correct `grpc_code`
		return resp, err
	}
}
