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

namespace Hafenstudios\Leadlotse\Admin;

use Hafenstudios\Core\Core;
use Hafenstudios\Leadlotse\Install\Installer;
use Hafenstudios\Leadlotse\Support\ProFeatures;
use Hafenstudios\Leadlotse\Support\Secrets;

defined( 'ABSPATH' ) || exit;

/**
 * Einstellungen "Ausfuellhilfe" (Weiter mit Google/Apple).
 *
 * Serverseitig ueber admin-post (D3). Geheimnisse (Google-Client-Secret,
 * Apple-.p8-Schluessel) werden nie im Klartext angezeigt (nur "gesetzt"/"nicht
 * gesetzt") und ueber Secrets verschluesselt gespeichert; ein leeres Feld behaelt
 * den bestehenden Wert. Die Knoepfe erscheinen im Formular erst, wenn ein Anbieter
 * vollstaendig eingerichtet und aktiviert ist.
 */
final class IdentityPage {

	public const SLUG        = 'leadlotse-identity';
	public const ACTION_SAVE = 'leadlotse_save_identity';

	/**
	 * Registriert den admin-post-Handler.
	 *
	 * @return void
	 */
	public function register(): void {
		add_action( 'admin_post_' . self::ACTION_SAVE, array( $this, 'handle_save' ) );
	}

	/**
	 * Settings-Speicher.
	 *
	 * @return \Hafenstudios\Core\Settings\Settings
	 */
	private function settings() {
		return Core::instance()->settings( 'leadlotse', Installer::default_settings() );
	}

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

		$s            = $this->settings();
		$google       = (array) $s->get( 'identity.google', array() );
		$apple        = (array) $s->get( 'identity.apple', array() );
		$redirect_uri = rest_url( 'leadlotse/v1/identity/callback' );

		echo '<div class="wrap leadlotse-identity-admin">';
		echo '<h1>' . esc_html__( 'Schneller ausfuellen mit Google und Apple', 'leadlotse' ) . '</h1>';

		$this->render_notice();

		// Kauf-Moment: nur wenn gesperrt, also ohne Lizenz UND ohne bereits
		// aktiven Anbieter (Bestandsschutz). Eine Karte, ein Satz, Preis, Knopf;
		// weggeklickt bleibt sie weg (Hans-Speicher, Nutzer-Meta).
		if ( ! ProFeatures::enabled() && empty( $google['enabled'] ) && empty( $apple['enabled'] ) ) {
			$card = ProFeatures::card();
			Core::instance()->hans()->card(
				array(
					'id'     => $card['id'],
					'title'  => $card['title'],
					'text'   => $card['text'] . ' ' . $card['price'],
					'action' => array(
						'label' => $card['button'],
						'url'   => $card['url'],
					),
				)
			);
		}

		echo '<p class="description" style="max-width:52em;">' . esc_html__( 'Bieten Sie Besuchern an, ihr Formular per Google oder Apple auszufuellen. E-Mail und Name werden dann uebernommen, ohne dass jemand tippen muss, und die Adresse kommt bereits bestaetigt an. Die Knoepfe erscheinen erst, wenn Sie unten einen Anbieter einrichten und aktivieren.', 'leadlotse' ) . '</p>';

		echo '<table class="form-table" style="max-width:52em;"><tbody>';
		echo '<tr><th scope="row">' . esc_html__( 'Redirect-URI', 'leadlotse' ) . '</th><td>';
		echo '<input type="text" readonly onfocus="this.select()" value="' . esc_attr( $redirect_uri ) . '" class="large-text" />';
		echo '<p class="description">' . esc_html__( 'Diese Adresse tragen Sie beim jeweiligen Anbieter als zulaessige Redirect-URI ein.', 'leadlotse' ) . '</p>';
		echo '</td></tr></tbody></table>';

		echo '<form method="post" action="' . esc_url( admin_url( 'admin-post.php' ) ) . '">';
		echo '<input type="hidden" name="action" value="' . esc_attr( self::ACTION_SAVE ) . '" />';
		wp_nonce_field( self::ACTION_SAVE );

		$this->render_google_card( $google, $redirect_uri );
		$this->render_apple_card( $apple, $redirect_uri );

		echo '<p><button type="submit" class="button button-primary">' . esc_html__( 'Einstellungen speichern', 'leadlotse' ) . '</button></p>';
		echo '</form>';

		echo '</div>';
	}

	/**
	 * Karte fuer den Anbieter Google.
	 *
	 * @param array<string, mixed> $google       Google-Einstellungen.
	 * @param string               $redirect_uri Redirect-URI.
	 * @return void
	 */
	private function render_google_card( array $google, string $redirect_uri ): void {
		$enabled    = ! empty( $google['enabled'] );
		$client_id  = (string) ( $google['client_id'] ?? '' );
		$has_secret = '' !== (string) ( $google['client_secret'] ?? '' );
		$configured = '' !== $client_id && $has_secret;

		echo '<div class="leadlotse-identity-card">';
		echo '<h2>Google ' . $this->status_badge( $enabled, $configured ) . '</h2>'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Badge escaped.

		echo '<table class="form-table"><tbody>';
		$this->checkbox_row( 'google_enabled', __( 'Aktivieren', 'leadlotse' ), $enabled );
		$this->text_row( 'google_client_id', __( 'Client-ID', 'leadlotse' ), $client_id );
		$this->secret_row( 'google_client_secret', __( 'Client-Secret', 'leadlotse' ), $has_secret );
		echo '</tbody></table>';

		echo '<details class="leadlotse-identity-guide"><summary>' . esc_html__( 'Anleitung: Google einrichten', 'leadlotse' ) . '</summary>';
		echo '<ol>';
		echo '<li>' . esc_html__( 'Oeffnen Sie console.cloud.google.com und legen Sie ein Projekt an (oder waehlen Sie ein bestehendes).', 'leadlotse' ) . '</li>';
		echo '<li>' . esc_html__( 'Richten Sie unter "OAuth-Zustimmungsbildschirm" einen externen Bildschirm ein (App-Name und Support-E-Mail genuegen).', 'leadlotse' ) . '</li>';
		echo '<li>' . esc_html__( 'Erstellen Sie unter "Anmeldedaten" eine OAuth-Client-ID vom Typ "Webanwendung".', 'leadlotse' ) . '</li>';
		echo '<li>' . sprintf(
			/* translators: %s: Redirect-URI */
			esc_html__( 'Tragen Sie als autorisierten Redirect-URI genau diese Adresse ein: %s', 'leadlotse' ),
			'<code>' . esc_html( $redirect_uri ) . '</code>'
		) . '</li>';
		echo '<li>' . esc_html__( 'Kopieren Sie die angezeigte Client-ID und das Client-Secret in die Felder oben.', 'leadlotse' ) . '</li>';
		echo '</ol>';
		echo '<p>' . esc_html__( 'Der Anbieter ist erst aktiv, wenn alle Felder gefuellt sind und der Haken gesetzt ist.', 'leadlotse' ) . '</p>';
		echo '</details>';
		echo '</div>';
	}

	/**
	 * Karte fuer den Anbieter Apple.
	 *
	 * @param array<string, mixed> $apple        Apple-Einstellungen.
	 * @param string               $redirect_uri Redirect-URI.
	 * @return void
	 */
	private function render_apple_card( array $apple, string $redirect_uri ): void {
		$enabled     = ! empty( $apple['enabled'] );
		$client_id   = (string) ( $apple['client_id'] ?? '' );
		$team_id     = (string) ( $apple['team_id'] ?? '' );
		$key_id      = (string) ( $apple['key_id'] ?? '' );
		$has_key     = '' !== (string) ( $apple['private_key'] ?? '' );
		$configured  = '' !== $client_id && '' !== $team_id && '' !== $key_id && $has_key;

		echo '<div class="leadlotse-identity-card">';
		echo '<h2>Apple ' . $this->status_badge( $enabled, $configured ) . '</h2>'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Badge escaped.

		echo '<table class="form-table"><tbody>';
		$this->checkbox_row( 'apple_enabled', __( 'Aktivieren', 'leadlotse' ), $enabled );
		$this->text_row( 'apple_client_id', __( 'Services-ID', 'leadlotse' ), $client_id );
		$this->text_row( 'apple_team_id', __( 'Team-ID', 'leadlotse' ), $team_id );
		$this->text_row( 'apple_key_id', __( 'Key-ID', 'leadlotse' ), $key_id );
		$this->key_row( 'apple_private_key', __( 'Key-Inhalt (.p8)', 'leadlotse' ), $has_key );
		echo '</tbody></table>';

		echo '<details class="leadlotse-identity-guide"><summary>' . esc_html__( 'Anleitung: Apple einrichten', 'leadlotse' ) . '</summary>';
		echo '<p>' . esc_html__( 'Fuer Apple ist eine kostenpflichtige Apple-Developer-Mitgliedschaft noetig (derzeit 99 US-Dollar pro Jahr).', 'leadlotse' ) . '</p>';
		echo '<ol>';
		echo '<li>' . esc_html__( 'Oeffnen Sie developer.apple.com und gehen Sie zu "Certificates, Identifiers & Profiles".', 'leadlotse' ) . '</li>';
		echo '<li>' . esc_html__( 'Legen Sie eine App-ID mit aktiviertem "Sign in with Apple" an.', 'leadlotse' ) . '</li>';
		echo '<li>' . sprintf(
			/* translators: %s: Redirect-URI */
			esc_html__( 'Erstellen Sie eine Services-ID (das ist die Client-ID) und hinterlegen Sie Ihre Domain sowie diese Redirect-URI: %s', 'leadlotse' ),
			'<code>' . esc_html( $redirect_uri ) . '</code>'
		) . '</li>';
		echo '<li>' . esc_html__( 'Legen Sie unter "Keys" einen Schluessel fuer "Sign in with Apple" an, laden Sie die .p8-Datei herunter und fuegen Sie ihren Inhalt oben ein. Die Key-ID steht neben dem Schluessel.', 'leadlotse' ) . '</li>';
		echo '<li>' . esc_html__( 'Die Team-ID finden Sie oben rechts in Ihrem Developer-Konto.', 'leadlotse' ) . '</li>';
		echo '</ol>';
		echo '<p>' . esc_html__( 'Der Anbieter ist erst aktiv, wenn alle Felder gefuellt sind und der Haken gesetzt ist.', 'leadlotse' ) . '</p>';
		echo '</details>';
		echo '</div>';
	}

	/**
	 * Speichert die Einstellungen (admin-post).
	 *
	 * @return void
	 */
	public function handle_save(): void {
		if ( ! current_user_can( 'hs_manage_settings' ) ) {
			wp_die( esc_html__( 'Keine Berechtigung.', 'leadlotse' ) );
		}
		check_admin_referer( self::ACTION_SAVE );

		$s = $this->settings();

		$google_on = ! empty( $_POST['google_enabled'] );
		$apple_on  = ! empty( $_POST['apple_enabled'] );

		// Pro-Gate (L-P1): die Ausfuellhilfe NEU freizuschalten ist Pro. Ein
		// bereits aktiver Anbieter bleibt aktiv (Bestandsschutz) und laesst sich
		// weiter pflegen und auch abschalten.
		$blocked = false;
		if ( ! ProFeatures::enabled() ) {
			if ( $google_on && empty( ( (array) $s->get( 'identity.google', array() ) )['enabled'] ) ) {
				$google_on = false;
				$blocked   = true;
			}
			if ( $apple_on && empty( ( (array) $s->get( 'identity.apple', array() ) )['enabled'] ) ) {
				$apple_on = false;
				$blocked  = true;
			}
		}

		$s->set( 'identity.google.enabled', $google_on );
		$s->set( 'identity.google.client_id', sanitize_text_field( wp_unslash( $_POST['google_client_id'] ?? '' ) ) );
		$this->save_secret( 'identity.google.client_secret', 'google_client_secret' );

		$s->set( 'identity.apple.enabled', $apple_on );
		$s->set( 'identity.apple.client_id', sanitize_text_field( wp_unslash( $_POST['apple_client_id'] ?? '' ) ) );
		$s->set( 'identity.apple.team_id', sanitize_text_field( wp_unslash( $_POST['apple_team_id'] ?? '' ) ) );
		$s->set( 'identity.apple.key_id', sanitize_text_field( wp_unslash( $_POST['apple_key_id'] ?? '' ) ) );
		$this->save_secret( 'identity.apple.private_key', 'apple_private_key' );

		$this->redirect( $blocked ? 'pro' : 'saved' );
	}

	// --- Helfer ------------------------------------------------------------

	/**
	 * Verschluesselt und speichert ein Geheimnis, sofern das Feld ausgefuellt ist.
	 *
	 * @param string $path  Settings-Pfad.
	 * @param string $field POST-Feldname.
	 * @return void
	 */
	private function save_secret( string $path, string $field ): void {
		$value = trim( (string) wp_unslash( $_POST[ $field ] ?? '' ) );
		if ( '' === $value ) {
			return; // leer = bestehenden Wert behalten
		}
		$this->settings()->set( $path, Secrets::encrypt( $value ) );
	}

	/**
	 * Status-Schild je Anbieter. Ohne Lizenz und ohne aktiven Anbieter zeigt es
	 * das Schloss-Schild: die Flaeche bleibt sichtbar, aber verschlossen (L-P1).
	 *
	 * @param bool $enabled    Haken gesetzt.
	 * @param bool $configured Alle Felder gefuellt.
	 * @return string
	 */
	private function status_badge( bool $enabled, bool $configured ): string {
		if ( ! $enabled && ! ProFeatures::enabled() ) {
			return ProFeatures::badge();
		}
		if ( $enabled && $configured ) {
			return '<span class="hs-shield hs-shield--green">' . esc_html__( 'Aktiv', 'leadlotse' ) . '</span>';
		}
		if ( ! $configured ) {
			return '<span class="hs-shield hs-shield--grey">' . esc_html__( 'Zugangsdaten unvollstaendig', 'leadlotse' ) . '</span>';
		}
		return '<span class="hs-shield hs-shield--grey">' . esc_html__( 'Nicht aktiviert', 'leadlotse' ) . '</span>';
	}

	private function text_row( string $name, string $label, string $value ): void {
		echo '<tr><th scope="row"><label for="ll-' . esc_attr( $name ) . '">' . esc_html( $label ) . '</label></th>';
		echo '<td><input type="text" id="ll-' . esc_attr( $name ) . '" name="' . esc_attr( $name ) . '" value="' . esc_attr( $value ) . '" class="regular-text" /></td></tr>';
	}

	private function checkbox_row( string $name, string $label, bool $checked ): void {
		// Ohne Lizenz laesst sich ein bisher inaktiver Anbieter nicht einschalten
		// (der admin-post-Handler weist es ohnehin ab); Abschalten bleibt moeglich.
		$locked = ! $checked && ! ProFeatures::enabled();

		echo '<tr><th scope="row">' . esc_html( $label ) . '</th><td><label>';
		echo '<input type="checkbox" name="' . esc_attr( $name ) . '" value="1" ' . checked( $checked, true, false ) . disabled( $locked, true, false ) . ' /> ';
		echo esc_html__( 'Diesen Anbieter anbieten', 'leadlotse' ) . '</label>';
		if ( $locked ) {
			echo '<p class="description">' . esc_html( ProFeatures::message( 'identity' ) ) . '</p>';
		}
		echo '</td></tr>';
	}

	private function secret_row( string $name, string $label, bool $is_set ): void {
		$placeholder = $is_set ? __( 'gesetzt (leer lassen zum Behalten)', 'leadlotse' ) : __( 'nicht gesetzt', 'leadlotse' );
		echo '<tr><th scope="row"><label for="ll-' . esc_attr( $name ) . '">' . esc_html( $label ) . '</label></th>';
		echo '<td><input type="password" autocomplete="new-password" id="ll-' . esc_attr( $name ) . '" name="' . esc_attr( $name ) . '" value="" placeholder="' . esc_attr( $placeholder ) . '" class="regular-text" /></td></tr>';
	}

	private function key_row( string $name, string $label, bool $is_set ): void {
		$placeholder = $is_set ? __( 'gesetzt (leer lassen zum Behalten)', 'leadlotse' ) : __( 'Inhalt der .p8-Datei einfuegen', 'leadlotse' );
		echo '<tr><th scope="row"><label for="ll-' . esc_attr( $name ) . '">' . esc_html( $label ) . '</label></th>';
		echo '<td><textarea id="ll-' . esc_attr( $name ) . '" name="' . esc_attr( $name ) . '" rows="6" class="large-text code" placeholder="' . esc_attr( $placeholder ) . '"></textarea></td></tr>';
	}

	private function render_notice(): void {
		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Nur Anzeige nach Redirect.
		$msg = isset( $_GET['msg'] ) ? sanitize_key( wp_unslash( $_GET['msg'] ) ) : '';
		if ( 'saved' === $msg ) {
			printf( '<div class="notice notice-success is-dismissible"><p>%s</p></div>', esc_html__( 'Einstellungen gespeichert.', 'leadlotse' ) );
		}
		if ( 'pro' === $msg ) {
			printf( '<div class="notice notice-warning"><p>%s</p></div>', esc_html( ProFeatures::message( 'identity' ) ) );
		}
	}

	private function redirect( string $msg ): void {
		wp_safe_redirect( add_query_arg( array( 'page' => self::SLUG, 'msg' => $msg ), admin_url( 'admin.php' ) ) );
		exit;
	}
}
