package publicconnectionsetting

import (
	"context"

	"github.com/tidbcloud/pkgv2/db"
	"go.opentelemetry.io/otel"

	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/adapter/eventbus"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/adapter/regionalserver"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/entity"
	"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/region"
	"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/nextgen-global-service/pkg/config"
	"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.publicconnectionsetting")

type Service interface {
	Get(
		ctx context.Context,
		req *globalngv1.GetPublicConnectionSettingRequest,
	) (*entity.PublicConnectionSetting, bizerr.BizError)
	Update(
		ctx context.Context,
		req *globalngv1.UpdatePublicConnectionSettingRequest,
	) (*entity.PublicConnectionSetting, bizerr.BizError)
}

func NewService(
	cfg *config.Config,
	flow workflow.Workflow,
	idGeneratorAdapter idgenerator.IDGenerator,
	transaction db.Transactioner,
	eventCommitter eventbus.WALCommitter,
	clusterRepo cluster.Repo,
	tidbGroupRepo tidbgroup.Repo,
	publicConnectionSettingRepo publicconnectionsetting.Repo,
	regionRepo region.Repo,
	resourcePoolRepo resourcepool.Repo,
	regionalCli regionalserver.Client,
) (Service, error) {
	return &serviceImpl{
		cfg:                         cfg,
		workflow:                    flow,
		idGeneratorAdapter:          idGeneratorAdapter,
		transaction:                 transaction,
		eventCommitter:              eventCommitter,
		clusterRepo:                 clusterRepo,
		tidbGroupRepo:               tidbGroupRepo,
		publicConnectionSettingRepo: publicConnectionSettingRepo,
		regionRepo:                  regionRepo,
		resourcePoolRepo:            resourcePoolRepo,
		regionalCli:                 regionalCli,
	}, nil
}

type serviceImpl struct {
	cfg                         *config.Config
	workflow                    workflow.Workflow
	idGeneratorAdapter          idgenerator.IDGenerator
	transaction                 db.Transactioner
	eventCommitter              eventbus.WALCommitter
	clusterRepo                 cluster.Repo
	tidbGroupRepo               tidbgroup.Repo
	publicConnectionSettingRepo publicconnectionsetting.Repo
	regionRepo                  region.Repo
	resourcePoolRepo            resourcepool.Repo
	regionalCli                 regionalserver.Client
}
