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

namespace Hafenstudios\Kurato\Admin;

use Hafenstudios\Core\Licensing\ProGate;

defined( 'ABSPATH' ) || exit;

/**
 * Pro-Weiche und Kauf-Momente der Kurato-Admin-UI (FREEMIUS-LAUNCH.md Abschnitt 2,
 * Muster UX-KONZEPT-COCKPIT.md Kap. 6).
 *
 * Ein Ort fuer drei Dinge:
 * 1. die Frage "ist Kurato Pro aktiv?" ({@see ProGate}, Slug kurato),
 * 2. die Wirkung von Pro als Filter: Buchungs-Grenzen unbegrenzt
 *    (`kurato_booking_limits`), gemeldeter Cockpit-Plan `pro`
 *    (`kurato_cockpit_plan`),
 * 3. die verschlossene Flaeche: klar gekennzeichnete Beispieldaten hinter
 *    Milchglas mit EINER Karte (Titel, ein Satz Nutzen, Preis, ein Knopf).
 *
 * Leitplanken:
 * - Gesperrte Flaechen bleiben sichtbar. Es wird nie eine echte Zahl verwischt
 *   (das waere Nebel ueber vorhandenen Daten), sondern immer ein als Beispiel
 *   gekennzeichneter Block gezeigt. Die Beispielzahlen stehen in einem
 *   `aria-hidden`-Container, damit Screenreader keine Fantasiezahlen vorlesen.
 * - Wegklicken wird dauerhaft gemerkt; danach bleibt nur die ruhige Erklaerung
 *   stehen, warum die Flaeche verschlossen ist (kein Nag, kein Modal, kein
 *   Countdown, keine erfundenen Rabatte).
 * - Ohne Lizenz wird nichts geloescht, nichts migriert und nichts abgeschaltet,
 *   was schon Daten haelt: die Grenzen wirken nur beim Anlegen.
 *
 * Absichtlich NICHT gegatet: REST-Routen (die Cockpit-App laeuft live dagegen und
 * regelt Free/Pro selbst ueber den Plan), Versand, Suppression/Bounce-Behandlung
 * und alle DSGVO-Werkzeuge.
 */
final class ProArea {

	/** Plugin-Slug fuer den flottenweiten Gate. */
	public const SLUG = 'kurato';

	/** admin-post-Aktion "Kauf-Karte dauerhaft wegklicken". */
	public const ACTION_DISMISS = 'kurato_pro_dismiss';

	/** Option mit den weggeklickten Kontexten. Oeffentlich fuer die Deinstallation. */
	public const OPTION = 'kurato_pro_dismissed';

	/** Kontexte der Kauf-Momente (je Kontext hoechstens eine Karte). */
	public const CONTEXT_INSIGHT         = 'insight';
	public const CONTEXT_CAMPAIGN_STATS  = 'campaign_stats';
	public const CONTEXT_HOSTS           = 'hosts';
	public const CONTEXT_BOOKING_TYPES   = 'booking_types';

	/**
	 * Verdrahtet die Pro-Wirkung und den Wegklick-Handler.
	 *
	 * Die Filter haengen bewusst unabhaengig vom Lizenz-Zustand: sie fragen den
	 * Gate erst beim Aufruf, damit ein spaet geladener Lizenz-Layer nicht an der
	 * Boot-Reihenfolge scheitert.
	 *
	 * @return void
	 */
	public static function register(): void {
		add_action( 'admin_post_' . self::ACTION_DISMISS, array( self::class, 'handle_dismiss' ) );
		add_filter( 'kurato_booking_limits', array( self::class, 'filter_limits' ) );
		add_filter( 'kurato_cockpit_plan', array( self::class, 'filter_plan' ) );
	}

	/**
	 * Ist Kurato Pro aktiv?
	 *
	 * @return bool
	 */
	public static function enabled(): bool {
		return ProGate::enabled( self::SLUG );
	}

	/**
	 * Pro hebt die Free-Grenzen des Buchungsmoduls auf. Die bestehende Semantik
	 * von BookingLimits gilt: ein Wert <= 0 bedeutet "unbegrenzt".
	 *
	 * @param mixed $limits Bisherige Grenzen.
	 * @return mixed
	 */
	public static function filter_limits( $limits ) {
		if ( ! self::enabled() ) {
			return $limits;
		}
		return array(
			'max_hosts'          => 0,
			'max_types_per_host' => 0,
		);
	}

	/**
	 * Meldet dem Cockpit-Dienst den bezahlten Zustand.
	 *
	 * @param mixed $plan Bisheriger Plan.
	 * @return mixed
	 */
	public static function filter_plan( $plan ) {
		return self::enabled() ? 'pro' : $plan;
	}

	// --- Wegklicken --------------------------------------------------------

	/**
	 * Wurde die Karte dieses Kontexts weggeklickt?
	 *
	 * @param string $context Kontext-Schluessel.
	 * @return bool
	 */
	public static function dismissed( string $context ): bool {
		$list = get_option( self::OPTION, array() );
		return is_array( $list ) && in_array( $context, $list, true );
	}

	/**
	 * Merkt den Wegklick dauerhaft.
	 *
	 * @param string $context Kontext-Schluessel.
	 * @return void
	 */
	public static function dismiss( string $context ): void {
		if ( '' === $context || self::dismissed( $context ) ) {
			return;
		}
		$list   = get_option( self::OPTION, array() );
		$list   = is_array( $list ) ? $list : array();
		$list[] = $context;
		update_option( self::OPTION, $list, false );
	}

	/**
	 * admin-post-Handler des Wegklick-Knopfes.
	 *
	 * @return void
	 */
	public static function handle_dismiss(): void {
		if ( ! current_user_can( 'hs_view_contacts' ) ) {
			wp_die( esc_html__( 'Sie haben keine Berechtigung fuer diese Aktion.', 'kurato' ) );
		}
		check_admin_referer( self::ACTION_DISMISS );

		// phpcs:ignore WordPress.Security.NonceVerification.Missing -- Nonce oben geprueft.
		$context = isset( $_POST['context'] ) ? sanitize_key( wp_unslash( $_POST['context'] ) ) : '';
		self::dismiss( $context );

		$back = wp_get_referer();
		wp_safe_redirect( false !== $back ? $back : admin_url( 'admin.php?page=' . Menu::MENU_SLUG ) );
		exit;
	}

	// --- Kauf-Moment -------------------------------------------------------

	/**
	 * Die Kauf-Karte: Titel, EIN Satz Nutzen, Preis, ein Knopf. Leerer String,
	 * sobald der Betreiber sie weggeklickt hat.
	 *
	 * @param string $context Kontext-Schluessel (fuer das Wegklicken).
	 * @param string $title   Titel.
	 * @param string $benefit Ein Satz Nutzen.
	 * @return string
	 */
	public static function card( string $context, string $title, string $benefit ): string {
		if ( self::dismissed( $context ) ) {
			return '';
		}

		$out  = '<div class="hs-hans-card hs-pro-card" role="note">';
		$out .= '<div class="hs-hans-card__body">';
		$out .= '<p class="hs-hans-card__title">' . esc_html( $title ) . '</p>';
		$out .= '<p class="hs-hans-card__text">' . esc_html( $benefit ) . '</p>';
		$out .= '<p class="hs-pro-card__price">' . esc_html__( 'Kurato Pro, 69 EUR im Jahr', 'kurato' ) . '</p>';
		$out .= '<p><a class="button button-primary" href="' . esc_url( ProGate::upgrade_url( self::SLUG ) ) . '" target="_blank" rel="noopener noreferrer">' . esc_html__( 'Kurato Pro freischalten', 'kurato' ) . '</a></p>';
		$out .= self::dismiss_form( $context );
		$out .= '</div></div>';

		return $out;
	}

	/**
	 * Verschlossene Statistik-Flaeche: sichtbar, aber mit Beispieldaten hinter
	 * Milchglas und der Kauf-Karte darueber. Die Beispieldaten sind fuer
	 * Screenreader ausgeblendet; die Kennzeichnung darueber ist es nicht.
	 *
	 * @param string $context     Kontext-Schluessel.
	 * @param string $title       Titel der Karte.
	 * @param string $benefit     Ein Satz Nutzen.
	 * @param string $sample_html Fertig escaptes Beispiel-Markup (Hausbau, keine Nutzereingabe).
	 * @return string
	 */
	public static function frosted( string $context, string $title, string $benefit, string $sample_html ): string {
		$out  = '<div class="hs-pro-area">';
		$out .= '<p class="hs-pro-area__badge"><span class="hs-shield hs-shield--grey">' . esc_html__( 'BEISPIELDATEN', 'kurato' ) . '</span> ';
		$out .= esc_html__( 'Die Zahlen in dieser Vorschau sind erfunden. Ihre echten Zahlen werden weiter erfasst und mit Kurato Pro angezeigt.', 'kurato' ) . '</p>';
		$out .= '<div class="hs-pro-area__glass">';
		$out .= '<div class="hs-pro-area__sample" aria-hidden="true">' . $sample_html . '</div>';

		$card = self::card( $context, $title, $benefit );
		if ( '' !== $card ) {
			$out .= '<div class="hs-pro-area__overlay">' . $card . '</div>';
		}

		$out .= '</div></div>';

		return $out;
	}

	/**
	 * Das kleine Wegklick-Formular der Karte (admin-post mit Nonce; der Referer
	 * bringt den Betreiber auf dieselbe Seite zurueck).
	 *
	 * @param string $context Kontext-Schluessel.
	 * @return string
	 */
	private static function dismiss_form( string $context ): string {
		$out  = '<form method="post" action="' . esc_url( admin_url( 'admin-post.php' ) ) . '" class="hs-pro-card__dismiss">';
		$out .= '<input type="hidden" name="action" value="' . esc_attr( self::ACTION_DISMISS ) . '" />';
		$out .= '<input type="hidden" name="context" value="' . esc_attr( $context ) . '" />';
		$out .= wp_nonce_field( self::ACTION_DISMISS, '_wpnonce', true, false );
		$out .= '<button type="submit" class="button-link hs-muted">' . esc_html__( 'Diesen Hinweis nicht mehr zeigen', 'kurato' ) . '</button>';
		$out .= '</form>';

		return $out;
	}
}
