package repo

import (
	"context"
	"time"

	"github.com/tidbcloud/pkgv2/bizerr"
	"github.com/tidbcloud/serverless-service/internal/domain/entity"
)

type TiCDCChangefeedResourceRepo interface {
	Save(ctx context.Context, resource *entity.TiCDCChangefeedResource) bizerr.BizError
	GetByChangefeedID(
		ctx context.Context,
		clusterID, changefeedID string,
	) (*entity.TiCDCChangefeedResource, bizerr.BizError)
	ListByShard(
		ctx context.Context,
		provider, region, kubernetes, shareScope, shareKey string,
	) ([]*entity.TiCDCChangefeedResource, bizerr.BizError)
	// ListByClusterID returns every resource row of one user cluster in a
	// single query (prefix of the udx_cluster_changefeed unique index).
	ListByClusterID(ctx context.Context, clusterID string) ([]*entity.TiCDCChangefeedResource, bizerr.BizError)
	ListNeedingSync(ctx context.Context) ([]*entity.TiCDCChangefeedResource, bizerr.BizError)
	// DeleteStaleReleasedRows hard-deletes rows whose expected_spec
	// AND actual_spec have been empty for longer than `staleAge`.
	// These are the orphan rows the delete-changefeed flow leaves
	// behind (it clears the spec columns but never deletes the row
	// itself, to keep ListByShard cheap during reconcile). Returns
	// the number of rows deleted.
	DeleteStaleReleasedRows(ctx context.Context, staleAge time.Duration) (int64, bizerr.BizError)
}

type TiCDCClusterRepo interface {
	Save(ctx context.Context, cluster *entity.TiCDCCluster) bizerr.BizError
	GetByShard(
		ctx context.Context,
		provider, region, kubernetes, shareScope, shareKey string,
	) (*entity.TiCDCCluster, bizerr.BizError)
	// List returns ticdc_clusters rows, optionally filtered. An empty
	// filter argument means "don't filter on that column".
	List(
		ctx context.Context,
		provider, region, state string,
	) ([]*entity.TiCDCCluster, bizerr.BizError)
}

type KernelTiCDCChangefeedRepo interface {
	Save(ctx context.Context, changefeed *entity.KernelTiCDCChangefeed) bizerr.BizError
	GetByChangefeedID(
		ctx context.Context,
		clusterID, changefeedID string,
	) (*entity.KernelTiCDCChangefeed, bizerr.BizError)
	// ListByClusterID returns every kernel changefeed row of one user
	// cluster in a single query (prefix of the udx_cluster_changefeed
	// unique index).
	ListByClusterID(ctx context.Context, clusterID string) ([]*entity.KernelTiCDCChangefeed, bizerr.BizError)
}
