package regionalapi

import (
	"context"

	replay_v1 "github.com/tidbcloud/infra-provider/api/tidbcloud/cluster-server/v1"
	ticdc_v1 "github.com/tidbcloud/infra-provider/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)
	CompensateComputeCloudResourceTags(
		ctx context.Context, region *Region, req *ticdc_v1.CompensateComputeCloudResourceTagsRequest,
	) 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)
	ValidateEndpointAvailabilityZones(
		ctx context.Context, region *Region, req *ticdc_v1.ValidateEndpointAvailabilityZonesRequest,
	) bizerr.BizError
}

// CRRFFacade is the client interface for the CRRF daemon API on cluster-server.
// These methods integrate with the EnableCRRF / DisableCRRF / GetCRRF endpoints
// introduced in https://github.com/tidbcloud/infra-provider/pull/5201.
type CRRFFacade interface {
	// EnableCRRF deploys a CRRF daemon for the given log backup.
	EnableCRRF(ctx context.Context, region *Region, req *EnableCRRFRequest) (*CRRFInfo, bizerr.BizError)
	// DisableCRRF tears down the CRRF daemon for the given log backup.
	DisableCRRF(ctx context.Context, region *Region, req *DisableCRRFRequest) (*CRRFInfo, bizerr.BizError)
	// GetCRRF returns the current state of the CRRF daemon for the given log backup.
	GetCRRF(ctx context.Context, region *Region, req *GetCRRFRequest) (*CRRFInfo, bizerr.BizError)
}

type ReplayClient interface {
	CreateReplay(
		ctx context.Context, region *Region, req *replay_v1.CreateReplayRequest,
	) (*replay_v1.Replay, bizerr.BizError)
	GetReplay(
		ctx context.Context, region *Region, req *replay_v1.GetReplayRequest,
	) (*replay_v1.GetReplayResponse, bizerr.BizError)
	UpdateReplay(
		ctx context.Context, region *Region, req *replay_v1.UpdateReplayRequest,
	) (*replay_v1.Replay, bizerr.BizError)
	DeleteReplay(
		ctx context.Context, region *Region, req *replay_v1.DeleteReplayRequest,
	) (*replay_v1.Replay, bizerr.BizError)
	StartReplay(
		ctx context.Context, region *Region, req *replay_v1.StartReplayRequest,
	) (*replay_v1.Replay, bizerr.BizError)
	StopReplay(
		ctx context.Context, region *Region, req *replay_v1.StopReplayRequest,
	) (*replay_v1.Replay, bizerr.BizError)
}
