package repo

import (
	"context"

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

type BucketRepo interface {
	Load(ctx context.Context, id uint64) (*entity.Bucket, bizerr.BizError)
	Save(ctx context.Context, bucket *entity.Bucket) bizerr.BizError
	ListByFilter(ctx context.Context, filter BucketFilter) ([]*entity.Bucket, bizerr.BizError)
	DeleteByFilter(ctx context.Context, filter BucketFilter) (int64, bizerr.BizError)
}

type BucketFilter struct {
	ID *uint64

	Name           *string
	TenantID       *string
	ProjectID      *string
	ClusterID      *string
	Region         *string
	RegionPrefix   *string
	Provider       *string
	CloudAccountID *string
	Scope          *entity.BucketScope
	Extension      *string
	DeletedTime    *int64

	Statuses      []entity.BucketStatus
	StatusesNotIn []entity.BucketStatus
}

type AWSBucketConfigurationRepo interface {
	Lock(ctx context.Context, id uint64) bizerr.BizError
	Load(ctx context.Context, id uint64) (*entity.AWSBucketConfiguration, bizerr.BizError)
	Save(ctx context.Context, configuration *entity.AWSBucketConfiguration) bizerr.BizError
	List(ctx context.Context, ops ...AWSBucketConfigurationRepoOp) ([]entity.AWSBucketConfiguration, bizerr.BizError)

	Get(ctx context.Context, ops ...AWSBucketConfigurationRepoOp) (*entity.AWSBucketConfiguration, bizerr.BizError)
}

type (
	AWSBucketConfigurationRepoOp func(qs entity.AWSBucketConfigurationQuerySet) entity.AWSBucketConfigurationQuerySet
)

type AWSBucketReplicationRepo interface {
	Load(ctx context.Context, id uint64) (*entity.AWSBucketReplication, bizerr.BizError)
	Save(ctx context.Context, replication *entity.AWSBucketReplication) bizerr.BizError
	List(ctx context.Context, ops ...AWSBucketReplicationRepoOp) ([]entity.AWSBucketReplication, bizerr.BizError)

	Get(ctx context.Context, ops ...AWSBucketReplicationRepoOp) (*entity.AWSBucketReplication, bizerr.BizError)
}

type (
	AWSBucketReplicationRepoOp func(qs entity.AWSBucketReplicationQuerySet) entity.AWSBucketReplicationQuerySet
)

type GCPBucketConfigurationFilter struct {
	BucketID *uint64
}

type GCPBucketConfigurationRepo interface {
	Lock(ctx context.Context, id uint64) bizerr.BizError
	Load(ctx context.Context, id uint64) (*entity.GCPBucketConfiguration, bizerr.BizError)
	Save(ctx context.Context, configuration *entity.GCPBucketConfiguration) bizerr.BizError
	List(ctx context.Context, filter *GCPBucketConfigurationFilter) ([]*entity.GCPBucketConfiguration, bizerr.BizError)
	Get(ctx context.Context, filter *GCPBucketConfigurationFilter) (*entity.GCPBucketConfiguration, bizerr.BizError)
}
