package export

import (
	"context"

	"github.com/tidbcloud/pkgv2/db"

	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/repository/cluster"
	exportrepo "github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/repository/export"
	"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/utilities/bizerr"
	"github.com/tidbcloud/tidb-management-service/utilities/idgenerator"
	wf "github.com/tidbcloud/tidb-management-service/utilities/workflow"
)

type Service interface {
	ListExports(ctx context.Context, req *globalngv1.ListExportsRequest) (*globalngv1.ListExportsResponse, bizerr.BizError)
	GetExport(ctx context.Context, req *globalngv1.GetExportRequest) (*globalngv1.Export, bizerr.BizError)
	CreateExport(ctx context.Context, req *globalngv1.CreateExportRequest) (*globalngv1.Export, bizerr.BizError)
	DeleteExport(ctx context.Context, req *globalngv1.DeleteExportRequest) (*globalngv1.Export, bizerr.BizError)
	CancelExport(ctx context.Context, req *globalngv1.CancelExportRequest) (*globalngv1.Export, bizerr.BizError)
}

type serviceImpl struct {
	exportRepo         exportrepo.ExportRepo
	clusterRepo        cluster.Repo
	regionRepo         region.Repo
	regionalCli        regionalserver.Client
	workflow           wf.Workflow
	idGeneratorAdapter idgenerator.IDGenerator
	transaction        db.Transactioner
	eventCommitter     eventbus.WALCommitter
	resourcePoolRepo   resourcepool.Repo
}

// NewService returns an export Service implementation.
func NewService(
	exportRepo exportrepo.ExportRepo,
	clusterRepo cluster.Repo,
	regionRepo region.Repo,
	regionalCli regionalserver.Client,
	workflow wf.Workflow,
	idGeneratorAdapter idgenerator.IDGenerator,
	transaction db.Transactioner,
	eventCommitter eventbus.WALCommitter,
	resourcePoolRepo resourcepool.Repo,
) Service {
	return &serviceImpl{
		exportRepo:         exportRepo,
		clusterRepo:        clusterRepo,
		regionRepo:         regionRepo,
		regionalCli:        regionalCli,
		workflow:           workflow,
		idGeneratorAdapter: idGeneratorAdapter,
		transaction:        transaction,
		eventCommitter:     eventCommitter,
		resourcePoolRepo:   resourcePoolRepo,
	}
}
