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

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.List;

/**
 * 流程执行事件发布器
 * <p>
 * 自动收集所有 Spring 容器中实现了 {@link FlowExecutionListener} 的 Bean，
 * 在流程执行的关键节点发布事件通知。
 */
@Slf4j
@Component
public class FlowExecutionEventPublisher {

    private final List<FlowExecutionListener> listeners;

    public FlowExecutionEventPublisher(List<FlowExecutionListener> listeners) {
        this.listeners = listeners != null ? listeners : Collections.emptyList();
        if (!this.listeners.isEmpty()) {
            log.info("已注册 {} 个流程执行监听器: {}", this.listeners.size(),
                    this.listeners.stream().map(l -> l.getClass().getSimpleName()).toArray());
        }
    }

    /**
     * 发布流程执行事件，通知所有监听器
     *
     * @param event 事件对象
     */
    public void publishEvent(FlowExecutionEvent event) {
        if (listeners.isEmpty()) {
            return;
        }
        for (FlowExecutionListener listener : listeners) {
            try {
                listener.onEvent(event);
            } catch (Exception e) {
                log.error("流程执行监听器 [{}] 处理事件 [{}] 异常: {}",
                        listener.getClass().getSimpleName(), event.getEventType(), e.getMessage(), e);
            }
        }
    }
}
