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

namespace Hafenstudios\Leadlotse\Admin;

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

defined( 'ABSPATH' ) || exit;

/**
 * Admin-Seite "Anfragen" (Inbox, Etappe 4, UX-KONZEPT 3B und 4).
 *
 * Serverseitig gerendertes Grundgeruest (Statusfilter, Suche, Split-View aus
 * Liste und Detail-Panel), das die REST-API leadlotse/v1/entries per schlankem
 * Vanilla-JS konsumiert (D3, D8). Capability hs_view_entries reicht (Persona
 * Jonas: Anfragen bearbeiten ohne Einstellungen, D12).
 *
 * Das Detail-Panel bietet Statuswechsel (Neu / In Arbeit / Erledigt) und einen
 * Antworten-Knopf (mailto). Kein Kontaktverlauf, keine Wiedervorlage: das ist
 * bewusst die Mini-Inbox und der ehrliche Upgrade-Pfad zu Kurato (BAUPLAN 12).
 */
final class InboxPage {

	/**
	 * Ab wie vielen unbeantworteten Alt-Anfragen Hans einen Hinweis gibt.
	 */
	private const STALE_THRESHOLD = 3;

	/**
	 * Ab welchem Alter (Tage) eine offene Anfrage als "wartet" zaehlt.
	 */
	private const STALE_DAYS = 3;

	private EntryRepository $entries;

	private ?ParticipantsPage $participants;

	/**
	 * @param EntryRepository       $entries      Entry-Repository (Hans-Hinweis, Etappe 5).
	 * @param ParticipantsPage|null $participants Teilnehmer-Sicht fuer RSVP-Formulare (L-R1).
	 */
	public function __construct( EntryRepository $entries, ?ParticipantsPage $participants = null ) {
		$this->entries      = $entries;
		$this->participants = $participants;
	}

	/**
	 * Rendert das Grundgeruest der Inbox.
	 *
	 * @return void
	 */
	public function render(): void {
		if ( ! current_user_can( 'hs_view_entries' ) ) {
			wp_die( esc_html__( 'Sie haben keine Berechtigung, Anfragen einzusehen.', 'leadlotse' ) );
		}

		// Teilnehmer-Sicht (L-R1): ?ll_view=participants&form=N.
		// phpcs:disable WordPress.Security.NonceVerification.Recommended -- Nur Auswahl der Ansicht, keine Datenaenderung.
		if ( null !== $this->participants
			&& isset( $_GET['ll_view'] ) && 'participants' === sanitize_key( wp_unslash( $_GET['ll_view'] ) )
			&& isset( $_GET['form'] ) ) {
			$this->participants->render( absint( wp_unslash( $_GET['form'] ) ) );
			return;
		}
		// phpcs:enable

		echo '<div class="wrap hs-leadlotse-inbox">';
		echo '<h1 class="wp-heading-inline">' . esc_html__( 'Anfragen', 'leadlotse' ) . '</h1>';
		echo '<hr class="wp-header-end" />';

		$this->render_stale_hint();

		// Statusfilter (UX: Neu / In Arbeit / Erledigt, plus Alle).
		echo '<ul class="subsubsub hs-inbox-filter" role="tablist">';
		$this->filter_tab( '', __( 'Alle', 'leadlotse' ), true );
		$this->filter_tab( 'new', __( 'Neu', 'leadlotse' ), false );
		$this->filter_tab( 'in_progress', __( 'In Arbeit', 'leadlotse' ), false );
		$this->filter_tab( 'done', __( 'Erledigt', 'leadlotse' ), false );
		echo '</ul>';

		echo '<p class="search-box hs-inbox-search">';
		echo '<label class="screen-reader-text" for="hs-inbox-search-input">' . esc_html__( 'Anfragen durchsuchen', 'leadlotse' ) . '</label>';
		echo '<input type="search" id="hs-inbox-search-input" placeholder="' . esc_attr__( 'Nach Name oder E-Mail suchen', 'leadlotse' ) . '" />';
		echo '</p>';

		echo '<div class="hs-inbox-layout">';

		// Liste (wird per JS befuellt).
		echo '<div class="hs-inbox-list" id="hs-inbox-list" role="list" aria-live="polite" aria-busy="true">';
		echo '<p class="hs-inbox-loading">' . esc_html__( 'Anfragen werden geladen.', 'leadlotse' ) . '</p>';
		echo '</div>';

		// Detail-Panel.
		echo '<div class="hs-inbox-detail" id="hs-inbox-detail" aria-live="polite">';
		$this->render_detail_placeholder();
		echo '</div>';

		echo '</div>'; // .hs-inbox-layout
		echo '</div>'; // .wrap
	}

	/**
	 * Hans-Hinweis, wenn mehrere Anfragen zu lange unbeantwortet sind. Der
	 * Hinweis ist datengetrieben und nicht wegklickbar: er verschwindet von
	 * selbst, sobald die offenen Anfragen bearbeitet sind (UX-Ausloeser 3B).
	 *
	 * @return void
	 */
	private function render_stale_hint(): void {
		$stale = $this->entries->count_stale_new( self::STALE_DAYS );
		if ( $stale < self::STALE_THRESHOLD ) {
			return;
		}

		Core::instance()->hans()->card(
			array(
				'id'          => 'leadlotse-stale-entries',
				'motif'       => 28,
				'tone'        => 'warning',
				'dismissible' => false,
				'text'        => sprintf(
					/* translators: 1: Anzahl Anfragen, 2: Tage */
					_n(
						'%1$d Anfrage wartet seit mehr als %2$d Tagen auf eine Antwort. Ein kurzes Nachfassen macht oft den Unterschied.',
						'%1$d Anfragen warten seit mehr als %2$d Tagen auf eine Antwort. Ein kurzes Nachfassen macht oft den Unterschied.',
						$stale,
						'leadlotse'
					),
					$stale,
					self::STALE_DAYS
				),
			)
		);
	}

	/**
	 * Ein Statusfilter-Tab.
	 *
	 * @param string $status  Statuswert (leer = alle).
	 * @param string $label   Anzeigetext.
	 * @param bool   $current Ist das der aktive Tab beim ersten Laden?
	 * @return void
	 */
	private function filter_tab( string $status, string $label, bool $current ): void {
		echo '<li>';
		printf(
			'<a href="#" class="hs-inbox-filter-link%1$s" data-status="%2$s" role="tab" aria-selected="%3$s">%4$s</a>',
			$current ? ' current' : '',
			esc_attr( $status ),
			$current ? 'true' : 'false',
			esc_html( $label )
		);
		echo '</li>';
	}

	/**
	 * Leerer Platzhalter des Detail-Panels (Hans, ein Satz).
	 *
	 * @return void
	 */
	private function render_detail_placeholder(): void {
		$hans  = Core::instance()->hans();
		$image = $hans->is_enabled() ? $hans->image_url( 13 ) : '';

		echo '<div class="hs-inbox-detail-empty">';
		if ( '' !== $image ) {
			echo '<img src="' . esc_url( $image ) . '" alt="" width="120" height="120" loading="lazy" />';
		}
		echo '<p>' . esc_html__( 'Waehlen Sie links eine Anfrage aus, um die Details zu sehen.', 'leadlotse' ) . '</p>';
		echo '</div>';
	}
}
