package tidbxinstance

import (
	openapidedicatedv1beta1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_cloud_open_api/dedicated/v1beta1"
	openapingv1beta2 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_cloud_open_api/nextgen/v1beta2"
	openapiserverlessv1beta1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_cloud_open_api/serverless/v1beta1"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/adapter/account"
	"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/adapter/nextgenglobal"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/adapter/serverlessglobal"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/repository"
	nextgencluster "github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/service/nextgen/cluster"
	clustersvc "github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/service/serverless/cluster"
	"github.com/tidbcloud/tidb-management-service/utilities/workflow"
)

type TiDBServer struct {
	clusterRepo repository.ClusterRepository

	openAPIDedicatedClusterServer  openapidedicatedv1beta1.ClusterServiceServer
	openAPIServerlessClusterServer openapiserverlessv1beta1.ClusterServiceServer
	openAPINextgenClusterServer    openapingv1beta2.TidbServiceServer
	accountCli                     account.Client

	dedicatedCli         dedicatedglobal.DedicatedGlobal
	nextgenCli           nextgenglobal.NextGenGlobal
	serverlessCli        serverlessglobal.ServerlessGlobal
	serverlessClusterSvc clustersvc.Service
	nextgenClusterSvc    nextgencluster.Service

	projectMigrationTaskRepo repository.ProjectMigrationTaskRepo
	workflow                 workflow.Workflow

	auditLogSender eventbus.ConsoleAuditLogSender
}

func NewTiDBServer(
	clusterRepo repository.ClusterRepository,

	openAPIDedicatedClusterServer openapidedicatedv1beta1.ClusterServiceServer,
	openAPIServerlessClusterServer openapiserverlessv1beta1.ClusterServiceServer,
	openAPINextgenClusterServer openapingv1beta2.TidbServiceServer,
	accountCli account.Client,

	dedicatedCli dedicatedglobal.DedicatedGlobal,
	nextgenCli nextgenglobal.NextGenGlobal,
	serverlessCli serverlessglobal.ServerlessGlobal,
	serverlessClusterSvc clustersvc.Service,
	nextgenClusterSvc nextgencluster.Service,

	projectMigrationTaskRepo repository.ProjectMigrationTaskRepo,
	wflow workflow.Workflow,

	auditLogSender eventbus.ConsoleAuditLogSender,
) *TiDBServer {
	return &TiDBServer{
		clusterRepo:                    clusterRepo,
		openAPIDedicatedClusterServer:  openAPIDedicatedClusterServer,
		openAPIServerlessClusterServer: openAPIServerlessClusterServer,
		openAPINextgenClusterServer:    openAPINextgenClusterServer,
		accountCli:                     accountCli,
		dedicatedCli:                   dedicatedCli,
		nextgenCli:                     nextgenCli,
		serverlessCli:                  serverlessCli,
		serverlessClusterSvc:           serverlessClusterSvc,
		nextgenClusterSvc:              nextgenClusterSvc,
		projectMigrationTaskRepo:       projectMigrationTaskRepo,
		workflow:                       wflow,
		auditLogSender:                 auditLogSender,
	}
}
