package cluster

import (
	"github.com/tidbcloud/pkgv2/db"

	openapidedicatedv1beta1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_cloud_open_api/dedicated/v1beta1"
	openapiserverlessv1beta1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_cloud_open_api/serverless/v1beta1"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/app/bff/orchestrator"
	regionapp "github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/app/openapi/dedicated/region"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/adapter/dedicatedglobal"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/adapter/eventbus"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/repository"
	"github.com/tidbcloud/tidb-management-service/utilities/featuregate"
)

type Server struct {
	dbProvider     db.TransProvider
	orchestrator   *orchestrator.APIOrchestrator
	auditLogSender eventbus.ConsoleAuditLogSender

	openAPIDedicatedClusterServer  openapidedicatedv1beta1.ClusterServiceServer
	openAPIDedicatedRegionServer   regionapp.Server
	openAPIServerlessClusterServer openapiserverlessv1beta1.ClusterServiceServer

	clusterRepo repository.ClusterRepository

	dedicatedCli dedicatedglobal.DedicatedGlobal

	featGateCli featuregate.Service
}

func NewServer(
	dbProvider db.TransProvider,
	apiOrchestrator *orchestrator.APIOrchestrator,
	auditLogSender eventbus.ConsoleAuditLogSender,
	openAPIDedicatedClusterServer openapidedicatedv1beta1.ClusterServiceServer,
	openAPIDedicatedRegionServer regionapp.Server,
	openAPIServerlessClusterServer openapiserverlessv1beta1.ClusterServiceServer,
	clusterRepo repository.ClusterRepository,
	dedicatedCli dedicatedglobal.DedicatedGlobal,
	featGateCli featuregate.Service,
) *Server {
	return &Server{
		dbProvider:                     dbProvider,
		orchestrator:                   apiOrchestrator,
		auditLogSender:                 auditLogSender,
		openAPIDedicatedClusterServer:  openAPIDedicatedClusterServer,
		openAPIDedicatedRegionServer:   openAPIDedicatedRegionServer,
		openAPIServerlessClusterServer: openAPIServerlessClusterServer,
		clusterRepo:                    clusterRepo,
		dedicatedCli:                   dedicatedCli,
		featGateCli:                    featGateCli,
	}
}
