package com.easyagents.agent.runtime.tool.asynctool;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * 异步工具任务视图。
 *
 * <p>observe 和 result 子工具共用该实体。未完成时表达观察态，完成时可同时携带最终结果。</p>
 */
public class AsyncToolTaskView {

    private String taskId;
    private AsyncToolTaskStatus status;
    /**
     * 调用方本次传入的已读事件位置，用于增量读取任务事件。
     */
    private Long cursor;
    /**
     * 服务端返回的下一次观察起点，调用方下次应使用该值继续读取增量事件。
     */
    private Long nextCursor;
    private Integer progress;
    private String summary;
    private String nextAction;
    private List<AsyncToolTaskEvent> events = new ArrayList<>();
    private Object result;
    private String errorMessage;
    private String errorType;
    private Boolean terminal;
    private Boolean resultAvailable;
    private Map<String, Object> payload = new LinkedHashMap<>();
    private Map<String, Object> metadata = new LinkedHashMap<>();

    /**
     * 创建空任务视图。
     */
    public AsyncToolTaskView() {
    }

    /**
     * 获取任务 ID。
     *
     * @return 任务 ID
     */
    public String getTaskId() {
        return taskId;
    }

    /**
     * 设置任务 ID。
     *
     * @param taskId 任务 ID
     */
    public void setTaskId(String taskId) {
        this.taskId = taskId;
    }

    /**
     * 获取任务状态。
     *
     * @return 任务状态
     */
    public AsyncToolTaskStatus getStatus() {
        return status;
    }

    /**
     * 设置任务状态。
     *
     * @param status 任务状态
     */
    public void setStatus(AsyncToolTaskStatus status) {
        this.status = status;
    }

    /**
     * 获取本次请求的已读事件位置。
     *
     * @return 已读事件位置
     */
    public Long getCursor() {
        return cursor;
    }

    /**
     * 设置本次请求的已读事件位置。
     *
     * @param cursor 已读事件位置
     */
    public void setCursor(Long cursor) {
        this.cursor = cursor;
    }

    /**
     * 获取下一次观察起点。
     *
     * @return 下一次观察起点
     */
    public Long getNextCursor() {
        return nextCursor;
    }

    /**
     * 设置下一次观察起点。
     *
     * @param nextCursor 下一次观察起点
     */
    public void setNextCursor(Long nextCursor) {
        this.nextCursor = nextCursor;
    }

    /**
     * 获取进度百分比。
     *
     * @return 进度百分比
     */
    public Integer getProgress() {
        return progress;
    }

    /**
     * 设置进度百分比。
     *
     * @param progress 进度百分比
     */
    public void setProgress(Integer progress) {
        this.progress = progress;
    }

    /**
     * 获取摘要。
     *
     * @return 摘要
     */
    public String getSummary() {
        return summary;
    }

    /**
     * 设置摘要。
     *
     * @param summary 摘要
     */
    public void setSummary(String summary) {
        this.summary = summary;
    }

    /**
     * 获取下一步建议。
     *
     * @return 下一步建议
     */
    public String getNextAction() {
        return nextAction;
    }

    /**
     * 设置下一步建议。
     *
     * @param nextAction 下一步建议
     */
    public void setNextAction(String nextAction) {
        this.nextAction = nextAction;
    }

    /**
     * 获取本次增量事件。
     *
     * @return 本次增量事件
     */
    public List<AsyncToolTaskEvent> getEvents() {
        return events;
    }

    /**
     * 设置本次增量事件。
     *
     * @param events 本次增量事件
     */
    public void setEvents(List<AsyncToolTaskEvent> events) {
        this.events = events == null ? new ArrayList<>() : events;
    }

    /**
     * 获取最终结果。
     *
     * @return 最终结果
     */
    public Object getResult() {
        return result;
    }

    /**
     * 设置最终结果。
     *
     * @param result 最终结果
     */
    public void setResult(Object result) {
        this.result = result;
    }

    /**
     * 获取错误消息。
     *
     * @return 错误消息
     */
    public String getErrorMessage() {
        return errorMessage;
    }

    /**
     * 设置错误消息。
     *
     * @param errorMessage 错误消息
     */
    public void setErrorMessage(String errorMessage) {
        this.errorMessage = errorMessage;
    }

    /**
     * 获取错误类型。
     *
     * @return 错误类型
     */
    public String getErrorType() {
        return errorType;
    }

    /**
     * 设置错误类型。
     *
     * @param errorType 错误类型
     */
    public void setErrorType(String errorType) {
        this.errorType = errorType;
    }

    /**
     * 获取是否终态。
     *
     * @return 是否终态
     */
    public Boolean getTerminal() {
        return terminal;
    }

    /**
     * 设置是否终态。
     *
     * @param terminal 是否终态
     */
    public void setTerminal(Boolean terminal) {
        this.terminal = terminal;
    }

    /**
     * 获取最终结果是否可用。
     *
     * @return 最终结果是否可用
     */
    public Boolean getResultAvailable() {
        return resultAvailable;
    }

    /**
     * 设置最终结果是否可用。
     *
     * @param resultAvailable 最终结果是否可用
     */
    public void setResultAvailable(Boolean resultAvailable) {
        this.resultAvailable = resultAvailable;
    }

    /**
     * 获取业务扩展载荷。
     *
     * @return 业务扩展载荷
     */
    public Map<String, Object> getPayload() {
        return payload;
    }

    /**
     * 设置业务扩展载荷。
     *
     * @param payload 业务扩展载荷
     */
    public void setPayload(Map<String, Object> payload) {
        this.payload = payload == null ? new LinkedHashMap<>() : payload;
    }

    /**
     * 获取元数据。
     *
     * @return 元数据
     */
    public Map<String, Object> getMetadata() {
        return metadata;
    }

    /**
     * 设置元数据。
     *
     * @param metadata 元数据
     */
    public void setMetadata(Map<String, Object> metadata) {
        this.metadata = metadata == null ? new LinkedHashMap<>() : metadata;
    }
}
