package com.easyagents.agent.runtime;

import com.easyagents.agent.runtime.hitl.AgentResumeToken;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 智能体挂起运行恢复请求。
 */
public class AgentResumeRequest {

    /**
     * 挂起运行的恢复令牌。
     */
    private AgentResumeToken resumeToken;

    /**
     * 是否批准继续执行。
     */
    private boolean approved;

    /**
     * 拒绝继续执行时的原因。
     */
    private String rejectReason;

    /**
     * 调用方传入的恢复元数据。
     */
    private Map<String, Object> metadata = new LinkedHashMap<>();

    /**
     * 恢复请求是否已由调用方的持久化 pending store 完成校验和一次性消费。
     *
     * <p>该字段仅供服务端集成层使用。普通调用方不应设置该标记；设置后 runtime 会跳过
     * 当前进程内 {@code AgentToolApprovalCoordinator} 的 token 存在性校验，用于服务重启或跨节点后
     * 从 AgentScope session 中继续 pending tool。批准请求必须在 metadata 中提供
     * {@code toolCallId/toolName/toolInput}，多个调用使用 {@code approvedToolCalls} 列表，
     * 以便 runtime 将持久化审批结果绑定到实际工具调用。</p>
     */
    private boolean trusted;

    /**
     * 获取恢复令牌。
     *
     * @return 恢复令牌
     */
    public AgentResumeToken getResumeToken() {
        return resumeToken;
    }

    /**
     * 设置恢复令牌。
     *
     * @param resumeToken 恢复令牌
     */
    public void setResumeToken(AgentResumeToken resumeToken) {
        this.resumeToken = resumeToken;
    }

    /**
     * 返回是否批准继续执行。
     *
     * @return 批准时为 true
     */
    public boolean isApproved() {
        return approved;
    }

    /**
     * 设置是否批准继续执行。
     *
     * @param approved 批准标记
     */
    public void setApproved(boolean approved) {
        this.approved = approved;
    }

    /**
     * 获取拒绝原因。
     *
     * @return 拒绝原因
     */
    public String getRejectReason() {
        return rejectReason;
    }

    /**
     * 设置拒绝原因。
     *
     * @param rejectReason 拒绝原因
     */
    public void setRejectReason(String rejectReason) {
        this.rejectReason = rejectReason;
    }

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

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

    /**
     * 返回恢复请求是否已由调用方持久化层校验。
     *
     * @return 已校验时为 true
     */
    public boolean isTrusted() {
        return trusted;
    }

    /**
     * 设置恢复请求是否已由调用方持久化层校验。
     *
     * @param trusted 已校验标记
     */
    public void setTrusted(boolean trusted) {
        this.trusted = trusted;
    }
}
