package plan

import (
	"context"

	"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
)

// Task 定义了所有可被调度器执行的任务必须实现的接口。
type Task interface {
	// Execute 是任务的核心执行逻辑。
	// ctx: 用于控制任务的超时或取消。
	// log: 包含了当前任务执行的完整上下文信息，包括从数据库中加载的任务参数等。
	// 返回的 error 表示任务是否执行成功。调度器会根据返回的 error 是否为 nil 来决定任务状态。
	Execute(ctx context.Context) error

	// OnFailure 定义了当 Execute 方法返回错误时，需要执行的回滚或清理逻辑。
	// log: 任务执行的上下文。
	// executeErr: 从 Execute 方法返回的原始错误。
	OnFailure(ctx context.Context, executeErr error)

	TaskDeviceIDResolver
}

// TaskDeviceIDResolver 定义了从任务配置中解析设备ID的方法
type TaskDeviceIDResolver interface {
	// ResolveDeviceIDs 从任务配置中解析并返回所有关联的设备ID列表
	// 返回值: uint32数组，每个字符串代表一个设备ID
	ResolveDeviceIDs(ctx context.Context) ([]uint32, error)
}

// TaskFactory 是一个工厂接口，用于根据任务执行日志创建任务实例。
type TaskFactory interface {
	// Production 根据指定的任务执行日志创建一个任务实例。
	Production(ctx context.Context, claimedLog *models.TaskExecutionLog) Task
	// CreateTaskFromModel 仅根据任务模型创建一个任务实例，用于非执行场景（如参数解析）。
	CreateTaskFromModel(ctx context.Context, taskModel *models.Task) (TaskDeviceIDResolver, error)
}
