001/**
002 * Copyright (c) 2025-2026, Michael Yang 杨福海 (fuhai999@gmail.com).
003 * <p>
004 * Licensed under the GNU Lesser General Public License (LGPL) ,Version 3.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 * <p>
008 * http://www.gnu.org/licenses/lgpl-3.0.txt
009 * <p>
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package dev.tinyflow.core.chain;
017
018/**
019 * 链(Chain)执行生命周期状态枚举
020 * <p>
021 * 该状态机描述了一个 Chain 实例从创建到终止的完整生命周期。
022 * 状态分为三类:
023 * - <b>初始状态</b>:READY
024 * - <b>运行中状态</b>:RUNNING, SUSPEND, WAITING
025 * - <b>终态(Terminal)</b>:SUCCEEDED, FAILED, CANCELLED(不可再变更)
026 * <p>
027 * 设计原则:
028 * - 使用行业通用术语(如 SUCCEEDED/FAILED,而非 FINISHED_NORMAL/ABNORMAL)
029 * - 明确区分人工干预(SUSPEND)与系统调度(WAITING)
030 * - 终态互斥且不可逆,便于状态判断与持久化恢复
031 */
032public enum ChainStatus {
033
034    /**
035     * 初始状态:Chain 已创建,但尚未开始执行。
036     * <p>
037     * 此状态下,Chain 的内存为空,节点尚未触发。
038     * 调用 {@link Chain#execute} 或 {@link Chain#doExecute} 后进入 {@link #RUNNING}。
039     */
040    READY(0),
041
042    /**
043     * 运行中:Chain 正在执行节点逻辑(同步或异步)。
044     * <p>
045     * 只要至少一个节点仍在处理(包括等待 Phaser 同步),状态即为 RUNNING。
046     * 遇到挂起条件(如缺少参数、loop 间隔)时,会转为 {@link #SUSPEND}
047     */
048    RUNNING(1),
049
050    /**
051     * 暂停(人工干预):Chain 因缺少外部输入而暂停,需用户主动恢复。
052     * <p>
053     * 典型场景:
054     * - 节点参数缺失且标记为 required(等待用户提交)
055     * - 人工审批节点(等待管理员操作)
056     * <p>
057     * 恢复方式:调用 {@link Chain#resume(Map)} 注入所需变量。
058     * 监听器:通过 {@link dev.tinyflow.core.chain.listener.ChainSuspendListener} 感知。
059     */
060    SUSPEND(5),
061
062
063    /**
064     * 错误(中间状态):执行中发生异常,但尚未终结(例如正在重试)。
065     * <p>
066     * 此状态表示:Chain 遇到错误,但仍在尝试恢复(如重试机制触发)。
067     * 如果重试成功,可回到 RUNNING;如果重试耗尽,则进入 {@link #FAILED}。
068     * <p>
069     * ⚠️ 注意:此状态 <b>不是终态</b>,Chain 仍可恢复。
070     */
071    ERROR(10),
072
073    /**
074     * 成功完成:Chain 所有节点正常执行完毕,无错误发生。
075     * <p>
076     * 终态(Terminal State)—— 状态不可再变更。
077     * 此状态下,Chain 的执行结果(executeResult)有效。
078     */
079    SUCCEEDED(20),
080
081    /**
082     * 失败结束:Chain 因未处理的异常或错误条件而终止。
083     * <p>
084     * 终态(Terminal State)—— 状态不可再变更。
085     * 常见原因:节点抛出异常、重试耗尽、条件校验失败等。
086     * 错误详情可通过 {@link ChainState#getError()} 获取。
087     */
088    FAILED(21),
089
090    /**
091     * 已取消:Chain 被用户或系统主动终止,非因错误。
092     * <p>
093     * 终态(Terminal State)—— 状态不可再变更。
094     * 典型场景:
095     * - 用户点击“取消”按钮
096     * - 超时自动取消(如审批超时)
097     * - 父流程终止子流程
098     * <p>
099     * 与 {@link #FAILED} 的区别:CANCELLED 是预期行为,通常不计入错误率。
100     */
101    CANCELLED(22);
102
103    /**
104     * 状态的数值标识,可用于数据库存储或网络传输
105     */
106    private final int value;
107
108    ChainStatus(int value) {
109        this.value = value;
110    }
111
112    /**
113     * 判断当前状态是否为终态(Terminal State)
114     * <p>
115     * 终态包括:SUCCEEDED, FAILED, CANCELLED
116     * 一旦进入终态,Chain 不可再恢复或继续执行。
117     *
118     * @return 如果是终态,返回 true;否则返回 false
119     */
120    public boolean isTerminal() {
121        return this == SUCCEEDED || this == FAILED || this == CANCELLED;
122    }
123
124    /**
125     * 判断当前状态是否表示成功完成
126     *
127     * @return 如果是 {@link #SUCCEEDED},返回 true;否则返回 false
128     */
129    public boolean isSuccess() {
130        return this == SUCCEEDED;
131    }
132
133
134    /**
135     * 获取状态对应的数值标识
136     *
137     * @return 状态值
138     */
139    public int getValue() {
140        return value;
141    }
142
143    public static ChainStatus fromValue(int value) {
144        for (ChainStatus status : values()) {
145            if (status.value == value) {
146                return status;
147            }
148        }
149        return null;
150    }
151}