package xtools.boot.task;

import xtools.boot.api.exection.BizError;
import xtools.boot.core.utils.SpringContextUtils;
import xtools.boot.task.enums.TaskStatus;
import xtools.boot.task.interfaces.BaseTaskType;
import xtools.boot.task.interfaces.TaskBusInterface;
import xtools.boot.task.model.dto.TaskInfo;
import xtools.core.CollectionUtils;
import xtools.core.StringUtils;

import java.time.Instant;
import java.util.Collection;
import java.util.Objects;

/**
 * <p>Title : TaskBus</p>
 * <p>Description : TaskBus</p>
 * <p>DevelopTools : Idea_x64_v2026.1</p>
 * <p>DevelopSystem : macOS Sequoia 15.7.5</p>
 * <p>Company : org.xujun</p>
 *
 * @author : XuJun
 * @version : 5.0.0
 * @date : 2026/2/15 10:07
 */
public class TaskBus {

    /**
     * 任务数据
     **/
    private final TaskInfo taskInfo;

    /**
     * 构造方法
     *
     * @param code   任务编码
     * @param type   任务类型
     * @param status 任务状态
     */
    private TaskBus(String code, BaseTaskType type, TaskStatus status) {
        // 参数处理
        if (StringUtils.isBlank(code)) {
            throw new BizError("任务Code不能为空");
        }
        if (type == null) {
            throw new BizError("任务类型不能为空");
        }
        if (status == null) {
            throw new BizError("任务状态不能为空");
        }
        taskInfo = new TaskInfo();
        // 参数赋值
        taskInfo.setCode(code);
        taskInfo.setType(type.desc());
        taskInfo.setStatus(status);
        taskInfo.setInfo(type.desc() + "-" + status.desc());
        taskInfo.setTime(Instant.now());
    }

    /**
     * 初始化任务
     *
     * @param code   任务编码
     * @param type   任务类型
     * @param status 任务状态
     * @return 当前对象
     */
    public static TaskBus init(String code, BaseTaskType type, TaskStatus status) {
        return new TaskBus(code, type, status);
    }

    /**
     * 设置任务信息
     *
     * @param info 任务信息
     * @return 当前对象
     */
    public TaskBus info(String info) {
        if (StringUtils.isBlank(info)) {
            throw new BizError("任务信息不能为空");
        }
        taskInfo.setInfo(info);
        return this;
    }

    /**
     * 设置任务时间
     *
     * @param time 任务时间
     * @return 当前对象
     */
    public TaskBus time(Instant time) {
        if (Objects.isNull(time)) {
            throw new BizError("任务时间不能为空");
        }
        taskInfo.setTime(time);
        return this;
    }

    /**
     * 保存任务
     */
    public void save() {
        Collection<TaskBusInterface> beanList = SpringContextUtils.getBeanList(TaskBusInterface.class);
        if (CollectionUtils.isNotEmpty(beanList)) {
            beanList.forEach(item -> item.save(taskInfo));
        }
    }

}
