package tidbgroup

import (
	"context"

	"github.com/tidbcloud/pkgv2/db"
	"go.opentelemetry.io/otel"
	"google.golang.org/protobuf/types/known/emptypb"

	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/repository/cluster"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/repository/publicconnectionsetting"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/repository/resourcepool"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/repository/tidbgroup"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
	"github.com/tidbcloud/tidb-management-service/utilities/idgenerator"
	"github.com/tidbcloud/tidb-management-service/utilities/workflow"
)

var tracer = otel.Tracer("domain.tidbgroup")

type Service interface {
	CreateTiDBGroup(ctx context.Context, req *globalngv1.CreateTiDBGroupRequest) (*globalngv1.TiDBGroup, bizerr.BizError)
	DeleteTiDBGroup(ctx context.Context, req *globalngv1.DeleteTiDBGroupRequest) (*emptypb.Empty, bizerr.BizError)
}

type serviceImpl struct {
	transaction                 db.Transactioner
	workflow                    workflow.Workflow
	tidbgroupRepo               tidbgroup.Repo
	publicConnectionSettingRepo publicconnectionsetting.Repo
	clusterRepo                 cluster.Repo
	idGeneratorAdapter          idgenerator.IDGenerator
	resourcePoolRepo            resourcepool.Repo
}

func NewService(
	transaction db.Transactioner,
	flow workflow.Workflow,
	tidbgroupRepo tidbgroup.Repo,
	publicConnectionSettingRepo publicconnectionsetting.Repo,
	clusterRepo cluster.Repo,
	idGeneratorAdapter idgenerator.IDGenerator,
	resourcePoolRepo resourcepool.Repo,
) Service {
	return &serviceImpl{
		transaction:                 transaction,
		workflow:                    flow,
		tidbgroupRepo:               tidbgroupRepo,
		publicConnectionSettingRepo: publicConnectionSettingRepo,
		clusterRepo:                 clusterRepo,
		idGeneratorAdapter:          idGeneratorAdapter,
		resourcePoolRepo:            resourcePoolRepo,
	}
}
