<?php
declare(strict_types=1);

namespace App\Framework\EventBus;

use App\Framework\DI\DefaultContainer;

final readonly class DefaultEventBus implements EventBus
{
    public function __construct(
        private array     $eventHandlers,
        private DefaultContainer $container
    ) {}

    /**
     * Dispatcht ein Event an alle registrierten Handler
     *
     * @param object $event Das zu dispatchende Event
     * @return void
     */
    public function dispatch(object $event): void {
        $eventClass = get_class($event);

        error_log('Dispatching Event: ' . $eventClass);

        // Prüfe, ob Handler für diesen Event-Typ registriert sind
        if (empty($this->eventHandlers) || !isset($this->eventHandlers[$eventClass])) {
            return;
        }

        // if Handler is Asynchronos send Event to Job Queue

        // Führe alle Handler für diesen Event-Typ aus
        foreach ($this->eventHandlers as $handler) {
            try {
                $handlerClass = $this->container->get($handler['class']);
                $method = $handler['method'];

                $handlerClass->$method($event);

                // Stoppe die Propagation, wenn der Handler dies anfordert
                if (isset($handler['attribute_data']['stopPropagation']) && $handler['attribute_data']['stopPropagation']) {
                    break;
                }
            } catch (\Throwable $e) {
                // Fehler in Event-Handlern sollten die Anwendung nicht abstürzen lassen
                // In einer echten Anwendung würde hier ein Logger verwendet
                error_log('Fehler bei der Ausführung des Event-Handlers: ' . $e->getMessage());
            }
        }
    }
}
