package backup

import (
	"context"

	"go.opentelemetry.io/otel"
	"google.golang.org/protobuf/types/known/emptypb"

	openapingv1beta2 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_cloud_open_api/nextgen/v1beta2"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/adapter/account"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/adapter/eventbus"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/adapter/nextgenglobal"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/service/nextgen/cluster"
)

var tracer = otel.Tracer("App.NextGen.Backup")

// support br api in org level
// keep logic thin in tidb-mgmt-service, and use nextgen-cli to handle the logic
type Server interface {
	ListBackups(
		ctx context.Context,
		req *openapingv1beta2.ListBackupsRequest,
	) (*openapingv1beta2.ListBackupsResponse, error)
	DeleteBackup(
		ctx context.Context,
		req *openapingv1beta2.DeleteBackupRequest,
	) (*emptypb.Empty, error)
	ListDeletedTidbs(
		ctx context.Context,
		req *openapingv1beta2.ListDeletedTidbsRequest,
	) (*openapingv1beta2.ListDeletedTidbsResponse, error)
}

func NewServer(
	nextGenCli nextgenglobal.NextGenGlobal,
	clusterSvc cluster.Service,
	accountCli account.Client,
	auditLogSender eventbus.ConsoleAuditLogSender,
) Server {
	return &serverImpl{
		nextGenCli:     nextGenCli,
		clusterSvc:     clusterSvc,
		accountCli:     accountCli,
		auditLogSender: auditLogSender,
	}
}

type serverImpl struct {
	nextGenCli     nextgenglobal.NextGenGlobal
	clusterSvc     cluster.Service
	accountCli     account.Client
	auditLogSender eventbus.ConsoleAuditLogSender
}
