<?php

declare(strict_types=1);

namespace App\Framework\QueryBus;

use App\Framework\DI\Container;

final readonly class DefaultQueryBus implements QueryBus
{
    public function __construct(
        private array     $eventHandlers,
        private Container $container
    ) {
    }

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

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

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

                return $handlerClass->$method($event);

                // Stoppe die Propagation, wenn der Handler dies anfordert
                if (isset($handler['stopPropagation']) && $handler['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
                // This should use proper logger - for now just comment out
                // error_log('Fehler bei der Ausführung des Event-Handlers: ' . $e->getMessage());
            }
        }
    }
}
