package server

import (
	"errors"
	"github.com/UpmeshLTD/urus-aio/paid-order/server/http"

	"github.com/UpmeshLTD/urus-aio/paid-order/config"
	log2 "github.com/UpmeshLTD/urus-aio/paid-order/log"
	"github.com/UpmeshLTD/urus-aio/paid-order/server/grpc"
	"github.com/UpmeshLTD/urus-aio/paid-order/service"
)

var (
	StopError = errors.New("stop")
)

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

// serverImpl implements the Server interface.
type serverImpl struct {
	logger         log2.Logger
	configProvider config.Config
	service        service.Service

	grpcServer grpc.Server
	httpServer http.Server
}

func NewServer(
	logger log2.Logger,
	configProvider config.Config,
	paidOrderService service.Service,
) Server {
	return &serverImpl{
		grpcServer:     grpc.NewServer(paidOrderService, configProvider),
		httpServer: http.NewServer(paidOrderService, configProvider),
		logger:         logger,
		configProvider: configProvider,
		service:        paidOrderService,
	}
}

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

func (s *serverImpl) StartHTTP() error {
	return s.httpServer.Serve()
}
