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

namespace Hafenstudios\Kurato\Cockpit;

use Hafenstudios\Kurato\Admin\Menu;

defined( 'ABSPATH' ) || exit;

/**
 * Admin-Unterseite "Cockpit" im Kurato-Menue (Muster MailSettingsPage).
 *
 * Pairing-Code-Eingabe mit Transparenz-Block, Kopplungsstatus, Trennen-Aktion
 * und Diagnose-Ampel. Cap hs_manage_settings, serverseitig ueber admin-post
 * mit Nonce. Registriert das Untermenue selbst (unabhaengig von Menu), damit
 * die Verdrahtung im Bestand klein bleibt.
 *
 * Die Seite existiert auch ohne Pairing (Bauplan Kap. 8: Rolle und Admin-Seite
 * duerfen existieren); erst das Absenden des Codes koppelt.
 */
final class CockpitPage {

	public const SLUG              = 'kurato-cockpit';
	public const ACTION_PAIR       = 'kurato_cockpit_pair';
	public const ACTION_DISCONNECT = 'kurato_cockpit_disconnect';

	private const NOTICE_TRANSIENT = 'kurato_cockpit_notice';

	private Config $config;

	private PairingService $pairing;

	private Diagnostics $diagnostics;

	/**
	 * @param Config         $config      Kopplungs-Zustand.
	 * @param PairingService $pairing     Pairing-Dienst.
	 * @param Diagnostics    $diagnostics Diagnose.
	 */
	public function __construct( Config $config, PairingService $pairing, Diagnostics $diagnostics ) {
		$this->config      = $config;
		$this->pairing     = $pairing;
		$this->diagnostics = $diagnostics;
	}

	/**
	 * Registriert Menue und admin-post-Handler.
	 *
	 * @return void
	 */
	public function register(): void {
		add_action( 'admin_menu', array( $this, 'register_menu' ), 20 );
		add_action( 'admin_post_' . self::ACTION_PAIR, array( $this, 'handle_pair' ) );
		add_action( 'admin_post_' . self::ACTION_DISCONNECT, array( $this, 'handle_disconnect' ) );
	}

	/**
	 * Haengt die Seite unter das Kurato-Menue.
	 *
	 * @return void
	 */
	public function register_menu(): void {
		add_submenu_page(
			Menu::MENU_SLUG,
			__( 'Cockpit', 'kurato' ),
			__( 'Cockpit', 'kurato' ),
			'hs_manage_settings',
			self::SLUG,
			array( $this, 'render' )
		);
	}

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

		echo '<div class="wrap hs-kurato-cockpit">';
		echo '<h1>' . esc_html__( 'Kurato Cockpit', 'kurato' ) . '</h1>';
		echo '<p class="description">' . esc_html__( 'Das Cockpit ist Ihr Team-Arbeitsplatz in der Cloud. Ihre Kontaktdaten bleiben dabei auf diesem Server; das Cockpit verwaltet nur Konten und Sitze.', 'kurato' ) . '</p>';

		$this->render_notice();

		if ( $this->config->is_paired() ) {
			$this->render_connected();
		} else {
			$this->render_pairing_form();
		}

		$this->render_diagnostics();

		echo '</div>';
	}

	/**
	 * Zustand: gekoppelt.
	 *
	 * @return void
	 */
	private function render_connected(): void {
		echo '<h2>' . esc_html__( 'Status', 'kurato' ) . '</h2>';
		echo '<div class="notice notice-success inline" style="padding:8px 12px;max-width:820px;"><p>';
		echo esc_html__( 'Diese Site ist mit dem Cockpit gekoppelt.', 'kurato' );
		echo '</p></div>';

		echo '<table class="form-table"><tbody>';
		echo '<tr><th scope="row">' . esc_html__( 'Site-ID', 'kurato' ) . '</th><td><code>' . esc_html( $this->config->site_id() ) . '</code></td></tr>';
		echo '<tr><th scope="row">' . esc_html__( 'Plan', 'kurato' ) . '</th><td>' . esc_html( $this->config->plan() ) . '</td></tr>';
		echo '<tr><th scope="row">' . esc_html__( 'Cockpit-App', 'kurato' ) . '</th><td><code>' . esc_html( $this->config->origin() ) . '</code></td></tr>';
		echo '</tbody></table>';

		echo '<form method="post" action="' . esc_url( admin_url( 'admin-post.php' ) ) . '" onsubmit="return confirm(' . esc_attr( wp_json_encode( __( 'Kopplung wirklich trennen? Danach koennen sich Agents nicht mehr im Cockpit anmelden.', 'kurato' ) ) ) . ');">';
		echo '<input type="hidden" name="action" value="' . esc_attr( self::ACTION_DISCONNECT ) . '" />';
		wp_nonce_field( self::ACTION_DISCONNECT );
		echo '<p><button type="submit" class="button button-secondary">' . esc_html__( 'Kopplung trennen', 'kurato' ) . '</button></p>';
		echo '<p class="description">' . esc_html__( 'Das Trennen loescht den Site-Schluessel und schaltet alle Cockpit-Zugaenge sofort ab. Ihre Kontaktdaten bleiben unveraendert.', 'kurato' ) . '</p>';
		echo '</form>';
	}

	/**
	 * Zustand: nicht gekoppelt - Code-Eingabe mit Transparenz-Block.
	 *
	 * @return void
	 */
	private function render_pairing_form(): void {
		echo '<h2>' . esc_html__( 'Site koppeln', 'kurato' ) . '</h2>';

		// Transparenz-Block VOR dem Absenden (COCKPIT-API.md, Pairing Schritt 2).
		echo '<div class="notice notice-info inline" style="padding:8px 12px;max-width:820px;"><p><strong>';
		echo esc_html__( 'Das wird beim Koppeln an das Cockpit uebertragen:', 'kurato' );
		echo '</strong> ' . esc_html__( 'die Adresse dieser Website, die Kurato-Version und Ihr Plan (Free oder Pro).', 'kurato' );
		echo '</p><p><strong>';
		echo esc_html__( 'Das wird nie uebertragen:', 'kurato' );
		echo '</strong> ' . esc_html__( 'Ihre Kontakte, Mails und Termine. Diese Daten bleiben ausschliesslich auf diesem Server.', 'kurato' );
		echo '</p></div>';

		echo '<form method="post" action="' . esc_url( admin_url( 'admin-post.php' ) ) . '">';
		echo '<input type="hidden" name="action" value="' . esc_attr( self::ACTION_PAIR ) . '" />';
		wp_nonce_field( self::ACTION_PAIR );
		echo '<table class="form-table"><tbody>';
		echo '<tr><th scope="row"><label for="kurato-cockpit-code">' . esc_html__( 'Pairing-Code', 'kurato' ) . '</label></th><td>';
		echo '<input type="text" id="kurato-cockpit-code" name="pairing_code" value="" class="regular-text" placeholder="KURATO-XXXX-XXXX" autocomplete="off" />';
		echo '<p class="description">' . esc_html__( 'Diesen Code erzeugen Sie im Cockpit (kurato.cloud) beim Anlegen Ihres Arbeitsbereichs. Er ist 15 Minuten gueltig.', 'kurato' ) . '</p>';
		echo '</td></tr>';
		echo '</tbody></table>';
		echo '<p><button type="submit" class="button button-primary">' . esc_html__( 'Site koppeln', 'kurato' ) . '</button></p>';
		echo '</form>';
	}

	/**
	 * Diagnose-Ampel.
	 *
	 * @return void
	 */
	private function render_diagnostics(): void {
		echo '<h2>' . esc_html__( 'Verbindungsdiagnose', 'kurato' ) . '</h2>';
		echo '<table class="widefat striped" style="max-width:820px;"><tbody>';
		foreach ( $this->diagnostics->collect() as $check ) {
			$labels = array(
				'ok'   => array( '#46b450', __( 'In Ordnung', 'kurato' ) ),
				'warn' => array( '#ffb900', __( 'Hinweis', 'kurato' ) ),
				'fail' => array( '#dc3232', __( 'Problem', 'kurato' ) ),
				'info' => array( '#72777c', __( 'Info', 'kurato' ) ),
			);
			$status = (string) ( $check['status'] ?? 'info' );
			$style  = $labels[ $status ] ?? $labels['info'];

			echo '<tr>';
			echo '<td style="width:110px;"><span style="display:inline-block;padding:2px 8px;border-radius:3px;color:#fff;background:' . esc_attr( $style[0] ) . ';">' . esc_html( $style[1] ) . '</span></td>';
			echo '<td>' . esc_html( (string) ( $check['message'] ?? '' ) );
			if ( '' !== (string) ( $check['next'] ?? '' ) ) {
				echo '<br /><em>' . esc_html__( 'Naechster Schritt:', 'kurato' ) . '</em> ' . esc_html( (string) $check['next'] );
			}
			echo '</td>';
			echo '</tr>';
		}
		echo '</tbody></table>';
	}

	/**
	 * admin-post: Pairing durchfuehren.
	 *
	 * @return void
	 */
	public function handle_pair(): void {
		if ( ! current_user_can( 'hs_manage_settings' ) ) {
			wp_die( esc_html__( 'Keine Berechtigung.', 'kurato' ) );
		}
		check_admin_referer( self::ACTION_PAIR );

		$code   = sanitize_text_field( wp_unslash( $_POST['pairing_code'] ?? '' ) );
		$result = $this->pairing->complete( $code );

		if ( is_wp_error( $result ) ) {
			$this->set_notice( 'error', $result->get_error_message() );
		} else {
			$this->set_notice( 'success', __( 'Ihre Flotte ist verbunden. Die Site ist jetzt mit dem Cockpit gekoppelt.', 'kurato' ) );
		}

		$this->redirect();
	}

	/**
	 * admin-post: Kopplung trennen.
	 *
	 * @return void
	 */
	public function handle_disconnect(): void {
		if ( ! current_user_can( 'hs_manage_settings' ) ) {
			wp_die( esc_html__( 'Keine Berechtigung.', 'kurato' ) );
		}
		check_admin_referer( self::ACTION_DISCONNECT );

		$this->pairing->disconnect();
		$this->set_notice( 'success', __( 'Die Kopplung wurde getrennt. Alle Cockpit-Zugaenge sind abgeschaltet.', 'kurato' ) );

		$this->redirect();
	}

	/**
	 * Hinterlegt eine Hinweismeldung fuer die naechste Anzeige.
	 *
	 * @param string $type    success|error.
	 * @param string $message Meldung.
	 * @return void
	 */
	private function set_notice( string $type, string $message ): void {
		set_transient(
			self::NOTICE_TRANSIENT,
			array(
				'type'    => $type,
				'message' => $message,
			),
			60
		);
	}

	/**
	 * Zeigt eine hinterlegte Hinweismeldung.
	 *
	 * @return void
	 */
	private function render_notice(): void {
		$notice = get_transient( self::NOTICE_TRANSIENT );
		if ( ! is_array( $notice ) ) {
			return;
		}
		delete_transient( self::NOTICE_TRANSIENT );
		$class = 'error' === ( $notice['type'] ?? '' ) ? 'notice-error' : 'notice-success';
		printf(
			'<div class="notice %1$s is-dismissible"><p>%2$s</p></div>',
			esc_attr( $class ),
			esc_html( (string) ( $notice['message'] ?? '' ) )
		);
	}

	/**
	 * Zurueck auf die Cockpit-Seite.
	 *
	 * @return void
	 */
	private function redirect(): void {
		wp_safe_redirect( add_query_arg( array( 'page' => self::SLUG ), admin_url( 'admin.php' ) ) );
		exit;
	}
}
