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

namespace Hafenstudios\Leadlotse\Admin;

use Hafenstudios\Leadlotse\Support\ProFeatures;
use Hafenstudios\Leadlotse\Templates\PurposeTemplates;

defined( 'ABSPATH' ) || exit;

/**
 * Top-Level-Menue "Leadlotse" im WP-Admin.
 *
 * Serverseitig gerenderte Admin-Seiten mit progressive-enhancement-JS (D3):
 * Formulare (Etappe 3) und Anfragen/Inbox (Etappe 4). Der Builder haengt sich
 * ueber eine versteckte Seite an (Etappe 4b). Assets werden screen-gezielt
 * geladen (admin.css ueberall im Leadlotse-Bereich, inbox.js nur in der Inbox).
 */
final class Menu {

	public const MENU_SLUG  = 'leadlotse';
	public const INBOX_SLUG = 'leadlotse-inbox';

	private FormsListPage $forms_page;

	private InboxPage $inbox_page;

	private BuilderPage $builder_page;

	private IdentityPage $identity_page;

	private MailSenderPage $mail_page;

	/**
	 * Hook-Suffixe der eigenen Seiten (fuer gezieltes Asset-Enqueue).
	 *
	 * @var array<string, string>
	 */
	private array $hooks = array();

	/**
	 * @param FormsListPage $forms_page    Formularliste.
	 * @param InboxPage     $inbox_page    Inbox.
	 * @param BuilderPage   $builder_page  Builder.
	 * @param IdentityPage   $identity_page Ausfuellhilfe-Einstellungen.
	 * @param MailSenderPage $mail_page     Mail-Absender-Einstellungen.
	 */
	public function __construct( FormsListPage $forms_page, InboxPage $inbox_page, BuilderPage $builder_page, IdentityPage $identity_page, MailSenderPage $mail_page ) {
		$this->forms_page    = $forms_page;
		$this->inbox_page    = $inbox_page;
		$this->builder_page  = $builder_page;
		$this->identity_page = $identity_page;
		$this->mail_page     = $mail_page;
	}

	/**
	 * Registriert die Admin-Hooks.
	 *
	 * @return void
	 */
	public function register(): void {
		add_action( 'admin_menu', array( $this, 'register_menu' ) );
		add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_assets' ) );
	}

	/**
	 * Baut das Menue auf.
	 *
	 * @return void
	 */
	public function register_menu(): void {
		$this->hooks['forms'] = (string) add_menu_page(
			__( 'Leadlotse', 'leadlotse' ),
			__( 'Leadlotse', 'leadlotse' ),
			'hs_manage_forms',
			self::MENU_SLUG,
			array( $this->forms_page, 'render' ),
			'dashicons-feedback',
			58
		);

		add_submenu_page(
			self::MENU_SLUG,
			__( 'Formulare', 'leadlotse' ),
			__( 'Formulare', 'leadlotse' ),
			'hs_manage_forms',
			self::MENU_SLUG,
			array( $this->forms_page, 'render' )
		);

		$this->hooks['inbox'] = (string) add_submenu_page(
			self::MENU_SLUG,
			__( 'Anfragen', 'leadlotse' ),
			__( 'Anfragen', 'leadlotse' ),
			'hs_view_entries',
			self::INBOX_SLUG,
			array( $this->inbox_page, 'render' )
		);

		$this->hooks['identity'] = (string) add_submenu_page(
			self::MENU_SLUG,
			__( 'Ausfuellhilfe', 'leadlotse' ),
			__( 'Ausfuellhilfe', 'leadlotse' ),
			'hs_manage_settings',
			IdentityPage::SLUG,
			array( $this->identity_page, 'render' )
		);

		$this->hooks['mail'] = (string) add_submenu_page(
			self::MENU_SLUG,
			__( 'Mail-Absender', 'leadlotse' ),
			__( 'Mail-Absender', 'leadlotse' ),
			'hs_manage_settings',
			MailSenderPage::SLUG,
			array( $this->mail_page, 'render' )
		);

		// Versteckte Builder-Seite (Ziel von "Neues Formular" und "Bearbeiten").
		$this->hooks['builder'] = (string) add_submenu_page(
			'',
			__( 'Formular bearbeiten', 'leadlotse' ),
			__( 'Formular bearbeiten', 'leadlotse' ),
			'hs_manage_forms',
			BuilderPage::SLUG,
			array( $this->builder_page, 'render' )
		);
	}

	/**
	 * Laedt Admin-Assets gezielt je Screen.
	 *
	 * @param string $hook Aktueller Admin-Hook-Suffix.
	 * @return void
	 */
	public function enqueue_assets( string $hook ): void {
		$own = in_array( $hook, $this->hooks, true );
		if ( ! $own ) {
			return;
		}

		wp_enqueue_style(
			'leadlotse-admin',
			LEADLOTSE_URL . 'assets/css/admin.css',
			array(),
			LEADLOTSE_VERSION
		);

		if ( isset( $this->hooks['inbox'] ) && $hook === $this->hooks['inbox'] ) {
			$this->enqueue_inbox();
		}

		if ( isset( $this->hooks['builder'] ) && $hook === $this->hooks['builder'] ) {
			$this->enqueue_builder();
		}
	}

	/**
	 * Inbox-Skript samt lokalisierter Konfiguration.
	 *
	 * @return void
	 */
	private function enqueue_inbox(): void {
		wp_enqueue_script(
			'leadlotse-inbox',
			LEADLOTSE_URL . 'assets/js/inbox.js',
			array(),
			LEADLOTSE_VERSION,
			true
		);

		wp_localize_script(
			'leadlotse-inbox',
			'leadlotseInbox',
			array(
				'restBase'      => esc_url_raw( rest_url( 'leadlotse/v1' ) ),
				'nonce'         => wp_create_nonce( 'wp_rest' ),
				'statusLabels'  => array(
					'new'         => __( 'Neu', 'leadlotse' ),
					'in_progress' => __( 'In Arbeit', 'leadlotse' ),
					'done'        => __( 'Erledigt', 'leadlotse' ),
				),
				'purposeLabels' => 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' ),
				),
				'i18n'          => array(
					'entry'       => __( 'Anfrage', 'leadlotse' ),
					'noEntries'   => __( 'Noch keine Anfragen. Sobald Ihr Formular Anfragen erhaelt, erscheinen sie hier.', 'leadlotse' ),
					'loadError'   => __( 'Die Anfragen konnten nicht geladen werden. Bitte laden Sie die Seite neu.', 'leadlotse' ),
					'statusError' => __( 'Der Status konnte nicht gespeichert werden. Bitte versuchen Sie es erneut.', 'leadlotse' ),
					'statusLabel' => __( 'Status der Anfrage', 'leadlotse' ),
					'source'      => __( 'Quelle', 'leadlotse' ),
					'reply'       => __( 'Antworten', 'leadlotse' ),
					'prev'        => __( 'Zurueck', 'leadlotse' ),
					'next'        => __( 'Weiter', 'leadlotse' ),
					'waOptin'     => __( 'WhatsApp-Antwort erlaubt', 'leadlotse' ),
					'idVerified'  => __( 'E-Mail bestaetigt ueber %s', 'leadlotse' ),
				),
			)
		);
	}

	/**
	 * Builder-Skript (No-Build-React, D13) samt Konfiguration und Vorlagen.
	 *
	 * @return void
	 */
	private function enqueue_builder(): void {
		wp_enqueue_script(
			'leadlotse-builder',
			LEADLOTSE_URL . 'assets/js/builder.js',
			array( 'wp-element' ),
			LEADLOTSE_VERSION,
			true
		);
		wp_set_script_translations( 'leadlotse-builder', 'leadlotse' );

		$form_id = isset( $_GET['form'] ) ? absint( wp_unslash( $_GET['form'] ) ) : 0; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Nur Auswahl der zu ladenden Ressource, Schreibzugriff laeuft ueber die nonce-geschuetzte REST-API.

		wp_localize_script(
			'leadlotse-builder',
			'leadlotseBuilder',
			array(
				'restBase'       => esc_url_raw( rest_url( 'leadlotse/v1' ) ),
				'nonce'          => wp_create_nonce( 'wp_rest' ),
				'formId'         => $form_id,
				'listUrl'        => admin_url( 'admin.php?page=' . self::MENU_SLUG ),
				'builderBaseUrl' => admin_url( 'admin.php?page=' . BuilderPage::SLUG ),
				'fieldTypes'     => $this->field_types(),
				'gallery'        => BuilderPage::gallery(),
				'templates'      => $this->template_definitions(),
				'i18n'           => $this->builder_i18n(),
				// Pro-Schnitt (L-P1): der Builder zeigt gesperrte Flaechen mit
				// Schloss-Schild. Verbindlich ist der Server (FormsController).
				'pro'            => ProFeatures::enabled(),
				'proCard'        => ProFeatures::card_for_user(),
				'proMessages'    => array(
					'event'    => ProFeatures::message( 'event' ),
					'whatsapp' => ProFeatures::message( 'whatsapp' ),
					'identity' => ProFeatures::message( 'identity' ),
				),
				'dismissUrl'     => esc_url_raw( rest_url( 'hafenstudios/v1/hans/dismiss' ) ),
			)
		);
	}

	/**
	 * Feldtypen fuer das Add-Menue (addable steuert die Sichtbarkeit).
	 *
	 * @return array<int, array<string, mixed>>
	 */
	private function field_types(): array {
		return array(
			array( 'key' => 'text', 'label' => __( 'Text', 'leadlotse' ), 'addable' => true ),
			array( 'key' => 'email', 'label' => __( 'E-Mail', 'leadlotse' ), 'addable' => true ),
			array( 'key' => 'phone', 'label' => __( 'Telefon', 'leadlotse' ), 'addable' => true ),
			array( 'key' => 'number', 'label' => __( 'Zahl', 'leadlotse' ), 'addable' => true ),
			array( 'key' => 'textarea', 'label' => __( 'Textfeld', 'leadlotse' ), 'addable' => true ),
			array( 'key' => 'select', 'label' => __( 'Auswahl', 'leadlotse' ), 'addable' => true ),
			array( 'key' => 'checkbox', 'label' => __( 'Checkbox', 'leadlotse' ), 'addable' => true ),
			array( 'key' => 'date', 'label' => __( 'Datum', 'leadlotse' ), 'addable' => true ),
			array( 'key' => 'consent', 'label' => __( 'Einwilligung', 'leadlotse' ), 'addable' => true ),
			array( 'key' => 'hidden', 'label' => __( 'Verstecktes Feld', 'leadlotse' ), 'addable' => false ),
		);
	}

	/**
	 * Vorlagen-Definitionen fuer beide Sprachen (Startwerte fuer neue Formulare).
	 *
	 * @return array<string, array<string, mixed>>
	 */
	private function template_definitions(): array {
		$out = array( 'de' => array(), 'en' => array() );
		foreach ( array( 'de', 'en' ) as $lang ) {
			foreach ( array_keys( PurposeTemplates::all( $lang ) ) as $key ) {
				$definition = PurposeTemplates::to_definition( $key, $lang );
				if ( null !== $definition ) {
					$out[ $lang ][ $key ] = $definition;
				}
			}
		}
		return $out;
	}

	/**
	 * Uebersetzte Strings der Builder-App.
	 *
	 * @return array<string, string>
	 */
	private function builder_i18n(): array {
		return array(
			'galleryTitle'      => __( 'Wofuer ist Ihr Formular?', 'leadlotse' ),
			'galleryIntro'      => __( 'Waehlen Sie einen Zweck. Sie bekommen ein fertiges Formular, das Sie anpassen koennen.', 'leadlotse' ),
			'backToList'        => __( 'Zurueck zur Uebersicht', 'leadlotse' ),
			'formTitle'         => __( 'Formularname', 'leadlotse' ),
			'published'         => __( 'Veroeffentlicht', 'leadlotse' ),
			'save'              => __( 'Speichern', 'leadlotse' ),
			'saving'            => __( 'Speichern...', 'leadlotse' ),
			'saved'             => __( 'Gespeichert.', 'leadlotse' ),
			'loading'           => __( 'Wird geladen.', 'leadlotse' ),
			'fields'            => __( 'Felder', 'leadlotse' ),
			'preview'           => __( 'Vorschau', 'leadlotse' ),
			'previewEmpty'      => __( 'Fuegen Sie links Felder hinzu.', 'leadlotse' ),
			'submit'            => __( 'Absenden', 'leadlotse' ),
			'addField'          => __( 'Feld hinzufuegen', 'leadlotse' ),
			'fieldWarn'         => __( 'Viele Pflichtfelder kosten Anfragen. Fragen Sie nur ab, was Sie wirklich brauchen.', 'leadlotse' ),
			'moveUp'            => __( 'Nach oben', 'leadlotse' ),
			'moveDown'          => __( 'Nach unten', 'leadlotse' ),
			'deleteField'       => __( 'Feld loeschen', 'leadlotse' ),
			'consentField'      => __( 'Einwilligung', 'leadlotse' ),
			'hiddenField'       => __( 'Verstecktes Feld', 'leadlotse' ),
			'fieldSettings'     => __( 'Feld-Einstellungen', 'leadlotse' ),
			'consentHint'       => __( 'Das Einwilligungsfeld ist Pflicht und kann nicht entfernt werden. Sie koennen den Text anpassen.', 'leadlotse' ),
			'consentText'       => __( 'Einwilligungstext', 'leadlotse' ),
			'hiddenHint'        => __( 'Verstecktes Feld fuer die Attribution (zum Beispiel utm_source). Es ist fuer Besucher nicht sichtbar.', 'leadlotse' ),
			'captureKey'        => __( 'Erfasster Parameter', 'leadlotse' ),
			'label'             => __( 'Beschriftung', 'leadlotse' ),
			'required'          => __( 'Pflichtfeld', 'leadlotse' ),
			'help'              => __( 'Hilfetext', 'leadlotse' ),
			'placeholder'       => __( 'Platzhalter', 'leadlotse' ),
			'options'           => __( 'Optionen (eine pro Zeile)', 'leadlotse' ),
			'asRadio'           => __( 'Als Auswahlknoepfe anzeigen', 'leadlotse' ),
			'conditions'        => __( 'Sichtbarkeit', 'leadlotse' ),
			'conditionEnable'   => __( 'Dieses Feld nur unter einer Bedingung zeigen', 'leadlotse' ),
			'conditionNoFields' => __( 'Fuegen Sie zuerst weitere Felder hinzu.', 'leadlotse' ),
			'show'              => __( 'Zeigen', 'leadlotse' ),
			'hide'              => __( 'Verbergen', 'leadlotse' ),
			'chooseField'       => __( 'Feld waehlen', 'leadlotse' ),
			'value'             => __( 'Wert', 'leadlotse' ),
			'op_equals'         => __( 'ist gleich', 'leadlotse' ),
			'op_not_equals'     => __( 'ist nicht gleich', 'leadlotse' ),
			'op_contains'       => __( 'enthaelt', 'leadlotse' ),
			'op_not_empty'      => __( 'ist ausgefuellt', 'leadlotse' ),
			'op_empty'          => __( 'ist leer', 'leadlotse' ),
			'formSettings'      => __( 'Formular-Einstellungen', 'leadlotse' ),
			'selectFieldHint'   => __( 'Waehlen Sie links ein Feld, um es zu bearbeiten. Hier legen Sie fest, was nach dem Absenden passiert.', 'leadlotse' ),
			'recipients'        => __( 'Empfaenger (eine E-Mail pro Zeile)', 'leadlotse' ),
			'successMessage'    => __( 'Danke-Nachricht', 'leadlotse' ),
			'redirectUrl'       => __( 'Oder Weiterleitung zu (URL, optional)', 'leadlotse' ),
			'sendConfirmation'  => __( 'Bestaetigungsmail an den Absender senden', 'leadlotse' ),
			'confirmSubject'    => __( 'Betreff der Bestaetigung', 'leadlotse' ),
			'confirmBody'       => __( 'Text der Bestaetigung', 'leadlotse' ),
			'defaultConsent'    => __( 'Ich willige ein, dass meine Angaben zur Bearbeitung meiner Anfrage gespeichert und verarbeitet werden.', 'leadlotse' ),
			'whatsappSection'   => __( 'WhatsApp', 'leadlotse' ),
			'whatsappOffer'     => __( 'WhatsApp-Kontakt anbieten', 'leadlotse' ),
			'whatsappNumber'    => __( 'Nummer', 'leadlotse' ),
			'whatsappNumberHint' => __( 'Im internationalen Format, zum Beispiel +49 171 2345678', 'leadlotse' ),
			'whatsappButton'    => __( 'Knopf-Beschriftung', 'leadlotse' ),
			'whatsappPrefill'   => __( 'Vorbefuellter Text', 'leadlotse' ),
			'whatsappHint'      => __( 'Hinweistext', 'leadlotse' ),
			'whatsappHintHint'  => __( 'Standardhinweis, wenn leer: WhatsApp ist ein Dienst der Meta Platforms Ireland Limited. Wenn Sie den Chat oeffnen, werden Daten an WhatsApp uebertragen, auch in Laender ausserhalb der EU. Es gilt die Datenschutzerklaerung von WhatsApp.', 'leadlotse' ),
			'whatsappOptin'     => __( 'WhatsApp-Opt-in anzeigen', 'leadlotse' ),
			'whatsappOptinText' => __( 'Text des Opt-in', 'leadlotse' ),
			'identitySection'   => __( 'Ausfuellhilfe', 'leadlotse' ),
			'identityShow'      => __( 'Knoepfe "Weiter mit Google/Apple" anzeigen, wenn eingerichtet', 'leadlotse' ),
			'eventSection'      => __( 'Veranstaltung', 'leadlotse' ),
			'eventEnable'       => __( 'Dieses Formular ist eine Veranstaltungs-Anmeldung', 'leadlotse' ),
			'eventHint'         => __( 'Die Veranstaltungsdaten erscheinen in den Mails und auf dem Ticket mit QR-Code.', 'leadlotse' ),
			'eventTitle'        => __( 'Titel der Veranstaltung', 'leadlotse' ),
			'eventDate'         => __( 'Datum und Uhrzeit', 'leadlotse' ),
			'eventLocation'     => __( 'Ort', 'leadlotse' ),
			'eventUrl'          => __( 'Externe Event-Seite (URL, optional)', 'leadlotse' ),
			'eventCapacity'     => __( 'Kapazitaet (Personen insgesamt, 0 = unbegrenzt)', 'leadlotse' ),
			'eventCapacityHint' => __( 'Begleitpersonen zaehlen mit. Bei Erreichen zeigt das Formular "ausgebucht".', 'leadlotse' ),
			'proBadge'          => __( 'Pro', 'leadlotse' ),
			'proDismiss'        => __( 'Hinweis schliessen', 'leadlotse' ),
		);
	}
}
