package sink_endpoint

import (
	"context"

	"github.com/tidbcloud/dataflow-service-ng/app/models/domain"
	"github.com/tidbcloud/pkgv2/bizerr"
)

type SinkEndpointModel interface {
	CreateSinkEndpoint(
		ctx context.Context, req *domain.CreateSinkEndpointReq,
	) (*domain.CreateSinkEndpointResp, bizerr.BizError)
	ListSinkEndpoint(
		ctx context.Context, req *domain.ListSinkEndpointsReq,
	) (*domain.ListSinkEndpointsResp, bizerr.BizError)
	QuerySinkEndpoint(
		ctx context.Context, req *domain.QuerySinkEndpointReq,
	) (*domain.QuerySinkEndpointResp, bizerr.BizError)
	DeleteSinkEndpoint(ctx context.Context, req *domain.DeleteSinkEndpointReq) bizerr.BizError
	GetAvailabilityZones(
		ctx context.Context, req *domain.GetAvailabilityZonesReq,
	) (*domain.GetAvailabilityZonesResp, bizerr.BizError)
	GenerateSinkAdvertisedListener(
		ctx context.Context, req *domain.GenerateSinkAdvertisedListenerReq,
	) (*domain.GenerateSinkAdvertisedListenerResp, bizerr.BizError)
	ValidateSinkAdvertisedListenerDomain(
		ctx context.Context, req *domain.ValidateSinkAdvertisedListenerDomainReq,
	) (*domain.ValidateSinkAdvertisedListenerDomainResp, bizerr.BizError)
	CreateSinkEndpointUsage(
		ctx context.Context, req *domain.CreateSinkEndpointUsageReq,
	) (*domain.CreateSinkEndpointUsageResp, bizerr.BizError)
	DeleteSinkEndpointUsage(ctx context.Context, req *domain.DeleteSinkEndpointUsageReq) bizerr.BizError
	GetSinkEndpointAuthInfo(ctx context.Context,
		req *domain.GetSinkEndpointAuthInfoReq) (*domain.GetSinkEndpointAuthInfoResp, bizerr.BizError)
}

type EndpointServiceAvailabilityZoneModel interface {
	DescribeEndpointServiceAvailabilityZones(
		ctx context.Context, req *domain.DescribeEndpointServiceAvailabilityZonesReq,
	) (*domain.DescribeEndpointServiceAvailabilityZonesResp, bizerr.BizError)
}

type SinkEndpointWorker interface {
	SyncAllEndpoints(ctx context.Context) error
	MeterChangefeeds(ctx context.Context) bizerr.BizError
	BillChangefeeds(ctx context.Context) bizerr.BizError
}
