package cluster

import (
	"go.opentelemetry.io/otel"

	openapidedicatedv1beta1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_cloud_open_api/dedicated/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/service/customstatus"
	clustersvc "github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/service/dedicated/cluster"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/pkg/config"
)

var tracer = otel.Tracer("App.Dedicated.Cluster")

func NewServer(
	clusterSvc clustersvc.Service,
	customStatusSvc customstatus.Service,
	dedicatedCli dedicatedglobal.DedicatedGlobal,
	auditLogSender eventbus.ConsoleAuditLogSender,
	regionApp openapidedicatedv1beta1.RegionServiceServer,
	accountCli account.Client,
	oneConsoleConfig *config.OneConsoleConfig,
) openapidedicatedv1beta1.ClusterServiceServer {
	return &serverImpl{
		clusterSvc:       clusterSvc,
		customStatusSvc:  customStatusSvc,
		dedicatedCli:     dedicatedCli,
		auditLogSender:   auditLogSender,
		regionApp:        regionApp,
		accountCli:       accountCli,
		oneConsoleConfig: oneConsoleConfig,
	}
}

type serverImpl struct {
	clusterSvc       clustersvc.Service
	customStatusSvc  customstatus.Service
	dedicatedCli     dedicatedglobal.DedicatedGlobal
	auditLogSender   eventbus.ConsoleAuditLogSender
	regionApp        openapidedicatedv1beta1.RegionServiceServer
	accountCli       account.Client
	oneConsoleConfig *config.OneConsoleConfig
}
