// package task 定义了与任务处理相关的结构体和函数。
package task

import (
	"time"

	"gitlink.org.cn/cloudream/common/pkgs/task"             // 引入task包，提供任务处理的通用功能。
	cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"   // 引入cdssdk包，提供云存储相关的SDK接口。
	"gitlink.org.cn/cloudream/storage/common/pkgs/cmd"      // 引入cmd包，提供命令执行相关的功能。
	"gitlink.org.cn/cloudream/storage/common/pkgs/iterator" // 引入iterator包，提供迭代器相关的功能。
)

// UploadObjectsResult 定义了上传对象结果的类型，继承自cmd包的UploadObjectsResult类型。
type UploadObjectsResult = cmd.UploadObjectsResult

// UploadObjects 定义了上传对象的任务结构体，包含上传命令和执行结果。
type UploadObjects struct {
	cmd cmd.UploadObjects // cmd字段定义了上传对象的具体操作。

	Result *UploadObjectsResult // Result字段存储上传对象操作的结果。
}

// NewUploadObjects 创建并返回一个新的UploadObjects实例。
// userID: 用户ID，标识发起上传请求的用户。
// packageID: 包ID，标识被上传的对象所属的包。
// objectIter: 上传对象迭代器，用于遍历和上传多个对象。
// storageAffinity: 节点亲和性，指定上传任务首选的执行节点。
// 返回值为初始化后的UploadObjects指针。
func NewUploadObjects(userID cdssdk.UserID, packageID cdssdk.PackageID, objectIter iterator.UploadingObjectIterator, storageAffinity cdssdk.StorageID) *UploadObjects {
	return &UploadObjects{
		cmd: *cmd.NewUploadObjects(userID, packageID, objectIter, storageAffinity),
	}
}

// Execute 执行上传对象的任务。
// task: 任务实例，包含任务的上下文信息。
// ctx: 任务执行的上下文，包括分布式锁和网络连接性等信息。
// complete: 任务完成时的回调函数。
// 该函数负责调用上传命令的Execute方法，处理上传结果，并通过回调函数报告任务完成情况。
func (t *UploadObjects) Execute(task *task.Task[TaskContext], ctx TaskContext, complete CompleteFn) {
	ret, err := t.cmd.Execute(&cmd.UploadObjectsContext{
		Distlock:     ctx.distlock,     // 使用任务上下文中的分布式锁。
		Connectivity: ctx.connectivity, // 使用任务上下文中的网络连接性信息。
		StgMgr:       ctx.stgMgr,
	})

	t.Result = ret // 存储上传结果。

	complete(err, CompleteOption{
		RemovingDelay: time.Minute, // 设置任务完成后的清理延迟为1分钟。
	})
}
