// File: src/core/events.js

export function createEventBus() {
    const listeners = new Map(); // key: eventName => Set(handlers)

    function on(eventName, handler) {
        if (!listeners.has(eventName)) {
            listeners.set(eventName, new Set());
        }
        listeners.get(eventName).add(handler);

        // برای chain
        return () => off(eventName, handler);
    }

    function once(eventName, handler) {
        const wrapper = (payload) => {
            off(eventName, wrapper);
            handler(payload);
        };
        on(eventName, wrapper);
    }

    function off(eventName, handler) {
        const set = listeners.get(eventName);
        if (!set) return;
        set.delete(handler);
        if (set.size === 0) {
            listeners.delete(eventName);
        }
    }

    function emit(eventName, payload) {
        const set = listeners.get(eventName);
        if (!set) return;

        // برای جلوگیری از مشکل تغییر مجموعه هنگام loop
        const handlers = Array.from(set);
        for (const handler of handlers) {
            try {
                handler(payload);
            } catch (err) {
                // می‌توانیم یک event خاص برای خطا اضافه کنیم
                console.error(`CPM EventBus error in "${eventName}":`, err);
            }
        }
    }

    function clearAllListeners() {
        listeners.clear();
    }

    return {
        on,
        once,
        off,
        emit,
        clearAllListeners
    };
}
