package _import

import (
	"context"

	"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"
	regionalserverlessv1 "github.com/tidbcloud/tidb-management-service/api/spec/regional/serverless/v1"
	"github.com/tidbcloud/tidb-management-service/serverless-global-service/domain/adapter"
)

var Tracer = otel.Tracer("DomainService.Import")

type Service interface {
	CheckImportPermission(
		ctx context.Context,
		req *globalserverlessv1.CheckImportPermissionRequest,
		region *globalcommonv1.Region,
	) (*globalserverlessv1.CheckImportPermissionResponse, error)
	Precheck(
		ctx context.Context,
		req *globalserverlessv1.PrecheckRequest,
		region *globalcommonv1.Region,
	) (*globalserverlessv1.PrecheckResponse, error)
}

type importServiceImpl struct {
	regionalSvc adapter.RegionalService
}

func NewImportService(regionalSvc adapter.RegionalService) Service {
	return &importServiceImpl{
		regionalSvc: regionalSvc,
	}
}

func (s *importServiceImpl) CheckImportPermission(
	ctx context.Context,
	req *globalserverlessv1.CheckImportPermissionRequest,
	region *globalcommonv1.Region,
) (*globalserverlessv1.CheckImportPermissionResponse, error) {
	ctx, span := Tracer.Start(ctx, "Domain.CheckImportPermission")
	defer span.End()

	_, err := s.regionalSvc.CheckImportPermission(ctx, region,
		&regionalserverlessv1.CheckImportPermissionRequest{
			CloudStorage: req.CloudStorage,
		})
	if err != nil {
		return nil, err
	}
	return &globalserverlessv1.CheckImportPermissionResponse{}, nil
}

func (s *importServiceImpl) Precheck(
	ctx context.Context,
	req *globalserverlessv1.PrecheckRequest,
	region *globalcommonv1.Region,
) (*globalserverlessv1.PrecheckResponse, error) {
	ctx, span := Tracer.Start(ctx, "Domain.Precheck")
	defer span.End()

	res, err := s.regionalSvc.Precheck(ctx, region,
		&regionalserverlessv1.PrecheckRequest{
			CloudStorage:         req.CloudStorage,
			DbCredential:         req.DbCredential,
			FileRouteRules:       req.FileRouteRules,
			UseCustomFileMapping: req.UseCustomFileMapping,
		})
	if err != nil {
		return nil, err
	}
	return &globalserverlessv1.PrecheckResponse{
		TableResults: res.TableResults,
		Status:       res.Status,
	}, nil
}
