package regionalapi

import (
	"context"

	ticdc_v1 "github.com/tidbcloud/cluster-service-ng/api/tidbcloud/ticdc-service/v1"
	"github.com/tidbcloud/pkgv2/bizerr"
)

type TiCDCClusterClient interface {
	CreateTiCDCCluster(
		ctx context.Context, region *Region, req *ticdc_v1.CreateTiCDCClusterRequest,
	) (*ticdc_v1.TiCDCCluster, bizerr.BizError)
	ListTiCDCClusters(
		ctx context.Context, region *Region, req *ticdc_v1.ListTiCDCClustersRequest,
	) (*ticdc_v1.ListTiCDCClustersResponse, bizerr.BizError)
	GetTiCDCCluster(
		ctx context.Context, region *Region, req *ticdc_v1.GetTiCDCClusterRequest,
	) (*ticdc_v1.TiCDCCluster, bizerr.BizError)
	ScaleTiCDCCluster(ctx context.Context, region *Region, req *ticdc_v1.ScaleTiCDCClusterRequest) bizerr.BizError
	UpdateTiCDCClusterConfig(
		ctx context.Context, region *Region, req *ticdc_v1.UpdateTiCDCClusterConfigRequest,
	) bizerr.BizError
	UpdateTiCDCClusterStorage(
		ctx context.Context, region *Region, req *ticdc_v1.UpdateTiCDCClusterStorageRequest,
	) bizerr.BizError
	DeleteTiCDCCluster(ctx context.Context, region *Region, req *ticdc_v1.DeleteTiCDCClusterRequest) bizerr.BizError
	RestartTiCDCCluster(ctx context.Context, region *Region, req *ticdc_v1.RestartTiCDCClusterRequest) bizerr.BizError
	GetTiCDCClusterRole(
		ctx context.Context, region *Region, req *ticdc_v1.GetTiCDCClusterRoleRequest,
	) (*ticdc_v1.TiCDCClusterRole, bizerr.BizError)
}

type TiCDCPreCheckClient interface {
	TestNetworkConnection(
		ctx context.Context, region *Region, req *ticdc_v1.TestNetworkConnectionRequest,
	) bizerr.BizError
	ValidateChangefeedParameters(
		ctx context.Context, region *Region, req *ticdc_v1.ValidateChangefeedParametersRequest,
	) bizerr.BizError
	VerifyTable(
		ctx context.Context, region *Region, req *ticdc_v1.VerifyTableRequest,
	) (*ticdc_v1.VerifyTableResponse, bizerr.BizError)
}

type ChangefeedClient interface {
	CreateChangefeed(
		ctx context.Context, region *Region, req *ticdc_v1.CreateChangefeedRequest,
	) (*ticdc_v1.Changefeed, bizerr.BizError)
	ListChangefeeds(
		ctx context.Context, region *Region, req *ticdc_v1.ListChangefeedsRequest,
	) (*ticdc_v1.ListChangefeedsResponse, bizerr.BizError)
	GetChangefeed(
		ctx context.Context, region *Region, req *ticdc_v1.GetChangefeedRequest,
	) (*ticdc_v1.Changefeed, bizerr.BizError)
	PauseChangefeed(ctx context.Context, region *Region, req *ticdc_v1.PauseChangefeedRequest) bizerr.BizError
	ResumeChangefeed(ctx context.Context, region *Region, req *ticdc_v1.ResumeChangefeedRequest) bizerr.BizError
	UpdateChangefeed(ctx context.Context, region *Region, req *ticdc_v1.UpdateChangefeedRequest) bizerr.BizError
	DeleteChangefeed(ctx context.Context, region *Region, req *ticdc_v1.DeleteChangefeedRequest) bizerr.BizError
}

type TiCDCPrivateLinkClient interface {
	CreateTiCDCPrivateLink(
		ctx context.Context, region *Region, req *ticdc_v1.CreateTiCDCSinkEndpointRequest,
	) (*ticdc_v1.TiCDCSinkEndpoint, bizerr.BizError)
	ListTiCDCPrivateLinks(
		ctx context.Context, region *Region, req *ticdc_v1.ListTiCDCSinkEndpointsRequest,
	) (*ticdc_v1.ListTiCDCSinkEndpointsResponse, bizerr.BizError)
	GetTiCDCPrivateLink(
		ctx context.Context, region *Region, req *ticdc_v1.GetTiCDCSinkEndpointRequest,
	) (*ticdc_v1.TiCDCSinkEndpoint, bizerr.BizError)
	DeleteTiCDCPrivateLink(
		ctx context.Context, region *Region, req *ticdc_v1.DeleteTiCDCSinkEndpointRequest,
	) bizerr.BizError
	GetPrivateLinkAuthInfo(ctx context.Context, region *Region,
		req *ticdc_v1.GetSinkEndpointAuthInfoRequest) (*ticdc_v1.GetSinkEndpointAuthInfoResp, bizerr.BizError)
	GetAvailableZones(ctx context.Context, region *Region,
		req *ticdc_v1.GetAvailableZonesRequest) (*ticdc_v1.GetAvailableZonesResponse, bizerr.BizError)
	DescribeEndpointServiceAvailabilityZones(ctx context.Context, region *Region,
		req *ticdc_v1.DescribeEndpointServiceAvailabilityZonesRequest,
	) (*ticdc_v1.DescribeEndpointServiceAvailabilityZonesResponse, bizerr.BizError)
	ValidateEndpointAvailabilityZones(
		ctx context.Context, region *Region, req *ticdc_v1.ValidateEndpointAvailabilityZonesRequest,
	) bizerr.BizError
}
