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

namespace Hafenstudios\Leadlotse\Frontend;

use Hafenstudios\Core\Core;

defined( 'ABSPATH' ) || exit;

/**
 * Frontend-Verdrahtung (Etappe 3): Shortcode, Gutenberg-Block und Assets.
 *
 * Block und Shortcode nutzen dieselbe Render-Pipeline (FormRenderer). Das
 * Frontend-CSS ist bewusst schlank und ueber die Einstellung
 * `frontend.load_css` abschaltbar (Theme uebernimmt dann komplett).
 */
final class Frontend {

	public const SHORTCODE = 'leadlotse';

	private FormRenderer $renderer;

	/**
	 * Ob auf dieser Seite ein Formular gerendert wurde (Assets nur dann laden).
	 *
	 * @var bool
	 */
	private bool $rendered = false;

	/**
	 * @param FormRenderer $renderer Frontend-Renderer.
	 */
	public function __construct( FormRenderer $renderer ) {
		$this->renderer = $renderer;
	}

	/**
	 * Registriert Shortcode, Block und Asset-Hooks.
	 *
	 * @return void
	 */
	public function register(): void {
		add_shortcode( self::SHORTCODE, array( $this, 'shortcode' ) );
		add_action( 'init', array( $this, 'register_block' ) );
		add_action( 'wp_enqueue_scripts', array( $this, 'register_assets' ) );
		// Spaetes Enqueue im Footer, falls das Formular erst im Content auftauchte.
		add_action( 'wp_footer', array( $this, 'maybe_enqueue' ), 1 );
	}

	/**
	 * Shortcode [leadlotse id="123"] - gleiche Pipeline wie der Block.
	 *
	 * @param array<string, mixed>|string $atts Shortcode-Attribute.
	 * @return string
	 */
	public function shortcode( $atts ): string {
		$atts = shortcode_atts( array( 'id' => 0 ), (array) $atts, self::SHORTCODE );
		return $this->render_form( absint( $atts['id'] ) );
	}

	/**
	 * Registriert den Gutenberg-Block "Leadlotse Formular" (Server-Side-Render).
	 *
	 * @return void
	 */
	public function register_block(): void {
		$block_dir = LEADLOTSE_DIR . 'blocks/form-embed';
		if ( ! file_exists( $block_dir . '/block.json' ) ) {
			return;
		}

		// No-Build-Block: Editor-Script mit expliziten Abhaengigkeiten
		// registrieren (D13). block.json referenziert dieses Handle ueber
		// "editorScript". So ist kein Webpack-Build noetig.
		wp_register_script(
			'leadlotse-form-embed-editor',
			LEADLOTSE_URL . 'blocks/form-embed/src/index.js',
			array(
				'wp-blocks',
				'wp-element',
				'wp-block-editor',
				'wp-components',
				'wp-i18n',
				'wp-api-fetch',
				'wp-server-side-render',
			),
			LEADLOTSE_VERSION,
			true
		);
		wp_set_script_translations( 'leadlotse-form-embed-editor', 'leadlotse' );

		register_block_type(
			$block_dir,
			array(
				'render_callback' => array( $this, 'render_block' ),
			)
		);
	}

	/**
	 * Render-Callback des Blocks.
	 *
	 * @param array<string, mixed> $attributes Block-Attribute.
	 * @return string
	 */
	public function render_block( array $attributes ): string {
		$form_id = absint( $attributes['formId'] ?? 0 );
		if ( 0 === $form_id ) {
			// Leerer Block im Frontend: nichts ausgeben (Editor zeigt den Platzhalter).
			return '';
		}
		return $this->render_form( $form_id );
	}

	/**
	 * Gemeinsame Render-Pipeline fuer Block und Shortcode.
	 *
	 * @param int $form_id Formular-ID.
	 * @return string
	 */
	public function render_form( int $form_id ): string {
		if ( $form_id <= 0 ) {
			return '';
		}
		$this->rendered = true;
		$this->maybe_enqueue();
		return $this->renderer->render_by_id( $form_id );
	}

	/**
	 * Registriert die Frontend-Assets (Enqueue erst beim ersten Formular).
	 *
	 * @return void
	 */
	public function register_assets(): void {
		wp_register_style(
			'leadlotse-frontend',
			LEADLOTSE_URL . 'assets/css/frontend.css',
			array(),
			LEADLOTSE_VERSION
		);
		wp_register_script(
			'leadlotse-frontend',
			LEADLOTSE_URL . 'assets/js/frontend.js',
			array(),
			LEADLOTSE_VERSION,
			true
		);
		wp_localize_script(
			'leadlotse-frontend',
			'leadlotseFrontend',
			array(
				'restUrl' => esc_url_raw( rest_url( 'leadlotse/v1/submit' ) ),
				'nonce'   => wp_create_nonce( 'wp_rest' ),
				'i18n'    => array(
					'success' => __( 'Vielen Dank. Ihre Anfrage wurde gesendet.', 'leadlotse' ),
					'error'   => __( 'Die Anfrage konnte nicht gesendet werden. Bitte pruefen Sie Ihre Eingaben und versuchen Sie es erneut.', 'leadlotse' ),
				),
			)
		);
	}

	/**
	 * Laedt CSS/JS, sobald mindestens ein Formular auf der Seite ist.
	 * CSS nur, wenn die Einstellung frontend.load_css aktiv ist (Default an).
	 *
	 * @return void
	 */
	public function maybe_enqueue(): void {
		if ( ! $this->rendered ) {
			return;
		}

		$load_css = (bool) Core::instance()->settings( 'leadlotse' )->get( 'frontend.load_css', true );
		if ( $load_css && ! wp_style_is( 'leadlotse-frontend', 'enqueued' ) ) {
			wp_enqueue_style( 'leadlotse-frontend' );
		}
		if ( ! wp_script_is( 'leadlotse-frontend', 'enqueued' ) ) {
			wp_enqueue_script( 'leadlotse-frontend' );
		}
	}
}
