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

namespace Hafenstudios\Wellenbrecher\Channels;

use Hafenstudios\Core\Events\EventBus;
use Hafenstudios\Wellenbrecher\Rest\TokenController;

defined( 'ABSPATH' ) || exit;

/**
 * Frontend-Seite des Leadlotse-Kanals (W-L1 b): injiziert ueber den neuen
 * Renderer-Filter `hafenstudios/leadlotse_form_fields` die Signal-Hidden-Felder
 * in jedes Leadlotse-Formular und reiht signals.js ein (nur auf Seiten mit
 * Leadlotse-Formular, Bauplan Kap. 4.4).
 *
 * Die Felder heissen wie im Kommentar-Kanal (wb_js/wb_events/wb_token), damit
 * dasselbe signals.js beide Kanaele bedient. Sie werden als fields[...]
 * ausgegeben, damit sie ueber die vorhandene Leadlotse-Submit-Pipeline
 * (REST wie No-JS) automatisch in den Roh-Submit wandern; der SubmitHandler
 * reicht sie als Kontext an den Spam-Filter weiter. Anders als beim Kommentar-
 * Kanal gibt es hier KEINEN Honeypot/Feld-Tausch: der Leadlotse-Honeypot bleibt
 * der Basisschutz.
 */
class LeadlotseFormFields {

	/**
	 * Proof-of-Work-Feld injizieren (nur bei aktivem Pro-Gate + PoW-Setting;
	 * mit inaktivem Gate bleibt die Injektion byte-identisch zu 1.0.0).
	 */
	protected bool $pow_enabled;

	/**
	 * @param bool $pow_enabled Proof-of-Work-Feld injizieren (Pro + Setting an).
	 */
	public function __construct( bool $pow_enabled = false ) {
		$this->pow_enabled = $pow_enabled;
	}

	/**
	 * Registriert den Injektions-Filter.
	 *
	 * @return void
	 */
	public function register(): void {
		EventBus::add_filter( 'leadlotse_form_fields', array( $this, 'inject' ), 10, 3 );
	}

	/**
	 * Liefert die zu injizierenden Hidden-Felder und reiht signals.js ein.
	 *
	 * @param mixed $html       Bisheriges Injektions-HTML.
	 * @param mixed $form_id    Formular-ID.
	 * @param mixed $definition Formular-Definition.
	 * @return string
	 */
	public function inject( $html, $form_id = 0, $definition = array() ): string {
		$out = is_string( $html ) ? $html : '';

		// Timestamp nach Akismet-Muster (Server rendert Zufallswert 0-250, JS
		// ersetzt ihn durch die Client-Zeit), Event-Feld, Fenster-Token-Feld.
		$out .= '<input type="hidden" name="fields[' . esc_attr( CommentFormFields::FIELD_TIMESTAMP ) . ']" value="' . esc_attr( (string) wp_rand( 0, 250 ) ) . '" />';
		$out .= '<input type="hidden" name="fields[' . esc_attr( CommentFormFields::FIELD_EVENTS ) . ']" value="" />';
		$out .= '<input type="hidden" name="fields[' . esc_attr( CommentFormFields::FIELD_TOKEN ) . ']" value="" />';
		if ( $this->pow_enabled ) {
			$out .= '<input type="hidden" name="fields[' . esc_attr( CommentFormFields::FIELD_POW ) . ']" value="" />';
		}

		$this->enqueue_signals();

		return $out;
	}

	/**
	 * signals.js einreihen (Vanilla, No-Build, progressive enhancement).
	 *
	 * @return void
	 */
	protected function enqueue_signals(): void {
		if ( ! function_exists( 'wp_enqueue_script' ) ) {
			return;
		}
		wp_enqueue_script(
			'wellenbrecher-signals',
			WELLENBRECHER_URL . 'assets/js/signals.js',
			array(),
			WELLENBRECHER_VERSION,
			true
		);
		wp_localize_script(
			'wellenbrecher-signals',
			'wellenbrecherSignals',
			array(
				'tokenUrl' => esc_url_raw( rest_url( TokenController::REST_NAMESPACE . '/token' ) ),
			)
		);
	}
}
