package configbackup

import (
	"context"
	"time"

	"github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/entity"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

type PolicyQueryFilter struct {
	ClusterIDs        []uint64
	Enabled           *bool
	HasError          *bool
	LastBackupAtFrom  *time.Time
	LastBackupAtTo    *time.Time
	LastSuccessAtFrom *time.Time
	LastSuccessAtTo   *time.Time
}

type PolicyQuerySorter struct {
	OrderBy string
	Desc    bool
}

type PolicyQueryOption struct {
	Filter   *PolicyQueryFilter
	Page     int64
	PageSize int64
	Sorters  []PolicyQuerySorter
}

type DisableOption struct {
	DeleteBackupPending bool
	DeletePolicyPending bool
}

type PolicyRepo interface {
	GetByClusterID(ctx context.Context, clusterID uint64) (*entity.ClusterConfigBackupPolicy, bizerr.BizError)
	Query(ctx context.Context, option *PolicyQueryOption) ([]*entity.ClusterConfigBackupPolicy, uint32, bizerr.BizError)
	Upsert(ctx context.Context, policy *entity.ClusterConfigBackupPolicy) bizerr.BizError
	Enable(ctx context.Context, clusterID uint64, intervalSec int32, now time.Time) bizerr.BizError
	Disable(ctx context.Context, clusterID uint64, option *DisableOption) bizerr.BizError
	ClearDeleteBackupPending(ctx context.Context, clusterID uint64) bizerr.BizError
	ListPendingCleanup(ctx context.Context, limit int) ([]*entity.ClusterConfigBackupPolicy, bizerr.BizError)
	DeleteByClusterID(ctx context.Context, clusterID uint64) bizerr.BizError
	ClaimDue(ctx context.Context, now time.Time, limit int) ([]*entity.ClusterConfigBackupPolicy, bizerr.BizError)
	RecordSuccess(ctx context.Context, clusterID uint64, at time.Time) bizerr.BizError
	RecordFailure(ctx context.Context, clusterID uint64, at time.Time, errMsg string) bizerr.BizError
}
