package tech.easyflow.agent.runtime.asynctool;

import com.easyagents.agent.runtime.tool.asynctool.AsyncToolTaskEvent;
import com.easyagents.agent.runtime.tool.asynctool.AsyncToolTaskStatus;

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

/**
 * Agent 异步工具任务 Redis 运行态记录。
 */
public class AgentAsyncToolTaskRecord {

    private String taskId;
    private String toolType;
    private String toolName;
    private String businessId;
    private String businessExecutionId;
    private String sessionScopedKey;
    private Long ttlSeconds;
    private AsyncToolTaskStatus status = AsyncToolTaskStatus.PENDING;
    private Map<String, Object> arguments = new LinkedHashMap<>();
    private String summary;
    private Object result;
    private String errorMessage;
    private String errorType;
    private List<AsyncToolTaskEvent> events = new ArrayList<>();
    private String requestId;
    private String traceId;
    private String sessionId;
    private String agentId;
    private String toolCallId;
    private Instant createdAt = Instant.now();
    private Instant updatedAt = Instant.now();
    private Map<String, Object> payload = new LinkedHashMap<>();
    private Map<String, Object> metadata = new LinkedHashMap<>();

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

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

    /**
     * 获取工具类型。
     *
     * @return 工具类型
     */
    public String getToolType() { return toolType; }

    /**
     * 设置工具类型。
     *
     * @param toolType 工具类型
     */
    public void setToolType(String toolType) { this.toolType = toolType; }

    /**
     * 获取工具名称。
     *
     * @return 工具名称
     */
    public String getToolName() { return toolName; }

    /**
     * 设置工具名称。
     *
     * @param toolName 工具名称
     */
    public void setToolName(String toolName) { this.toolName = toolName; }

    /**
     * 获取业务资源 ID。
     *
     * @return 业务资源 ID
     */
    public String getBusinessId() { return businessId; }

    /**
     * 设置业务资源 ID。
     *
     * @param businessId 业务资源 ID
     */
    public void setBusinessId(String businessId) { this.businessId = businessId; }

    /**
     * 获取业务执行记录 ID。
     *
     * @return 业务执行记录 ID
     */
    public String getBusinessExecutionId() { return businessExecutionId; }

    /**
     * 设置业务执行记录 ID。
     *
     * @param businessExecutionId 业务执行记录 ID
     */
    public void setBusinessExecutionId(String businessExecutionId) { this.businessExecutionId = businessExecutionId; }

    /**
     * 获取会话内任务存储 key。
     *
     * @return 会话内任务存储 key
     */
    public String getSessionScopedKey() { return sessionScopedKey; }

    /**
     * 设置会话内任务存储 key。
     *
     * @param sessionScopedKey 会话内任务存储 key
     */
    public void setSessionScopedKey(String sessionScopedKey) { this.sessionScopedKey = sessionScopedKey; }

    /**
     * 获取任务 TTL 秒数。
     *
     * @return TTL 秒数
     */
    public Long getTtlSeconds() { return ttlSeconds; }

    /**
     * 设置任务 TTL 秒数。
     *
     * @param ttlSeconds TTL 秒数
     */
    public void setTtlSeconds(Long ttlSeconds) { this.ttlSeconds = ttlSeconds; }

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

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

    /**
     * 获取任务参数。
     *
     * @return 任务参数
     */
    public Map<String, Object> getArguments() { return arguments; }

    /**
     * 设置任务参数。
     *
     * @param arguments 任务参数
     */
    public void setArguments(Map<String, Object> arguments) { this.arguments = arguments == null ? new LinkedHashMap<>() : arguments; }

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

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

    /**
     * 获取任务结果。
     *
     * @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 List<AsyncToolTaskEvent> getEvents() { return events; }

    /**
     * 设置任务事件列表。
     *
     * @param events 任务事件列表
     */
    public void setEvents(List<AsyncToolTaskEvent> events) { this.events = events == null ? new ArrayList<>() : events; }

    /**
     * 获取请求 ID。
     *
     * @return 请求 ID
     */
    public String getRequestId() { return requestId; }

    /**
     * 设置请求 ID。
     *
     * @param requestId 请求 ID
     */
    public void setRequestId(String requestId) { this.requestId = requestId; }

    /**
     * 获取链路 ID。
     *
     * @return 链路 ID
     */
    public String getTraceId() { return traceId; }

    /**
     * 设置链路 ID。
     *
     * @param traceId 链路 ID
     */
    public void setTraceId(String traceId) { this.traceId = traceId; }

    /**
     * 获取 Agent Runtime session ID。
     *
     * @return session ID
     */
    public String getSessionId() { return sessionId; }

    /**
     * 设置 Agent Runtime session ID。
     *
     * @param sessionId session ID
     */
    public void setSessionId(String sessionId) { this.sessionId = sessionId; }

    /**
     * 获取 Agent ID。
     *
     * @return Agent ID
     */
    public String getAgentId() { return agentId; }

    /**
     * 设置 Agent ID。
     *
     * @param agentId Agent ID
     */
    public void setAgentId(String agentId) { this.agentId = agentId; }

    /**
     * 获取工具调用 ID。
     *
     * @return 工具调用 ID
     */
    public String getToolCallId() { return toolCallId; }

    /**
     * 设置工具调用 ID。
     *
     * @param toolCallId 工具调用 ID
     */
    public void setToolCallId(String toolCallId) { this.toolCallId = toolCallId; }

    /**
     * 获取创建时间。
     *
     * @return 创建时间
     */
    public Instant getCreatedAt() { return createdAt; }

    /**
     * 设置创建时间。
     *
     * @param createdAt 创建时间
     */
    public void setCreatedAt(Instant createdAt) { this.createdAt = createdAt == null ? Instant.now() : createdAt; }

    /**
     * 获取更新时间。
     *
     * @return 更新时间
     */
    public Instant getUpdatedAt() { return updatedAt; }

    /**
     * 设置更新时间。
     *
     * @param updatedAt 更新时间
     */
    public void setUpdatedAt(Instant updatedAt) { this.updatedAt = updatedAt == null ? Instant.now() : updatedAt; }

    /**
     * 获取业务载荷。
     *
     * @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; }
}
