package repo

import (
	"context"

	"github.com/tidbcloud/chaos-svc/idl/pbgen/proto/chaos"
	"github.com/tidbcloud/chaos-svc/pkg/domain/entity"
	"github.com/tidbcloud/pkgv2/bizerr"
	"go.buf.build/protocolbuffers/go/linuxgit/tidbcloud/base"
)

type WorkflowFilter struct {
	ProjectIDs  []uint64
	ClusterIDs  []uint64
	WorkflowIDs []uint64
	Deleted     *bool
	Statuses    []chaos.ExperimentStatus
}

type WorkflowOrderBy string

const (
	WorkflowOrderByID        WorkflowOrderBy = "id"
	WorkflowOrderByClusterID WorkflowOrderBy = "cluster_id"
	WorkflowOrderByCreatedAt WorkflowOrderBy = "created_at"
)

type WorkflowSorter struct {
	OrderBy WorkflowOrderBy
	Desc    bool
}

var _ Sorter = &WorkflowSorter{}

type WorkflowRepo interface {
	Load(ctx context.Context, id uint64) (*entity.Workflow, bizerr.BizError)
	Save(ctx context.Context, backend *entity.Workflow) bizerr.BizError
	Query(ctx context.Context, filter WorkflowFilter, pager *base.Pager, sorters []*WorkflowSorter) ([]*entity.Workflow, bizerr.BizError)
	Count(ctx context.Context, filter WorkflowFilter) (int64, bizerr.BizError)
}

func (s *WorkflowSorter) OrderByColumn() (columnName string, desc bool) {
	return string(s.OrderBy), s.Desc
}
