package cn.axzo.workflow.starter.handler;

import cn.axzo.framework.rocketmq.Event;
import cn.axzo.framework.rocketmq.EventConsumer;
import cn.axzo.workflow.client.feign.bpmn.ProcessInstanceApi;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
import cn.axzo.workflow.common.model.response.mq.ProcessInstanceDTO;
import org.springframework.core.Ordered;

/**
 * 流程实例相关事件
 * <p>
 * 注意：Order 的顺序，遵循值越小越优先。（取值范围：Integer. MIN_VALUE - Integer. MAX_VALUE）
 *
 * @author wangli
 * @since 2024/5/27 16:20
 */
public interface ProcessInstanceEventHandler extends Ordered {

    /**
     * 针对当前接口的实现进行过滤, 为 true 时，往下执行下面的方法
     *
     * @param dto
     * @param event
     * @param context
     * @return
     */
    default boolean accept(ProcessInstanceDTO dto, Event event, EventConsumer.Context context) {
        return true;
    }

    /**
     * 流程实例创建成功后回调
     *
     * @param dto
     */
    default void onCreated(ProcessInstanceDTO dto) {
    }

    /**
     * 流程实例开始运行后回调
     *
     * @param dto
     */
    default void onStarted(ProcessInstanceDTO dto) {
    }

    /**
     * 流程实例运行完成(通过)后回调
     * <p>
     * 注意: 该接口表明流程已经走完正向逻辑，正向逻辑比如：通过、同意等
     *
     * @param dto
     */
    default void onCompleted(ProcessInstanceDTO dto) {
    }

    /**
     * 流程实例被“撤回”后回调
     * <p>
     * 撤回只有发起人能触发
     *
     * @param dto
     */
    default void onCancelled(ProcessInstanceDTO dto) {
    }

    /**
     * 流程实例被“驳回”后回调
     * <p>
     * 审批过程中，有一个审批人或者有节点配置的是“自动驳回”，都能触发该事件。
     *
     * @param dto
     */
    default void onRejected(ProcessInstanceDTO dto) {
    }

    /**
     * 流程实例被中止后回调
     * <p>
     * 一般由接入方主动触发，比如调用了 {@link ProcessInstanceApi#abortProcessInstance(BpmnProcessInstanceAbortDTO)} 方法等
     *
     * @param dto
     */
    default void onAborted(ProcessInstanceDTO dto) {
    }
}
