package repo

import (
	"context"
	"time"

	"github.com/tidbcloud/cluster-service-ng/domain/entity"
)

// SharedPoolFilter defines the filter options for listing shared pools
type SharedPoolFilter struct {
	// Ids filters by shared pool IDs
	Ids []string
	// DataplaneNames filters by dataplane names
	DataplaneNames []string
	// Deleted includes soft-deleted records
	Deleted bool
}

type SharedPoolRepo interface {
	Save(ctx context.Context, sharedPool *entity.SharedPool) error
	Load(ctx context.Context, id string, deleted bool) (*entity.SharedPool, error)
	LoadDataplaneName(ctx context.Context, id string, deleted bool) (string, error)
	List(ctx context.Context, filter *SharedPoolFilter) ([]*entity.SharedPool, error)
	Delete(ctx context.Context, id string) error
	UpdatePauseResumeState(ctx context.Context, id string, state entity.PauseResumeState, suspendComputeDesired bool) error
}

type PauseResumeOperationRepo interface {
	Create(ctx context.Context, operation *entity.PauseResumeOperation) error
	LoadByID(ctx context.Context, sharedPoolID, operationID string) (*entity.PauseResumeOperation, error)
	LoadLatestBySharedPoolID(ctx context.Context, sharedPoolID string) (*entity.PauseResumeOperation, error)
	UpdateStageIfRunning(ctx context.Context, sharedPoolID, operationID string, stage entity.PauseResumeOperationStage) (bool, error)
	MarkSucceededIfRunning(ctx context.Context, sharedPoolID, operationID, summary string, completedAt time.Time) (bool, error)
	MarkFailedIfRunning(ctx context.Context, sharedPoolID, operationID, summary string, completedAt time.Time) (bool, error)
	CancelIfRunning(ctx context.Context, sharedPoolID, operationID, reason string, completedAt time.Time) (bool, error)
}

type DataplaneRepo interface {
	LoadByName(ctx context.Context, name string) (*entity.DataPlaneProvider, error)
}

type SharedPoolObjectStoreRepo interface {
	Load(ctx context.Context, sharedPoolId, storeType string, deleted bool) (*entity.SharedPoolObjectStore, error)
	Delete(ctx context.Context, sharedPoolId, storeType string) error
	ListWithDeletedSharedPool(ctx context.Context, sharedPoolIds, storeTypes []string) ([]*entity.SharedPoolObjectStore, error)
}
