package server

import (
	"github.com/UpmeshLTD/urus-aio/pdf/config"
	"github.com/UpmeshLTD/urus-aio/pdf/log"
	"github.com/UpmeshLTD/urus-aio/pdf/server/grpc"
	"github.com/UpmeshLTD/urus-aio/pdf/service"
)

// Server represents the abstraction of the component that hosts transport and service.
//go:generate mockery --name=Server --case=snake
type Server interface {
	StartGRPC() error
}

// serverImpl implements the Server interface.
type serverImpl struct {
	logger     log.Logger
	config     config.Config
	service    service.Service
	grpcServer grpc.Server
}

func NewServer(
	logger log.Logger,
	config config.Config,
	service service.Service,
) Server {
	return &serverImpl{
		logger:     logger,
		config:     config,
		service:    service,
		grpcServer: grpc.NewServer(service, config),
	}
}

func (s *serverImpl) StartGRPC() error {
	return s.grpcServer.Serve()
}
