package com.agent.management.model.entity;

import jakarta.persistence.*;
import lombok.Data;

import java.time.LocalDateTime;

/**
 * AGENTIC 模式下，节点每次被访问时生成的一条快照记录。
 *
 * <p>对应设计文档 {@code docs/plans/agentic-workflow-plan.md} §1.2。
 * 与 {@link WorkflowRunNode}（DAG 模式下每个节点一条记录）不同：
 * 同一节点多次访问时本表会生成多条记录，iterSeq 自增。</p>
 *
 * <p>关键语义：每个 Visit 的工作区 = 上一个 Visit 工作区 + 本节点输出，
 * 同名变量最近覆盖。{@code fromNodeId} 是"飞回标识"，用于运行结果展示。</p>
 */
@Data
@Entity
@Table(name = "workflow_run_visit",
        indexes = {
                @Index(name = "idx_visit_run_id", columnList = "run_id"),
                @Index(name = "idx_visit_run_node", columnList = "run_id, node_id")
        })
public class WorkflowRunVisit {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /** 关联 workflow_run.id（数据库主键，非 runUuid） */
    @Column(name = "run_id", nullable = false)
    private Long runId;

    /** UUID，便于前端引用与 SSE 事件关联 */
    @Column(name = "visit_uuid", nullable = false, unique = true)
    private String visitUuid;

    @Column(name = "node_id", nullable = false)
    private String nodeId;

    /** 节点类型快照（userInput / llm / skill / ... / output） */
    @Column(name = "node_type")
    private String nodeType;

    @Column(name = "node_label")
    private String nodeLabel;

    /**
     * 同节点第几次访问（1-based）。
     * <p>例如 A→B→A，则 A#1 / B#1 / A#2，iterSeq 分别为 1 / 1 / 2。</p>
     */
    @Column(name = "iter_seq", nullable = false)
    private Integer iterSeq;

    /**
     * 上一个 Visit 的 UUID。起始节点为 null。
     * <p>构成单链表，便于运行结果中回溯整条访问链。</p>
     */
    @Column(name = "from_visit_uuid")
    private String fromVisitUuid;

    /**
     * 飞回标识：上一个 Visit 的 nodeId。起始节点为 null。
     * <p>用于运行结果处给当前节点打"⬅ 来自 X#N"标识。</p>
     */
    @Column(name = "from_node_id")
    private String fromNodeId;

    /** 本 Visit 工作区快照 JSON（含初始输入 + 此前所有访问节点的输出） */
    @Column(name = "variables_json", columnDefinition = "TEXT")
    private String variablesJson;

    /** 本节点本次输出的 envelope JSON */
    @Column(name = "output_json", columnDefinition = "TEXT")
    private String outputJson;

    /**
     * 执行日志 JSON 数组（同 {@link com.agent.management.model.entity.WorkflowRunNode#getLogs()}）。
     * <p>包含 THINKING / TOOL_CALL / TOOL_RESULT / TODO_UPDATE 等所有持久化日志，
     * 让运行记录页能从 Visit 还原 streamingThinking / toolHistory / todos，无需联表 WorkflowRunNode。</p>
     * <p>DAG / AGENTIC 模式均写入；为 null 表示该 Visit 未持久化日志（早期记录或无日志的简单节点）。</p>
     */
    @Column(name = "logs_json", columnDefinition = "TEXT")
    private String logsJson;

    /** Planner 决策 JSON（含 next、reason），用于追溯 AI 跳转意图 */
    @Column(name = "decision_json", columnDefinition = "TEXT")
    private String decisionJson;

    /** RUNNING / SUCCESS / FAILED */
    @Column(nullable = false)
    private String status;

    @Column(name = "error_msg", columnDefinition = "TEXT")
    private String errorMsg;

    /** 全局访问顺序（0-based，与同 run 的其他 Visit 比对） */
    @Column(name = "sort_order", nullable = false)
    private Integer sortOrder;

    @Column(name = "created_at")
    private LocalDateTime createdAt;

    @PrePersist
    protected void onCreate() {
        if (createdAt == null) createdAt = LocalDateTime.now();
    }
}
