package repo

import (
	"context"

	"github.com/tidbcloud/dataflow-service/app/repo/entity"
	"github.com/tidbcloud/pkgv2/bizerr"
)

type (
	TiCDCClusterFilterOp func(
		qs entity.TiCDCClusterQuerySet) entity.TiCDCClusterQuerySet
	TiCDCBizChangefeedResourceFilterOp func(
		qs entity.TiCDCBizChangefeedResourceQuerySet) entity.TiCDCBizChangefeedResourceQuerySet
	TiCDCChangefeedFilterOp func(
		qs entity.TiCDCChangefeedQuerySet) entity.TiCDCChangefeedQuerySet
	KernelChangefeedTrafficRecordFilterOp func(
		qs entity.KernelChangefeedTrafficRecordQuerySet) entity.KernelChangefeedTrafficRecordQuerySet
)

type TiCDCClusterRepo interface {
	Load(ctx context.Context, id uint64) (*entity.TiCDCCluster, bizerr.BizError)
	Save(ctx context.Context, record *entity.TiCDCCluster) bizerr.BizError
	List(ctx context.Context, ops ...TiCDCClusterFilterOp) ([]entity.TiCDCCluster, bizerr.BizError)
	Get(ctx context.Context, ops ...TiCDCClusterFilterOp) (*entity.TiCDCCluster, bizerr.BizError)
}

type TiCDCBizChangefeedResourceRepo interface {
	Load(ctx context.Context, id uint64) (*entity.TiCDCBizChangefeedResource, bizerr.BizError)
	Save(ctx context.Context, record *entity.TiCDCBizChangefeedResource) bizerr.BizError
	List(
		ctx context.Context, ops ...TiCDCBizChangefeedResourceFilterOp,
	) ([]entity.TiCDCBizChangefeedResource, bizerr.BizError)
	Get(
		ctx context.Context, ops ...TiCDCBizChangefeedResourceFilterOp,
	) (*entity.TiCDCBizChangefeedResource, bizerr.BizError)
}

type TiCDCChangefeedRepo interface {
	Load(ctx context.Context, id uint64) (*entity.TiCDCChangefeed, bizerr.BizError)
	Save(ctx context.Context, record *entity.TiCDCChangefeed) bizerr.BizError
	List(ctx context.Context, ops ...TiCDCChangefeedFilterOp) ([]entity.TiCDCChangefeed, bizerr.BizError)
	Get(ctx context.Context, ops ...TiCDCChangefeedFilterOp) (*entity.TiCDCChangefeed, bizerr.BizError)
	Count(ctx context.Context, ops ...TiCDCChangefeedFilterOp) (int64, bizerr.BizError)
}

type KernelChangefeedTrafficRecordRepo interface {
	Load(ctx context.Context, id uint64) (*entity.KernelChangefeedTrafficRecord, bizerr.BizError)
	Save(ctx context.Context, record *entity.KernelChangefeedTrafficRecord) bizerr.BizError
	List(ctx context.Context, ops ...KernelChangefeedTrafficRecordFilterOp) (
		[]entity.KernelChangefeedTrafficRecord, bizerr.BizError)
	Get(ctx context.Context, ops ...KernelChangefeedTrafficRecordFilterOp) (
		*entity.KernelChangefeedTrafficRecord, bizerr.BizError)
}

type TiCDCCustomStorageRepo interface {
	LoadByTiCDCClusterID(ctx context.Context, id uint64) (*entity.TiCDCCustomStorage, bizerr.BizError)
	Save(ctx context.Context, record *entity.TiCDCCustomStorage) bizerr.BizError
}
