// Package dm add by blacknc <blacknc@163.com> at 2024/10/30 14:32:09
package dm

import (
	"context"
	"fmt"
	"strings"
	"time"

	"github.com/tidbcloud/dataflow-service/internal/handler/agent"
)

type TaskContext struct {
	ctx         context.Context
	job         *Job
	stateStack  TaskStateStack
	model       Model
	agentClient agent.AgentClient
}

type TaskState interface {
	String() string
	Exec(c *TaskContext) (TaskState, error)
}

type TaskStateInsights struct {
	state     TaskState
	beginTime time.Time
	cost      time.Duration
	err       error
}

func (s *TaskStateInsights) String() string {
	return fmt.Sprintf("(%s:%d,%d,%v)", s.state, s.beginTime.Unix(), s.cost.Milliseconds(), s.err)
}

type TaskStateStack []*TaskStateInsights

func (s TaskStateStack) String() string {
	var output strings.Builder
	output.WriteByte('[')
	for idx, stateInsights := range s {
		if idx != 0 {
			output.WriteByte(' ')
		}
		output.WriteString(stateInsights.String())
	}
	output.WriteByte(']')
	return output.String()
}
