package repository

import (
	"context"

	tidbmgmtservicev1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_mgmt_service/v1"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/entity"
)

type CustomStatusRepository interface {
	LockClustersForUpdate(ctx context.Context, clusterIds []uint64) error
	NewClusterCustomStatus(ctx context.Context, status *entity.ClusterCustomStatus) (uint64, error)
	GetClusterCustomStatusById(ctx context.Context, clusterId, statusId uint64) (*entity.ClusterCustomStatus, error)
	GetClusterCustomStatusByName(
		ctx context.Context,
		clusterId uint64,
		statusName string,
		statusType tidbmgmtservicev1.CustomStatusType,
	) (*entity.ClusterCustomStatus, error)
	GetRestoreStatusByName(ctx context.Context, statusName string) (*entity.ClusterCustomStatus, error)
	IsMutexClusterAction(
		ctx context.Context,
		clusterId uint64,
		clusterAction tidbmgmtservicev1.ClusterAction,
	) (bool, *entity.ClusterCustomStatus, error)
	IsMutexCustomStatus(
		ctx context.Context,
		status *entity.ClusterCustomStatus,
	) (bool, *entity.ClusterCustomStatus, error)
	ClearClusterCustomStatusByClusterId(ctx context.Context, clusterId uint64) error
	ClearExpiredClusterCustomStatus(ctx context.Context) error
	DeleteClusterCustomStatus(ctx context.Context, statusId uint64) error
	DeleteClusterCustomStatusByCluster(ctx context.Context, clusterId uint64) error
	ListClusterCustomStatus(
		ctx context.Context,
		clusterIds []uint64,
		statusTypes []tidbmgmtservicev1.CustomStatusType,
		queryDeleted bool,
	) (map[uint64][]*entity.ClusterCustomStatus, error)
}
