<?php
/**
 * @package Hafenstudios\Core
 */

namespace Hafenstudios\Core\Events;

defined( 'ABSPATH' ) || exit;

/**
 * Duenne Fassade ueber die WordPress-Hooks mit einheitlichem `hafenstudios/`-Praefix.
 *
 * Die interne Kommunikation zwischen den Plugins der Flotte laeuft bewusst ueber
 * PHP-Hooks (nicht REST), siehe BAUPLAN Abschnitt 26. Der Praefix haelt den
 * gemeinsamen Namensraum sauber und auffindbar.
 */
final class EventBus {

	public const PREFIX = 'hafenstudios/';

	/**
	 * Feuert ein Flotten-Event.
	 *
	 * @param string $event Eventname ohne Praefix, z.B. "lead_created".
	 * @param mixed  ...$args Nutzlast.
	 * @return void
	 */
	public static function emit( string $event, ...$args ): void {
		do_action( self::PREFIX . $event, ...$args );
	}

	/**
	 * Registriert einen Listener auf ein Flotten-Event.
	 *
	 * @param string   $event    Eventname ohne Praefix.
	 * @param callable $callback Listener.
	 * @param int      $priority Prioritaet.
	 * @param int      $args     Anzahl Argumente.
	 * @return void
	 */
	public static function on( string $event, callable $callback, int $priority = 10, int $args = 1 ): void {
		add_action( self::PREFIX . $event, $callback, $priority, $args );
	}

	/**
	 * Wendet einen Flotten-Filter an.
	 *
	 * @param string $event Filtername ohne Praefix.
	 * @param mixed  $value Ausgangswert.
	 * @param mixed  ...$args Weitere Argumente.
	 * @return mixed
	 */
	public static function filter( string $event, $value, ...$args ) {
		return apply_filters( self::PREFIX . $event, $value, ...$args );
	}

	/**
	 * Registriert einen Filter-Callback.
	 *
	 * @param string   $event    Filtername ohne Praefix.
	 * @param callable $callback Callback.
	 * @param int      $priority Prioritaet.
	 * @param int      $args     Anzahl Argumente.
	 * @return void
	 */
	public static function add_filter( string $event, callable $callback, int $priority = 10, int $args = 1 ): void {
		add_filter( self::PREFIX . $event, $callback, $priority, $args );
	}
}
