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

namespace Hafenstudios\Kurato\Site;

use Hafenstudios\Kurato\Db\BookingTypeRepository;
use Hafenstudios\Kurato\Db\HostRepository;

defined( 'ABSPATH' ) || exit;

/**
 * Gutenberg-Block und Shortcode fuer die oeffentliche Buchungsseite (K5c,
 * K5-KONZEPT Abschnitt 4).
 *
 * Bewusst KEIN eingebettetes Buchungs-UI: das volle Drei-Schritte-UI lebt auf
 * `/termin/{slug}` (eigenstaendige, escapte Seite). Block und Shortcode betten in
 * v1 nur eine Link-Karte ein (Foto, Name, Rolle, Terminarten, Button zur
 * Buchungsseite). So bleibt das Buchungs-UI an einer Stelle gepflegt, und der Block
 * bleibt no-build (kein Bundler, nur die WP-Editor-Globals). Der Shortcode
 * `[kurato_termin host="slug"]` rendert dieselbe Karte serverseitig.
 */
final class BookingBlock {

	private HostRepository $hosts;

	private BookingTypeRepository $types;

	/**
	 * @param HostRepository        $hosts Host-Repository.
	 * @param BookingTypeRepository $types Terminarten-Repository.
	 */
	public function __construct( HostRepository $hosts, BookingTypeRepository $types ) {
		$this->hosts = $hosts;
		$this->types = $types;
	}

	/**
	 * Registriert Block, Editor-Skript und Shortcode.
	 *
	 * @return void
	 */
	public function register(): void {
		add_action( 'init', array( $this, 'register_block' ) );
		add_shortcode( 'kurato_termin', array( $this, 'shortcode' ) );
	}

	/**
	 * Registriert den dynamischen Block (serverseitig gerendert).
	 *
	 * @return void
	 */
	public function register_block(): void {
		if ( ! function_exists( 'register_block_type' ) ) {
			return;
		}

		wp_register_script(
			'kurato-booking-block',
			KURATO_URL . 'assets/js/booking-block.js',
			array( 'wp-blocks', 'wp-element', 'wp-block-editor', 'wp-components', 'wp-i18n' ),
			KURATO_VERSION,
			true
		);
		if ( function_exists( 'wp_set_script_translations' ) ) {
			wp_set_script_translations( 'kurato-booking-block', 'kurato' );
		}

		register_block_type(
			'kurato/termin',
			array(
				'api_version'     => 2,
				'editor_script'   => 'kurato-booking-block',
				'attributes'      => array(
					'host' => array( 'type' => 'string', 'default' => '' ),
				),
				'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 {
		$slug = sanitize_title( (string) ( $attributes['host'] ?? '' ) );
		return $this->render_card( $slug );
	}

	/**
	 * Shortcode-Handler.
	 *
	 * @param array<string, mixed>|string $atts Shortcode-Attribute.
	 * @return string
	 */
	public function shortcode( $atts ): string {
		$atts = shortcode_atts( array( 'host' => '' ), is_array( $atts ) ? $atts : array(), 'kurato_termin' );
		return $this->render_card( sanitize_title( (string) $atts['host'] ) );
	}

	/**
	 * Baut die Link-Karte fuer einen Host-Slug. Ist der Slug leer, wird der erste
	 * aktive Host genommen (Free-Umfang = ein Host). Fehlt der Host oder ist er
	 * inaktiv, entsteht eine dezente Hinweiszeile (im Editor hilfreich).
	 *
	 * @param string $slug Host-Slug.
	 * @return string HTML.
	 */
	private function render_card( string $slug ): string {
		$host = '' !== $slug ? $this->hosts->get_by_slug( $slug ) : $this->first_active_host();
		if ( null === $host || empty( $host['active'] ) ) {
			return '<div class="kurato-termin-card kurato-termin-card--empty"><p>' . esc_html__( 'Keine Buchungsseite gefunden.', 'kurato' ) . '</p></div>';
		}

		$url   = BookingPage::booking_url( (string) $host['slug'] );
		$types = $this->types->for_host( (int) $host['id'], true );

		$out  = '<div class="kurato-termin-card" style="max-width:420px;border:1px solid #e2e2e2;border-radius:10px;padding:20px;font-family:Arial,Helvetica,sans-serif;">';

		$photo_id = ! empty( $host['photo_id'] ) ? (int) $host['photo_id'] : 0;
		if ( $photo_id > 0 && function_exists( 'wp_get_attachment_image' ) ) {
			$img = wp_get_attachment_image( $photo_id, array( 72, 72 ), false, array( 'style' => 'border-radius:50%;width:72px;height:72px;object-fit:cover;' ) );
			if ( '' !== $img ) {
				$out .= '<div style="margin-bottom:10px;">' . $img . '</div>';
			}
		}

		$out .= '<h3 style="margin:0 0 2px;font-size:18px;">' . esc_html( (string) $host['label'] ) . '</h3>';
		if ( '' !== (string) ( $host['role'] ?? '' ) ) {
			$out .= '<p style="margin:0 0 12px;color:#666;">' . esc_html( (string) $host['role'] ) . '</p>';
		}

		if ( array() !== $types ) {
			$out .= '<ul style="list-style:none;padding:0;margin:0 0 14px;color:#444;">';
			foreach ( $types as $type ) {
				$out .= '<li style="padding:2px 0;">' . esc_html( (string) $type['label'] )
					. ' <span style="color:#888;">' . esc_html( sprintf( /* translators: %d: Minuten */ __( '(%d Min.)', 'kurato' ), (int) $type['duration_min'] ) ) . '</span></li>';
			}
			$out .= '</ul>';
		}

		$out .= '<a href="' . esc_url( $url ) . '" style="display:inline-block;background:#1f6feb;color:#fff;border-radius:6px;padding:10px 18px;text-decoration:none;">'
			. esc_html__( 'Termin buchen', 'kurato' ) . '</a>';
		$out .= '</div>';

		return $out;
	}

	/**
	 * Erster aktiver Host (Free-Umfang = ein Host).
	 *
	 * @return array<string, mixed>|null
	 */
	private function first_active_host(): ?array {
		foreach ( $this->hosts->all() as $host ) {
			if ( ! empty( $host['active'] ) ) {
				return $host;
			}
		}
		return null;
	}
}
