package main

import (
	"github.com/tidbcloud/ecosystem-service/api/v1/connect"
	"github.com/tidbcloud/ecosystem-service/api/v1/git"
	"github.com/tidbcloud/ecosystem-service/api/v1/pingchat"
	"github.com/tidbcloud/ecosystem-service/api/v1/vercel"
	"github.com/tidbcloud/ecosystem-service/config"
	"github.com/tidbcloud/ecosystem-service/internal/service/eventbus"
	"github.com/tidbcloud/ecosystem-service/internal/service/github"
	"github.com/tidbcloud/ecosystem-service/internal/service/grpc/account"
	"github.com/tidbcloud/ecosystem-service/internal/service/grpc/acl"
	"github.com/tidbcloud/ecosystem-service/internal/service/grpc/mgmt"
	"github.com/tidbcloud/ecosystem-service/internal/storage/migrate/record"
	"go.uber.org/zap"
)

type Server struct {
	vercelController   *vercel.VercelController
	autoCleanJob       *vercel.AutoCleanJob
	conf               *config.ConfigWrapper
	recorder           *record.RecorderExecutor
	logger             *zap.Logger
	vercelMetricsJob   *vercel.VercelMetricsJob
	uploadJob          *vercel.DailyUploadJob
	connectController  *connect.ConnectController
	aclSvc             acl.AclSvc
	githubApp          *github.GitHubApp
	gitController      *git.Controller
	gitCronJob         *git.GitCronJob
	accountSvc         account.AccountProviderSvc
	mgmtSvc            mgmt.MgmtSvc
	eventBus           *eventbus.EventbusService
	branchEventSvc     *eventbus.BranchEventService
	clusterEventSvc    *eventbus.ClusterEventService
	pingChatController *pingchat.PingChatController
}

func NewServer(vercelController *vercel.VercelController,
	autoCleanJob *vercel.AutoCleanJob,
	conf *config.ConfigWrapper,
	recorder *record.RecorderExecutor,
	logger *zap.Logger,
	vercelMetricsJob *vercel.VercelMetricsJob,
	uploadJob *vercel.DailyUploadJob,
	connectController *connect.ConnectController,
	aclSvc acl.AclSvc,
	githubApp *github.GitHubApp,
	gitController *git.Controller,
	gitCronJob *git.GitCronJob,
	accountSvc account.AccountProviderSvc,
	mgmtSvc mgmt.MgmtSvc,
	eventBus *eventbus.EventbusService,
	branchEventSvc *eventbus.BranchEventService,
	clusterEventSvc *eventbus.ClusterEventService,
	pinchatController *pingchat.PingChatController,
) *Server {
	return &Server{
		vercelController:   vercelController,
		autoCleanJob:       autoCleanJob,
		conf:               conf,
		recorder:           recorder,
		logger:             logger,
		vercelMetricsJob:   vercelMetricsJob,
		uploadJob:          uploadJob,
		connectController:  connectController,
		aclSvc:             aclSvc,
		githubApp:          githubApp,
		gitController:      gitController,
		gitCronJob:         gitCronJob,
		accountSvc:         accountSvc,
		mgmtSvc:            mgmtSvc,
		eventBus:           eventBus,
		branchEventSvc:     branchEventSvc,
		clusterEventSvc:    clusterEventSvc,
		pingChatController: pinchatController,
	}
}
