package dataflow

import (
	"context"

	"github.com/tidbcloud/dataflow-service/idl/pbgen/proto/dataflow"
)

//go:generate go run go.uber.org/mock/mockgen@latest -source=$GOFILE -package=mock_$GOPACKAGE -destination=./mock_$GOPACKAGE/mock_$GOFILE
type DataFlow interface {
	// CreateFinalBackupIgnoreExist create final backup for cluster, ignore if already exists, return backup id
	CreateFinalBackupIgnoreExist(ctx context.Context, clusterID uint64) (uint64, error)
	// apis for restore dedicated backup to premium cluster
	GetBackup(ctx context.Context, req *dataflow.GetBackupReq) (*dataflow.GetBackupResp, error)

	Restore(ctx context.Context, req *dataflow.BackupInternalRestoreReq) (*dataflow.RestoreResp, error)
	GetRestore(ctx context.Context, req *dataflow.GetRestoreReq) (*dataflow.GetRestoreResp, error)

	// changefeed (connector) APIs
	CreateConnector(ctx context.Context, req *dataflow.ConnectorCreateReq) (*dataflow.ConnectorID, error)
	GetConnector(ctx context.Context, req *dataflow.ConnectorID) (*dataflow.Connector, error)
	ListConnectors(ctx context.Context, req *dataflow.ConnectorListReq) (*dataflow.Connectors, error)
	DeleteConnector(ctx context.Context, req *dataflow.ConnectorID) error
	ListChangefeedInstanceTypes(
		ctx context.Context,
		req *dataflow.ChangefeedInstanceTypeListReq,
	) (*dataflow.ChangefeedInstanceTypes, error)

	// privatelink endpoint (sink endpoint) APIs
	CreateSinkEndpoint(ctx context.Context, req *dataflow.CreateSinkEndpointRequest) (*dataflow.SinkEndpoint, error)
	GetSinkEndpoint(ctx context.Context, req *dataflow.GetSinkEndpointRequest) (*dataflow.SinkEndpoint, error)
	DeleteSinkEndpoint(ctx context.Context, req *dataflow.DeleteSinkEndpointRequest) error
	ListSinkAvailabilityZones(
		ctx context.Context,
		req *dataflow.ListSinkAvailabilityZonesRequest,
	) (*dataflow.ListSinkAvailabilityZonesResponse, error)
}
