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

namespace Hafenstudios\Leadlotse\Admin;

use Hafenstudios\Core\Core;
use Hafenstudios\Leadlotse\Db\EntryRepository;
use Hafenstudios\Leadlotse\Forms\FormPostType;

defined( 'ABSPATH' ) || exit;

/**
 * Admin-Seite "Formulare" (Etappe 3, Punkt 4).
 *
 * WP_List_Table-artige, serverseitig gerenderte Liste: Name, Zweck,
 * Status-Schild (UX-Grundsatz 5: gruen, wenn Einwilligung + Datenschutz-Link
 * konfiguriert sind), Einsendungen und Datum. Leerer Zustand mit Hans
 * (Motiv 20) und genau einem CTA (UX-Grundsatz 1 und 6).
 *
 * "Neues Formular" und die Formularnamen verlinken auf den Builder (Etappe 4b).
 */
final class FormsListPage {

	private EntryRepository $entries;

	private SetupChecklist $checklist;

	/**
	 * @param EntryRepository $entries   Entry-Repository (Einsendungen-Zahl).
	 * @param SetupChecklist  $checklist Einrichtungs-Checkliste (Etappe 5).
	 */
	public function __construct( EntryRepository $entries, SetupChecklist $checklist ) {
		$this->entries   = $entries;
		$this->checklist = $checklist;
	}

	/**
	 * Rendert die Seite.
	 *
	 * @return void
	 */
	public function render(): void {
		if ( ! current_user_can( 'hs_manage_forms' ) ) {
			wp_die( esc_html__( 'Sie haben keine Berechtigung, Formulare zu verwalten.', 'leadlotse' ) );
		}

		$paged = isset( $_GET['paged'] ) ? max( 1, absint( wp_unslash( $_GET['paged'] ) ) ) : 1; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Nur Lese-Pagination.

		$query = new \WP_Query(
			array(
				'post_type'      => FormPostType::POST_TYPE,
				'post_status'    => array( 'publish', 'draft' ),
				'posts_per_page' => 20,
				'paged'          => $paged,
				'orderby'        => 'date',
				'order'          => 'DESC',
			)
		);

		$new_form_url = BuilderPage::url( 0 );

		echo '<div class="wrap hs-leadlotse-forms">';
		echo '<h1 class="wp-heading-inline">' . esc_html__( 'Formulare', 'leadlotse' ) . '</h1>';

		if ( $query->have_posts() ) {
			echo ' <a href="' . esc_url( $new_form_url ) . '" class="page-title-action">' . esc_html__( 'Neues Formular', 'leadlotse' ) . '</a>';
			echo '<hr class="wp-header-end" />';
			$this->checklist->render();
			$this->render_table( $query->posts );
			$this->render_pagination( (int) $query->max_num_pages, $paged );
		} else {
			echo '<hr class="wp-header-end" />';
			$this->render_empty_state( $new_form_url );
		}

		echo '</div>';
	}

	/**
	 * Die Tabelle (WP-List-Table-Markup, ohne die Klasse selbst).
	 *
	 * @param array<int, \WP_Post> $posts Formulare.
	 * @return void
	 */
	private function render_table( array $posts ): void {
		$counts   = $this->entries->count_by_form();
		$purposes = $this->purpose_labels();

		echo '<table class="wp-list-table widefat fixed striped">';
		echo '<thead><tr>';
		echo '<th scope="col" class="column-primary">' . esc_html__( 'Name', 'leadlotse' ) . '</th>';
		echo '<th scope="col">' . esc_html__( 'Zweck', 'leadlotse' ) . '</th>';
		echo '<th scope="col">' . esc_html__( 'Status', 'leadlotse' ) . '</th>';
		echo '<th scope="col">' . esc_html__( 'Einsendungen', 'leadlotse' ) . '</th>';
		echo '<th scope="col">' . esc_html__( 'Datum', 'leadlotse' ) . '</th>';
		echo '</tr></thead><tbody>';

		foreach ( $posts as $post ) {
			$definition = FormPostType::get_definition( $post->ID );
			$purpose    = (string) ( $definition['purpose'] ?? '' );
			$edit_url   = BuilderPage::url( $post->ID );
			$count      = $counts[ $post->ID ] ?? 0;

			echo '<tr>';
			echo '<td class="column-primary"><strong><a href="' . esc_url( (string) $edit_url ) . '">' . esc_html( $post->post_title ) . '</a></strong>';
			if ( 'draft' === $post->post_status ) {
				echo ' <span class="post-state">' . esc_html__( 'Entwurf', 'leadlotse' ) . '</span>';
			}
			echo '<div class="row-actions"><span class="shortcode-hint"><code>[leadlotse id="' . esc_attr( (string) $post->ID ) . '"]</code></span>';
			// Teilnehmer-Sicht fuer Veranstaltungs-Formulare (L-R1).
			if ( ! empty( $definition['settings']['event']['enabled'] ) ) {
				echo ' | <span><a href="' . esc_url( ParticipantsPage::url( $post->ID ) ) . '">' . esc_html__( 'Teilnehmer', 'leadlotse' ) . '</a></span>';
			}
			echo '</div>';
			echo '</td>';
			echo '<td>' . esc_html( $purposes[ $purpose ] ?? ucfirst( $purpose ) ) . '</td>';
			echo '<td>' . $this->status_shield( $post, $definition ) . '</td>'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- status_shield escaped bereits.
			echo '<td>' . esc_html( number_format_i18n( $count ) ) . '</td>';
			echo '<td>' . esc_html( get_date_from_gmt( $post->post_date_gmt, get_option( 'date_format', 'd.m.Y' ) ) ) . '</td>';
			echo '</tr>';
		}

		echo '</tbody></table>';
	}

	/**
	 * Status-Schild laut UX-Grundsatz 5: Rechtssicherheit sichtbar machen.
	 * Farbe nie als einziger Traeger (Text steht dabei, UX-KONZEPT 7).
	 *
	 * Gruen: Formular veroeffentlicht, Einwilligungsfeld vorhanden und
	 * Datenschutz-Link konfiguriert (im Einwilligungstext oder als Seite in den
	 * Einstellungen). Gelb: Einwilligung unvollstaendig. Grau: Entwurf.
	 *
	 * @param \WP_Post                  $post       Formular.
	 * @param array<string, mixed>|null $definition Definition.
	 * @return string Escaptes HTML.
	 */
	private function status_shield( \WP_Post $post, ?array $definition ): string {
		if ( 'publish' !== $post->post_status ) {
			return '<span class="hs-shield hs-shield--grey">' . esc_html__( 'Entwurf', 'leadlotse' ) . '</span>';
		}

		$has_consent  = false;
		$consent_link = false;
		foreach ( (array) ( $definition['fields'] ?? array() ) as $field ) {
			if ( is_array( $field ) && 'consent' === (string) ( $field['type'] ?? '' ) ) {
				$has_consent = true;
				if ( false !== stripos( (string) ( $field['consent_text'] ?? '' ), 'http' ) ) {
					$consent_link = true;
				}
				break;
			}
		}

		$privacy_page = absint( Core::instance()->settings( 'leadlotse' )->get( 'privacy.page_id', 0 ) );

		if ( $has_consent && ( $consent_link || $privacy_page > 0 ) ) {
			return '<span class="hs-shield hs-shield--green">' . esc_html__( 'Rechtssicher konfiguriert', 'leadlotse' ) . '</span>';
		}
		if ( $has_consent ) {
			return '<span class="hs-shield hs-shield--amber">' . esc_html__( 'Datenschutz-Link fehlt', 'leadlotse' ) . '</span>';
		}
		return '<span class="hs-shield hs-shield--amber">' . esc_html__( 'Einwilligung fehlt', 'leadlotse' ) . '</span>';
	}

	/**
	 * Willkommens-Screen beim Erststart (UX-KONZEPT 3A): Hans (Motiv 30), ein
	 * Satz Nutzen, genau ein CTA (UX-Grundsatz 1 und 6). Ersetzt den leeren
	 * Zustand, solange noch kein Formular existiert.
	 *
	 * @param string $new_form_url Ziel des CTA.
	 * @return void
	 */
	private function render_empty_state( string $new_form_url ): void {
		$hans  = Core::instance()->hans();
		$image = $hans->is_enabled() ? $hans->image_url( 30 ) : '';

		echo '<div class="hs-leadlotse-empty">';
		if ( '' !== $image ) {
			echo '<img src="' . esc_url( $image ) . '" alt="" width="160" height="160" loading="lazy" />';
		}
		echo '<h2>' . esc_html__( 'Willkommen an Bord', 'leadlotse' ) . '</h2>';
		echo '<p>' . esc_html__( 'Ihr erstes Formular ist in wenigen Minuten live und bringt Anfragen sicher in den Hafen. Waehlen Sie einen Zweck, den Rest uebernimmt der Lotse.', 'leadlotse' ) . '</p>';
		echo '<p><a href="' . esc_url( $new_form_url ) . '" class="button button-primary button-hero">' . esc_html__( 'Erstes Formular erstellen', 'leadlotse' ) . '</a></p>';
		echo '</div>';
	}

	/**
	 * Einfache Seitennavigation.
	 *
	 * @param int $total_pages Gesamtseiten.
	 * @param int $current     Aktuelle Seite.
	 * @return void
	 */
	private function render_pagination( int $total_pages, int $current ): void {
		if ( $total_pages <= 1 ) {
			return;
		}
		$links = paginate_links(
			array(
				'base'    => add_query_arg( 'paged', '%#%' ),
				'format'  => '',
				'current' => $current,
				'total'   => $total_pages,
			)
		);
		if ( $links ) {
			echo '<div class="tablenav"><div class="tablenav-pages">' . wp_kses_post( $links ) . '</div></div>';
		}
	}

	/**
	 * Anzeigenamen der Zweck-Vorlagen.
	 *
	 * @return array<string, string>
	 */
	private function purpose_labels(): array {
		return array(
			'contact'      => __( 'Kontakt', 'leadlotse' ),
			'consultation' => __( 'Beratungsgespraech', 'leadlotse' ),
			'inquiry'      => __( 'Anfrage', 'leadlotse' ),
			'newsletter'   => __( 'Newsletter-Anmeldung', 'leadlotse' ),
			'download'     => __( 'Download', 'leadlotse' ),
			'callback'     => __( 'Rueckruf', 'leadlotse' ),
			'quote'        => __( 'Angebot', 'leadlotse' ),
			'event'        => __( 'Event', 'leadlotse' ),
			'event_rsvp'   => __( 'Veranstaltungs-Anmeldung', 'leadlotse' ),
		);
	}
}
