package backup

import (
	"context"
	"time"

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

type OrderBy string

const (
	OrderByAsc  OrderBy = "asc"
	OrderByDesc OrderBy = "desc"
)

type ServerlessBackupFilter struct {
	BackupID          *uint64
	Region            *string
	BackupTimeGte     *time.Time
	OrderByBackupTime *OrderBy
}

// ServerlessBackupRepo stores backups of serverless TiDB cluster
// TODO: auto delete unused backups to prevent too much records in this table
type ServerlessBackupRepo interface {
	Load(ctx context.Context, id entity.ID) (*entity.ServerlessBackup, error)
	GetByFilter(ctx context.Context, filter *ServerlessBackupFilter) (*entity.ServerlessBackup, error)
	ListByFilter(ctx context.Context, filter *ServerlessBackupFilter) ([]*entity.ServerlessBackup, error)
	Add(ctx context.Context, backup *entity.ServerlessBackup) error
	BatchAdd(ctx context.Context, backups []*entity.ServerlessBackup) error
	Delete(ctx context.Context, backup *entity.ServerlessBackup) error
}

type ServerlessUserClusterBackupFilter struct {
	ClusterID          *entity.ID
	ProjectID          *entity.ID
	TenantID           *entity.ID
	ServerlessBackupID *entity.ID
	Statuses           []entity.ServerlessUserClusterBackupStatus
	CreatedAtGt        *time.Time
	Offset             *uint64
	Limit              *uint64
	OrderByCreatedAt   *OrderBy
}

// ServerlessUserClusterBackupRepo stores backups of users' serverless clusters
//
//nolint:interfacebloat
type ServerlessUserClusterBackupRepo interface {
	Load(ctx context.Context, id entity.ID) (*entity.ServerlessUserClusterBackup, error)
	GetByFilter(ctx context.Context,
		filter *ServerlessUserClusterBackupFilter) (*entity.ServerlessUserClusterBackup, error)
	ListByFilter(ctx context.Context,
		filter *ServerlessUserClusterBackupFilter) ([]*entity.ServerlessUserClusterBackup, error)
	CountByFilter(ctx context.Context, filter *ServerlessUserClusterBackupFilter) (uint64, error)
	Add(ctx context.Context, backup *entity.ServerlessUserClusterBackup) error
	Save(ctx context.Context, backup *entity.ServerlessUserClusterBackup) error
	BatchSave(ctx context.Context, ids []entity.ID, updateFields map[string]interface{}) error
	Delete(ctx context.Context, backup *entity.ServerlessUserClusterBackup) error
	GetCreateTableSql(ctx context.Context) (string, error)
	ReorgMaxValuePartition(ctx context.Context, additionalPartitions []string) error
	DropPartition(ctx context.Context, partitionName string) error
}
