package app

import (
	"context"

	"go.uber.org/dig"
	"google.golang.org/grpc"
	healthpb "google.golang.org/grpc/health/grpc_health_v1"

	"github.com/tidbcloud/aisupport/packages/sdk-go/infra/logger"
	"github.com/tidbcloud/aisupport/packages/sdk-go/infra/rpcserver"
	"github.com/tidbcloud/aisupport/packages/sdk-go/infra/rpcserver/middlewares"
	"github.com/tidbcloud/aisupport/services/agent-sidecar/config"
)

type HandlerResult struct {
	dig.Out

	Handler rpcserver.RPCHandler `group:"rpcHandlers"`
}

type RPCServerParam struct {
	dig.In

	Config   *config.RootConfig
	Handlers []rpcserver.RPCHandler `group:"rpcHandlers"`
}

func NewRPCServer(param RPCServerParam) (*rpcserver.RPCServer, error) {
	return rpcserver.NewRPCServer(rpcserver.RPCServerParam{
		Address: param.Config.RPCServer.Address,
		Logger:  logger.Logger,
		ServerOptions: []grpc.ServerOption{
			grpc.MaxRecvMsgSize(8 << 20),
			grpc.MaxSendMsgSize(8 << 20),
			(&middlewares.LogMetricMiddlewareBuilder{
				Request: middlewares.RequestLoggerOptions{
					Logger:     logger.Logger,
					LogPayload: false,
					FilterFunc: rpcLogFilter,
				},
			}).Build(),
		},
		Handlers: param.Handlers,
		Tracing:  true,
	})
}

func rpcLogFilter(_ context.Context, _ any, info *grpc.UnaryServerInfo) bool {
	return info.FullMethod == healthpb.Health_Check_FullMethodName
}
