package tasks

import (
	"context"
	"devops/agent/script"
	"time"
)

var (
	// Task 运行器注册表
	taskRunnerRegistry = make(map[string]TaskRunner)
)

func RegisterTaskRunner(name string, runner TaskRunner) {
	taskRunnerRegistry[name] = runner
}

func GetTaskRunner(name string) TaskRunner {
	return taskRunnerRegistry[name]
}

// Task 是一个接口，定义了任务的基本行为
// 任务名称: task_debug, 任务描述: 调试任务, 任务类型: debug, 任务参数: {}
type TaskRunner interface {
	// 任务需要的运行能力
	Run(context.Context, *RunTaskRequest) (*script.ExecutionResult, error)
}

func NewRunTaskRequest(workDir string, name string) *RunTaskRequest {
	return &RunTaskRequest{
		WorkDir:     workDir,
		Name:        name,
		InputParams: make(map[string]string),
	}
}

type RunTaskRequest struct {
	// 任务名称, 比如 "build", "deploy" 每一个名称 在Agent测有一个唯一的Task与之对应
	Name string `json:"name"`
	// 运行参数, 比如构建任务的代码分支、部署任务的目标环境等 作为环境变量传递给任务脚本执行
	InputParams map[string]string `json:"input_params"`
	// 工作目录, 任务执行过程中产生的文件都放在这个目录下, 由Agent负责清理
	WorkDir string `json:"work_dir"`
	// 任务超时时间, 0表示不超时
	TimeoutSecond int64 `json:"timeout_second"`
}

func (r *RunTaskRequest) SetInputParams(key, value string) *RunTaskRequest {
	r.InputParams[key] = value
	return r

}

func (t *RunTaskRequest) GetTimeout() time.Duration {
	if t.TimeoutSecond > 0 {
		return time.Duration(t.TimeoutSecond) * time.Second
	}

	return time.Duration(60) * time.Minute
}
