package com.cmvr.test.flow.runtime.event;

import com.alibaba.fastjson2.JSONObject;
import com.cmvr.test.enums.ActionEnum;
import com.cmvr.test.enums.TaskStatusEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * 流程执行事件。
 * <p>
 * 用于描述流程引擎执行过程中的关键节点和任务状态变化，供业务模块监听并处理。
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class FlowExecutionEvent {

    /**
     * 事件类型。
     */
    private EventType eventType;

    /**
     * 流程任务实例ID。
     */
    private String instId;

    /**
     * 流程任务ID。
     */
    private String taskId;

    /**
     * 事件所属业务模块编码，用于监听器路由隔离。
     */
    private String moduleCode;

    /**
     * 当前检测项内的节点总数。
     */
    private Integer nodeCount;

    /**
     * 当前检测项ID。
     */
    private String itemId;

    /**
     * 当前节点ID，节点级事件时有值。
     */
    private String nodeId;

    /**
     * 当前节点类型，节点级事件时有值。
     */
    private String nodeType;

    /**
     * 当前节点名称。
     */
    private String nodeName;

    /**
     * 当前节点动作，用于业务监听器识别标准化节点输出。
     */
    private ActionEnum action;

    /**
     * 节点成功执行后的输出参数。
     */
    private JSONObject outputParams;

    /**
     * 当前工作流绑定的终端ID。
     */
    private String terminalId;

    /**
     * 循环节点迭代路径，用于区分同一节点的多次执行结果。
     */
    private List<Integer> iterations;

    /**
     * 当前任务状态。
     */
    private TaskStatusEnum status;

    /**
     * 错误信息，失败事件时有值。
     */
    private String errorMessage;

    /**
     * 流程执行事件类型。
     */
    public enum EventType {
        /** 节点执行完成 */
        NODE_COMPLETED,
        /** 节点执行失败 */
        NODE_FAILED,
        /** 任务全部执行完成 */
        TASK_COMPLETED,
        /** 任务执行失败 */
        TASK_FAILED,
        /** 任务暂停 */
        TASK_PAUSED,
        /** 任务终止 */
        TASK_STOPPED,
        /** 任务恢复执行 */
        TASK_RESUMED,
        /** 节点开始执行 */
        NODE_STARTED,
    }
}
