package trace

import (
	"context"
	"time"

	"github.com/tidbcloud/pkgv2/bizerr"
	"github.com/tidbcloud/pkgv2/log"
	"go.opentelemetry.io/otel/trace"
	"go.uber.org/zap"
	"google.golang.org/grpc"
)

func UnaryServerInterceptor() grpc.UnaryServerInterceptor {
	return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
		logger := log.WithContextL(ctx).With(
			zap.String("method", info.FullMethod),
		)
		traceId := trace.SpanContextFromContext(ctx).TraceID()

		start := time.Now()
		logger.Info("begin", zap.String("traceId", traceId.String()))
		logger.Sugar().Debugf("param=%+v", req)
		resp, err := handler(ctx, req)
		cost := time.Since(start)
		logger.Info("end", zap.String("cost", cost.String()), zap.Bool("succ", err == nil), zap.Error(err))
		logger.Sugar().Debugf("resp=%+v", resp)
		if be, ok := err.(bizerr.BizError); ok && be.IsException() {
			logger.Error("error", zap.String("error", be.Error()))
		}
		return resp, err
	}
}
