package region

import (
	"context"

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

	globalcommonv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/common/v1"
	globalserverlessv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/serverless/v1"
	"github.com/tidbcloud/tidb-management-service/serverless-global-service/domain/adapter"
	"github.com/tidbcloud/tidb-management-service/serverless-global-service/domain/repository"
)

var tracer = otel.Tracer("DomainService.Region")

type Service interface {
	// region service
	RegisterRegion(
		ctx context.Context,
		req *globalserverlessv1.RegionServiceRegisterRequest,
	) (*globalcommonv1.Region, error)
	UpdateRegion(
		ctx context.Context,
		req *globalserverlessv1.RegionServiceUpdateRequest,
	) (*globalcommonv1.Region, error)
	ListRegions(
		ctx context.Context,
		req *globalserverlessv1.RegionServiceListRequest,
	) (*globalserverlessv1.RegionServiceListResponse, error)
	GetRegion(ctx context.Context, req *globalserverlessv1.RegionServiceGetRequest) (*globalcommonv1.Region, error)
	DeleteRegion(ctx context.Context, req *globalserverlessv1.RegionServiceDeleteRequest) error

	// cloud provider service
	RegisterCloudProvider(
		ctx context.Context,
		req *globalserverlessv1.CloudProviderServiceRegisterRequest,
	) (*globalcommonv1.CloudProvider, error)
	ListCloudProviders(
		ctx context.Context,
		req *globalserverlessv1.CloudProviderServiceListRequest,
	) (*globalserverlessv1.CloudProviderServiceListResponse, error)
}

type regionServiceImpl struct {
	regionRepo   repository.RegionRepo
	providerRepo repository.CloudProviderRepo
	clusterRepo  repository.ClusterRepo
	regionalSvc  adapter.RegionalService
	transaction  db.Transactioner
}

func NewRegionServiceImpl(
	regionRepo repository.RegionRepo,
	providerRepo repository.CloudProviderRepo,
	clusterRepo repository.ClusterRepo,
	regionalSvc adapter.RegionalService,
	transaction db.Transactioner,
) Service {
	return &regionServiceImpl{
		regionRepo:   regionRepo,
		providerRepo: providerRepo,
		clusterRepo:  clusterRepo,
		regionalSvc:  regionalSvc,
		transaction:  transaction,
	}
}
