package app

import (
	apiv1 "github.com/tidbcloud/cluster-service-ng/api/cluster-service-ng/v1beta"
	"github.com/tidbcloud/cluster-service-ng/config"
	"github.com/tidbcloud/cluster-service-ng/domain/server"
	"github.com/tidbcloud/tiinf/tiinf"
)

func RegisterGrpc(cfg *config.Config, inf tiinf.TiInf, ngServer server.Service) {
	app := newApp(
		ngServer,
		cfg.ServerConfig.CloudProvider,
		cfg.ServerConfig.Region,
	)

	// new api
	apiv1.RegisterSharedPoolServiceServer(inf.GrpcServer(), app)
	apiv1.RegisterNodeInstanceGroupServiceServer(inf.GrpcServer(), app)
	apiv1.RegisterTiDBClusterServiceServer(inf.GrpcServer(), app)
	apiv1.RegisterRuConfigServiceServer(inf.GrpcServer(), app)
	apiv1.RegisterRestoreServiceServer(inf.GrpcServer(), app)
	apiv1.RegisterExportServiceServer(inf.GrpcServer(), app)
	apiv1.RegisterTemplateServiceServer(inf.GrpcServer(), app)
	apiv1.RegisterAutoscalePolicyServiceServer(
		inf.GrpcServer(),
		selectAutoscalePolicyGrpcServer(cfg.ServerConfig.BizConfig.AutoscalePolicy, app),
	)
}

func selectAutoscalePolicyGrpcServer(
	cfg config.AutoscalePolicyConfig,
	active apiv1.AutoscalePolicyServiceServer,
) apiv1.AutoscalePolicyServiceServer {
	if cfg.IsEnforced() {
		return active
	}
	return &autoscalePolicyQuarantineServer{}
}
