<?php
/**
 * Content-oriented section builders for wp-agent/upsert-pattern.
 *
 * @package WPAgentCompanion
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Testimonials: vollbreites Band, H2 plus optionale Subheading und ein Karten-
 * Raster aus Kundenstimmen. Pro Stimme: Zitat (in deutschen Anführungszeichen),
 * Name (H4) und optionale Rolle/Firma.
 */
function wpagent_pattern_build_testimonials( array $section ): string {
	$section_bg   = wpagent_pattern_pick_color( $section, 'backgroundColor', array( 'base', 'background', 'base-2' ) );
	$section_text = wpagent_pattern_pick_color( $section, 'textColor' );
	$card_bg      = wpagent_pattern_default_color(
		array( 'accent-5', 'base-2', 'tertiary', 'base', 'background' ),
		$section_bg
	);
	$muted_color  = '' !== $section_text ? '' : wpagent_pattern_muted_color();
	$border_color = wpagent_pattern_border_color();
	$card_text    = '' !== $card_bg ? wpagent_pattern_card_text_color( $card_bg ) : '';

	$inner = array();
	$heading = (string) ( $section['heading'] ?? '' );
	if ( '' !== trim( $heading ) ) {
		$inner[] = wpagent_pattern_block_heading( $heading, 2, 'x-large', 'center' );
	}
	$sub = (string) ( $section['subheading'] ?? '' );
	if ( '' !== trim( $sub ) ) {
		$inner[] = wpagent_pattern_block_paragraph( $sub, 'medium', 'center', $muted_color );
	}

	$items = isset( $section['items'] ) && is_array( $section['items'] ) ? $section['items'] : array();
	$cards = array();
	foreach ( $items as $item ) {
		if ( ! is_array( $item ) ) {
			continue;
		}
		$card_inner = array();
		$quote      = trim( (string) ( $item['text'] ?? '' ) );
		if ( '' !== $quote ) {
			$card_inner[] = wpagent_pattern_block_paragraph( '„' . $quote . '“', 'medium' );
		}
		$name = trim( (string) ( $item['title'] ?? '' ) );
		if ( '' !== $name ) {
			$card_inner[] = wpagent_pattern_block_heading( $name, 4, 'medium' );
		}
		$role = trim( (string) ( $item['role'] ?? '' ) );
		if ( '' !== $role ) {
			$card_inner[] = wpagent_pattern_block_paragraph( $role, 'small', '', $muted_color );
		}

		if ( array() === $card_inner ) {
			continue;
		}

		$cards[] = wpagent_pattern_group(
			implode( "\n\n", $card_inner ),
			array(
				'backgroundColor' => $card_bg,
				'textColor'       => $card_text,
				'borderColor'     => $border_color,
				'borderWidth'     => '1px',
				'radius'          => '12px',
				'padding'         => array( 'top' => '40', 'right' => '40', 'bottom' => '40', 'left' => '40' ),
				'blockGap'        => '20',
				'layout'          => array( 'type' => 'constrained' ),
			)
		);
	}

	if ( array() !== $cards ) {
		$inner[] = wpagent_pattern_group(
			implode( "\n\n", $cards ),
			array(
				'align'    => 'wide',
				'blockGap' => '40',
				'layout'   => array( 'type' => 'grid', 'minimumColumnWidth' => '18rem' ),
			)
		);
	}

	return wpagent_pattern_group(
		implode( "\n\n", $inner ),
		array(
			'align'           => 'full',
			'backgroundColor' => $section_bg,
			'textColor'       => $section_text,
			'padding'         => array( 'top' => '70', 'right' => '40', 'bottom' => '70', 'left' => '40' ),
			'blockGap'        => '50',
			'layout'          => array( 'type' => 'constrained' ),
		)
	);
}

/**
 * FAQ: vollbreites Band mit zentriertem H2 (x-large) plus optionaler Subheading und
 * einem gestapelten Akkordeon. Jedes Frage-Antwort-Paar (items[]: title = Frage
 * (Pflicht), text = Antwort) wird zu einem core/details-Block: die Frage steht roh im
 * <summary>, die Antwort ist ein core/paragraph. Ist core/details im aktiven WordPress
 * nicht registriert (ältere Installationen), degradiert die Sektion sauber zu je einem
 * bordierten core/group pro Q&A mit H3 (Frage) und Absatz (Antwort). In beiden Fällen
 * entstehen 0 freeform. Das Akkordeon liegt in einem eigenen constrained core/group mit
 * enger blockGap, damit die Einträge als zusammenhängende Liste lesen.
 */
function wpagent_pattern_build_faq( array $section ): string {
	$section_bg   = wpagent_pattern_pick_color( $section, 'backgroundColor', array( 'base', 'background', 'base-2' ) );
	$section_text = wpagent_pattern_pick_color( $section, 'textColor' );
	$muted_color  = '' !== $section_text ? '' : wpagent_pattern_muted_color();

	$inner   = array();
	$heading = (string) ( $section['heading'] ?? '' );
	if ( '' !== trim( $heading ) ) {
		$inner[] = wpagent_pattern_block_heading( $heading, 2, 'x-large', 'center' );
	}
	$sub = (string) ( $section['subheading'] ?? '' );
	if ( '' !== trim( $sub ) ) {
		$inner[] = wpagent_pattern_block_paragraph( $sub, 'medium', 'center', $muted_color );
	}

	// core/details erst ab neueren WordPress-Versionen vorhanden; sauberer Fallback sonst.
	$has_details = class_exists( 'WP_Block_Type_Registry' )
		&& WP_Block_Type_Registry::get_instance()->is_registered( 'core/details' );

	$items        = isset( $section['items'] ) && is_array( $section['items'] ) ? $section['items'] : array();
	$entries      = array();
	$border_color = wpagent_pattern_border_color();
	foreach ( $items as $item ) {
		if ( ! is_array( $item ) ) {
			continue;
		}
		$question = trim( (string) ( $item['title'] ?? '' ) );
		if ( '' === $question ) {
			continue; // Frage ist Pflicht; ohne sie kein Akkordeon-Eintrag.
		}
		$answer = trim( (string) ( $item['text'] ?? '' ) );

		if ( $has_details ) {
			$answer_block = '' !== $answer ? wpagent_pattern_block_paragraph( $answer, 'medium' ) : '';
			$entries[]    = wpagent_pattern_block_details( $question, $answer_block );
			continue;
		}

		// Fallback ohne core/details: ein bordierter core/group je Q&A.
		$card_inner = array( wpagent_pattern_block_heading( $question, 3, 'large' ) );
		if ( '' !== $answer ) {
			$card_inner[] = wpagent_pattern_block_paragraph( $answer, 'medium', '', $muted_color );
		}
		$entries[] = wpagent_pattern_group(
			implode( "\n\n", $card_inner ),
			array(
				'borderColor' => $border_color,
				'borderWidth' => '1px',
				'radius'      => '12px',
				'padding'     => array( 'top' => '30', 'right' => '40', 'bottom' => '30', 'left' => '40' ),
				'blockGap'    => '16',
				'layout'      => array( 'type' => 'constrained' ),
			)
		);
	}

	if ( array() !== $entries ) {
		$inner[] = wpagent_pattern_group(
			implode( "\n\n", $entries ),
			array(
				'blockGap' => '16',
				'layout'   => array( 'type' => 'constrained' ),
			)
		);
	}

	return wpagent_pattern_group(
		implode( "\n\n", $inner ),
		array(
			'align'           => 'full',
			'backgroundColor' => $section_bg,
			'textColor'       => $section_text,
			'padding'         => array( 'top' => '70', 'right' => '40', 'bottom' => '70', 'left' => '40' ),
			'blockGap'        => '40',
			'layout'          => array( 'type' => 'constrained' ),
		)
	);
}

/**
 * Stats: vollbreites Band mit zentriertem H2 (x-large) plus optionaler Subheading und
 * einem responsiven Grid (core/group layout grid, wie die Karten-Grids) aus KPI-Kacheln.
 * Jede Kachel (items[]: title = grosse Kennzahl (Pflicht), text = Label, optional
 * subheading = kleiner Zusatz) ist schlicht und mittig OHNE Rahmen oder Karten-
 * Hintergrund: die Kennzahl als core/heading (H3, xx-large, zentriert), das Label als
 * core/paragraph (medium, zentriert, gedämpft) und der optionale Zusatz als kleiner,
 * gedämpfter Absatz. Nur der Grid-Abstand trennt die Kacheln.
 */
function wpagent_pattern_build_stats( array $section ): string {
	$section_bg   = wpagent_pattern_pick_color( $section, 'backgroundColor', array( 'base', 'background', 'base-2' ) );
	$section_text = wpagent_pattern_pick_color( $section, 'textColor' );
	$muted_color  = '' !== $section_text ? '' : wpagent_pattern_muted_color();

	$inner   = array();
	$heading = (string) ( $section['heading'] ?? '' );
	if ( '' !== trim( $heading ) ) {
		$inner[] = wpagent_pattern_block_heading( $heading, 2, 'x-large', 'center' );
	}
	$sub = (string) ( $section['subheading'] ?? '' );
	if ( '' !== trim( $sub ) ) {
		$inner[] = wpagent_pattern_block_paragraph( $sub, 'medium', 'center', $muted_color );
	}

	$items = isset( $section['items'] ) && is_array( $section['items'] ) ? $section['items'] : array();
	$tiles = array();
	foreach ( $items as $item ) {
		if ( ! is_array( $item ) ) {
			continue;
		}
		$tile_inner = array();
		// Optionales Icon oben in der Kachel (über der Kennzahl). Leerer/unbekannter
		// Name liefert '' und wird übersprungen.
		$icon = trim( (string) ( $item['icon'] ?? '' ) );
		if ( '' !== $icon ) {
			$icon_block = wpagent_pattern_block_icon( $icon );
			if ( '' !== $icon_block ) {
				$tile_inner[] = $icon_block;
			}
		}
		$number = trim( (string) ( $item['title'] ?? '' ) );
		if ( '' !== $number ) {
			$tile_inner[] = wpagent_pattern_block_heading( $number, 3, 'xx-large', 'center' );
		}
		$label = trim( (string) ( $item['text'] ?? '' ) );
		if ( '' !== $label ) {
			$tile_inner[] = wpagent_pattern_block_paragraph( $label, 'medium', 'center', $muted_color );
		}
		$extra = trim( (string) ( $item['subheading'] ?? '' ) );
		if ( '' !== $extra ) {
			$tile_inner[] = wpagent_pattern_block_paragraph( $extra, 'small', 'center', $muted_color );
		}

		if ( array() === $tile_inner ) {
			continue;
		}

		// Schlichte, mittige Kachel ohne Hintergrund/Rahmen: nur ein constrained group.
		$tiles[] = wpagent_pattern_group(
			implode( "\n\n", $tile_inner ),
			array(
				'blockGap' => '10',
				'layout'   => array( 'type' => 'constrained' ),
			)
		);
	}

	if ( array() !== $tiles ) {
		$inner[] = wpagent_pattern_group(
			implode( "\n\n", $tiles ),
			array(
				'align'    => 'wide',
				'blockGap' => '40',
				'layout'   => array( 'type' => 'grid', 'minimumColumnWidth' => '14rem' ),
			)
		);
	}

	return wpagent_pattern_group(
		implode( "\n\n", $inner ),
		array(
			'align'           => 'full',
			'backgroundColor' => $section_bg,
			'textColor'       => $section_text,
			'padding'         => array( 'top' => '70', 'right' => '40', 'bottom' => '70', 'left' => '40' ),
			'blockGap'        => '50',
			'layout'          => array( 'type' => 'constrained' ),
		)
	);
}

/**
 * Gallery: vollbreites Band mit optionalem zentriertem H2 (x-large) plus optionaler
 * Subheading und darunter einer core/gallery aus items[].image_url (+ image_alt).
 * Die Spaltenzahl leitet sich aus der Bildanzahl ab (min(Anzahl, 3), clamp 1..6),
 * damit kleine Galerien nicht künstlich gestreckt werden. Ohne gültige Bilder
 * degradiert die Sektion sauber zum reinen Textband (oder, ganz ohne Inhalt, zu
 * einem leeren, aber validen core/group). In beiden Fällen entstehen 0 freeform.
 */
function wpagent_pattern_build_gallery( array $section ): string {
	$section_bg   = wpagent_pattern_pick_color( $section, 'backgroundColor' );
	$section_text = wpagent_pattern_pick_color( $section, 'textColor' );
	$muted_color  = '' !== $section_text ? '' : wpagent_pattern_muted_color();

	$inner   = array();
	$heading = (string) ( $section['heading'] ?? '' );
	if ( '' !== trim( $heading ) ) {
		$inner[] = wpagent_pattern_block_heading( $heading, 2, 'x-large', 'center' );
	}
	$sub = (string) ( $section['subheading'] ?? '' );
	if ( '' !== trim( $sub ) ) {
		$inner[] = wpagent_pattern_block_paragraph( $sub, 'medium', 'center', $muted_color );
	}

	$items  = isset( $section['items'] ) && is_array( $section['items'] ) ? $section['items'] : array();
	$images = array();
	foreach ( $items as $item ) {
		if ( ! is_array( $item ) ) {
			continue;
		}
		$url = trim( (string) ( $item['image_url'] ?? '' ) );
		if ( '' === $url ) {
			continue;
		}
		$alt      = trim( (string) ( $item['image_alt'] ?? ( $item['title'] ?? '' ) ) );
		$images[] = array( 'url' => $url, 'alt' => $alt );
	}

	if ( array() !== $images ) {
		$columns = max( 1, min( 3, count( $images ) ) );
		$gallery = wpagent_pattern_block_gallery( $images, $columns );
		if ( '' !== $gallery ) {
			$inner[] = $gallery;
		}
	}

	return wpagent_pattern_group(
		implode( "\n\n", $inner ),
		array(
			'align'           => 'full',
			'backgroundColor' => $section_bg,
			'textColor'       => $section_text,
			'padding'         => array( 'top' => '70', 'right' => '40', 'bottom' => '70', 'left' => '40' ),
			'blockGap'        => '40',
			'layout'          => array( 'type' => 'constrained' ),
		)
	);
}

/**
 * Steps: vollbreites Band mit zentriertem H2 (x-large) plus optionaler Subheading und
 * einem responsiven Grid (core/group layout grid, wie stats/features) aus nummerierten
 * Prozess-Kacheln. Jede Kachel (items[]: title = Schritt-Titel, text = Beschreibung)
 * trägt eine große, fortlaufende Schrittnummer als core/heading (H3, xx-large,
 * zentriert), darunter den Titel als core/heading (H4, large, zentriert) und darunter die
 * Beschreibung als gedämpften core/paragraph (medium, zentriert). Die Nummer wird
 * serverseitig 1-basiert hochgezählt und nur für tatsächlich gerenderte Kacheln
 * vergeben (Kacheln ohne Titel UND ohne Text werden übersprungen), damit die
 * Nummerierung lückenlos bleibt. Nur bestehende Core-Block-Helfer, kein neuer Blocktyp:
 * 0 freeform.
 */
function wpagent_pattern_build_steps( array $section ): string {
	$section_bg   = wpagent_pattern_pick_color( $section, 'backgroundColor' );
	$section_text = wpagent_pattern_pick_color( $section, 'textColor' );
	$muted_color  = '' !== $section_text ? '' : wpagent_pattern_muted_color();

	$inner   = array();
	$heading = (string) ( $section['heading'] ?? '' );
	if ( '' !== trim( $heading ) ) {
		$inner[] = wpagent_pattern_block_heading( $heading, 2, 'x-large', 'center' );
	}
	$sub = (string) ( $section['subheading'] ?? '' );
	if ( '' !== trim( $sub ) ) {
		$inner[] = wpagent_pattern_block_paragraph( $sub, 'medium', 'center', $muted_color );
	}

	$items       = isset( $section['items'] ) && is_array( $section['items'] ) ? $section['items'] : array();
	$tiles       = array();
	$step_number = 0;
	foreach ( $items as $item ) {
		if ( ! is_array( $item ) ) {
			continue;
		}
		$title = trim( (string) ( $item['title'] ?? '' ) );
		$text  = trim( (string) ( $item['text'] ?? '' ) );
		if ( '' === $title && '' === $text ) {
			continue; // Leere Kachel überspringen, damit die Nummerierung nicht springt.
		}

		$step_number++;
		$tile_inner = array();
		// Optionales Icon oben in der Kachel (über der Schrittnummer). Leerer/unbekannter
		// Name liefert '' und wird übersprungen.
		$icon = trim( (string) ( $item['icon'] ?? '' ) );
		if ( '' !== $icon ) {
			$icon_block = wpagent_pattern_block_icon( $icon );
			if ( '' !== $icon_block ) {
				$tile_inner[] = $icon_block;
			}
		}
		$tile_inner[] = wpagent_pattern_block_heading( (string) $step_number, 3, 'xx-large', 'center' );
		if ( '' !== $title ) {
			$tile_inner[] = wpagent_pattern_block_heading( $title, 4, 'large', 'center' );
		}
		if ( '' !== $text ) {
			$tile_inner[] = wpagent_pattern_block_paragraph( $text, 'medium', 'center', $muted_color );
		}

		// Schlichte, mittige Kachel ohne Rahmen/Hintergrund: nur ein constrained group.
		$tiles[] = wpagent_pattern_group(
			implode( "\n\n", $tile_inner ),
			array(
				'blockGap' => '10',
				'layout'   => array( 'type' => 'constrained' ),
			)
		);
	}

	if ( array() !== $tiles ) {
		$inner[] = wpagent_pattern_group(
			implode( "\n\n", $tiles ),
			array(
				'align'    => 'wide',
				'blockGap' => '40',
				'layout'   => array( 'type' => 'grid', 'minimumColumnWidth' => '16rem' ),
			)
		);
	}

	return wpagent_pattern_group(
		implode( "\n\n", $inner ),
		array(
			'align'           => 'full',
			'backgroundColor' => $section_bg,
			'textColor'       => $section_text,
			'padding'         => array( 'top' => '70', 'right' => '40', 'bottom' => '70', 'left' => '40' ),
			'blockGap'        => '50',
			'layout'          => array( 'type' => 'constrained' ),
		)
	);
}

/**
 * Comparison: vollbreites Band mit zentriertem H2 (x-large) plus optionaler Subheading und
 * einer core/table (Vergleichstabelle). section['columns'] sind die Spalten-Überschriften
 * (erste Spalte = Zeilen-Label, weitere = Vergleichsobjekte). section['items'] sind die
 * Zeilen; jede Zeile { label, values: [..] } wird zu einer tbody-Zeile aus dem Label-<td>
 * plus je einem Wert-<td>. Die Tabelle rendert wpagent_pattern_block_table (kanonische
 * core/table-Serialisierung). Ohne Spalten UND ohne Zeilen degradiert die Sektion sauber
 * zum reinen Textband. 0 freeform.
 */
function wpagent_pattern_build_comparison( array $section ): string {
	$section_bg   = wpagent_pattern_pick_color( $section, 'backgroundColor' );
	$section_text = wpagent_pattern_pick_color( $section, 'textColor' );
	$muted_color  = '' !== $section_text ? '' : wpagent_pattern_muted_color();

	$inner   = array();
	$heading = (string) ( $section['heading'] ?? '' );
	if ( '' !== trim( $heading ) ) {
		$inner[] = wpagent_pattern_block_heading( $heading, 2, 'x-large', 'center' );
	}
	$sub = (string) ( $section['subheading'] ?? '' );
	if ( '' !== trim( $sub ) ) {
		$inner[] = wpagent_pattern_block_paragraph( $sub, 'medium', 'center', $muted_color );
	}

	$columns = isset( $section['columns'] ) && is_array( $section['columns'] )
		? array_map( static fn( $c ) => (string) $c, array_values( $section['columns'] ) )
		: array();
	$rows = isset( $section['items'] ) && is_array( $section['items'] ) ? $section['items'] : array();

	$table = wpagent_pattern_block_table( $columns, $rows );
	if ( '' !== $table ) {
		$inner[] = $table;
	}

	return wpagent_pattern_group(
		implode( "\n\n", $inner ),
		array(
			'align'           => 'full',
			'backgroundColor' => $section_bg,
			'textColor'       => $section_text,
			'padding'         => array( 'top' => '70', 'right' => '40', 'bottom' => '70', 'left' => '40' ),
			'blockGap'        => '40',
			'layout'          => array( 'type' => 'constrained' ),
		)
	);
}
