package _import

import (
	"context"

	"go.opentelemetry.io/otel"

	globalserverlessv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/serverless/v1"
	"github.com/tidbcloud/tidb-management-service/serverless-global-service/domain/repository"
	importdomain "github.com/tidbcloud/tidb-management-service/serverless-global-service/domain/service/import"
	"github.com/tidbcloud/tidb-management-service/serverless-global-service/domain/service/region"
)

var Tracer = otel.Tracer("app.import")

type service struct {
	globalserverlessv1.UnimplementedServerlessImportServiceServer

	importService importdomain.Service
	regionSvc     region.Service
	clusterRepo   repository.ClusterRepo
}

func NewService(
	importService importdomain.Service,
	regionSvc region.Service,
	clusterRepo repository.ClusterRepo,
) globalserverlessv1.ServerlessImportServiceServer {
	return &service{
		importService: importService,
		regionSvc:     regionSvc,
		clusterRepo:   clusterRepo,
	}
}

func (s *service) Precheck(
	ctx context.Context,
	req *globalserverlessv1.PrecheckRequest,
) (*globalserverlessv1.PrecheckResponse, error) {
	ctx, span := Tracer.Start(ctx, "Precheck")
	defer span.End()
	cluster, err := s.clusterRepo.Get(ctx, req.GetClusterId(), false)
	if err != nil {
		return nil, err
	}
	res, err := s.importService.Precheck(ctx, req, cluster.Region)
	if err != nil {
		return nil, err
	}
	return res, nil
}

func (s *service) CheckImportPermission(
	ctx context.Context,
	req *globalserverlessv1.CheckImportPermissionRequest,
) (*globalserverlessv1.CheckImportPermissionResponse, error) {
	ctx, span := Tracer.Start(ctx, "CheckImportPermission")
	defer span.End()
	cluster, err := s.clusterRepo.Get(ctx, req.GetClusterId(), false)
	if err != nil {
		return nil, err
	}
	res, err := s.importService.CheckImportPermission(ctx, req, cluster.Region)
	if err != nil {
		return nil, err
	}
	return res, nil
}
