package com.qqchen.deploy.backend.workflow.listener;

import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.delegate.ExecutionListener;

/**
 * 执行监听器基类
 * 提供统一的流程控制方法
 *
 * @author qqchen
 * @since 2025-11-07
 */
@Slf4j
public abstract class BaseExecutionListener implements ExecutionListener {

    // ===================== 便利方法：流程控制 =====================

    /**
     * 终止流程（致命错误）- 使用自定义错误码
     * <p>
     * 适用场景：需要指定特定错误码用于边界事件捕获
     *
     * @param errorCode    错误码（如 workflow_exec_error）
     * @param errorMessage 错误描述
     */
    protected void terminateWorkflow(String errorCode, String errorMessage) {
        log.error("🛑 Listener terminating workflow: errorCode={}, message={}", errorCode, errorMessage);
        throw new org.flowable.engine.delegate.BpmnError(errorCode, errorMessage);
    }

    /**
     * 终止流程（致命错误）- 使用默认错误码
     * <p>
     * 适用场景：监听器中发生致命错误，需要立即终止流程
     *
     * @param errorMessage 错误描述
     */
    protected void terminateWorkflow(String errorMessage) {
        terminateWorkflow("workflow_exec_error", errorMessage);
    }

    /**
     * 终止流程（致命错误）- 使用异常对象
     * <p>
     * 适用场景：捕获异常后直接终止流程
     *
     * @param exception 异常对象
     */
    protected void terminateWorkflow(Exception exception) {
        String errorMessage = exception.getMessage() != null
            ? exception.getMessage()
            : exception.getClass().getSimpleName();
        terminateWorkflow(errorMessage);
    }
}

