package workflow

import (
	"context"

	ffentity "github.com/shiningrush/fastflow/pkg/entity"
	"github.com/shiningrush/fastflow/pkg/entity/run"
	"github.com/shiningrush/fastflow/pkg/mod"
)

const (
	WatcherName = "serverless-service-cdc-watcher"

	DagCreateNewArchChangefeed = "cdc-newarch-create-changefeed"
	DagScaleNewArchCluster     = "cdc-newarch-scale-cluster"
	DagDeleteNewArchChangefeed = "cdc-newarch-delete-changefeed"

	ActionCreateOrScaleNewArchCluster = "cdc-newarch-create-or-scale-cluster"
	ActionCreateNewArchFeed           = "cdc-newarch-create-feed"
	ActionCreateNewArchFinal          = "cdc-newarch-create-final"
	ActionScaleNewArchCluster         = "cdc-newarch-scale-cluster"
	ActionScaleNewArchFinal           = "cdc-newarch-scale-final"
	ActionCancelNewArchDagIns         = "cdc-newarch-cancel-unfinished-dag-ins"
	ActionDeleteNewArchFeed           = "cdc-newarch-delete-feed"
	ActionDeleteOrScaleCluster        = "cdc-newarch-delete-or-scale-cluster"
	ActionDeleteNewArchDeregister     = "cdc-newarch-delete-deregister"
	ActionDeleteNewArchFinal          = "cdc-newarch-delete-final"
	ActionRegisterClusterJob          = "cdc-newarch-register-cluster-job"
	ActionDeregisterClusterJob        = "cdc-newarch-deregister-cluster-job"

	TagChangefeedID     = "changefeed_id"
	TagClusterID        = "cluster_id"
	TagProvider         = "provider"
	TagRegion           = "region"
	TagKubernetes       = "kubernetes"
	TagWorkflowCategory = "category"
)

type Workflow interface {
	Close()
	RegisterDag(dag *ffentity.Dag, actions []run.Action) error
	RunDagWithTags(dagID string, vars map[string]string, tags map[string]string) (*ffentity.DagInstance, error)
	RetryDagIns(dagInsID string, ops ...mod.CommandOptSetter) error
	CancelDagIns(dagInsID string, ops ...mod.CommandOptSetter) error
	ListDagIns(input *mod.ListDagInstanceInput) ([]*ffentity.DagInstance, error)
	StartExecutor() error
}

type CDCNewArchHook interface {
	ScheduleChangefeed(ctx context.Context, clusterID, changefeedID string) error
	ScaleChangefeedResource(ctx context.Context, clusterID, changefeedID string) error
	DeleteChangefeedResource(ctx context.Context, clusterID, changefeedID string) error
	IsChangefeedResourceReady(ctx context.Context, clusterID, changefeedID string) (bool, error)
	CreateChangefeed(ctx context.Context, clusterID, changefeedID string) error
	IsChangefeedResourceReleased(ctx context.Context, clusterID, changefeedID string) (bool, error)
	DeleteChangefeed(ctx context.Context, clusterID, changefeedID string) error
	DeregisterChangefeed(ctx context.Context, clusterID, changefeedID string) error
	FinalizeCreateChangefeed(ctx context.Context, clusterID, changefeedID string) error
	FinalizeScaleChangefeed(ctx context.Context, clusterID, changefeedID string) error
	FinalizeDeleteChangefeed(ctx context.Context, clusterID, changefeedID string) error
	RegisterCDCClusterJob(ctx context.Context, clusterID, changefeedID string) error
	DeregisterCDCClusterJob(ctx context.Context, clusterID, changefeedID string) error
}

type Registrar struct{}

type Runtime struct{}
