package server

import (
	"github.com/UpmeshLTD/urus-aio/cronjob/config"
	logger "github.com/UpmeshLTD/urus-aio/cronjob/log"
	"github.com/UpmeshLTD/urus-aio/cronjob/server/cron"
	"github.com/UpmeshLTD/urus-aio/cronjob/service"
)

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

// serverImpl implements the Server interface.
type serverImpl struct {
	config     config.Config
	logger     logger.Logger
	service    service.Service
	cronServer cron.Server
}

func NewServer(
	config config.Config,
	logger logger.Logger,
	service service.Service,
) Server {
	return &serverImpl{
		config:     config,
		logger:     logger,
		service:    service,
		cronServer: cron.NewServer(config, logger, service),
	}
}

func (s *serverImpl) StartCron() error {
	return s.cronServer.Serve()
}
