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

namespace Hafenstudios\Leadlotse\Admin;

use Hafenstudios\Core\Core;
use Hafenstudios\Core\Mail\Message;
use Hafenstudios\Leadlotse\Support\MailSenderCheck;

defined( 'ABSPATH' ) || exit;

/**
 * Einstellungen "Mail-Absender" (L-F1, Live-Test-Fund 23.07.).
 *
 * Bis hierher gab es keine Oberflaeche fuer die Core-Option hs_core_mail. Diese
 * Seite pflegt genau Absendername und Absenderadresse in dieser Option (Format
 * {from_email, from_name}); alle uebrigen Schluessel der Option (Treiber, SMTP)
 * bleiben unberuehrt. Der Core-Code wird nicht angefasst.
 *
 * Ist die Absender-Domain eine Fremd- oder Freemail-Domain, warnt eine Karte im
 * Hans-Muster, dass solche Absender beim Empfaenger als Faelschung gelten (SPF)
 * und im Spam landen. Ein Testmail-Knopf sendet ueber den Core-Mailer an die
 * Admin-Adresse.
 */
final class MailSenderPage {

	public const SLUG        = 'leadlotse-mail';
	public const ACTION_SAVE = 'leadlotse_save_mail';
	public const ACTION_TEST = 'leadlotse_send_testmail';

	/**
	 * Core-Option mit den flottenweiten Mail-Einstellungen.
	 */
	private const OPTION = 'hs_core_mail';

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

	/**
	 * Aktuelle Mail-Konfiguration (defensiv als Array).
	 *
	 * @return array<string, mixed>
	 */
	private function config(): array {
		$config = get_option( self::OPTION, array() );
		return is_array( $config ) ? $config : array();
	}

	/**
	 * Site-Host aus home_url (klein, ohne www).
	 *
	 * @return string
	 */
	private function site_host(): string {
		$host = (string) wp_parse_url( home_url(), PHP_URL_HOST );
		return MailSenderCheck::normalize_host( $host );
	}

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

		$config     = $this->config();
		$from_email = (string) ( $config['from_email'] ?? '' );
		$from_name  = (string) ( $config['from_name'] ?? '' );
		$site_host  = $this->site_host();
		$default    = MailSenderCheck::default_from_email( $site_host );
		$admin_mail = (string) get_option( 'admin_email' );

		echo '<div class="wrap leadlotse-mail-admin">';
		echo '<h1>' . esc_html__( 'Mail-Absender', 'leadlotse' ) . '</h1>';

		$this->render_notice();

		echo '<p class="description" style="max-width:52em;">' . esc_html__( 'Legen Sie fest, mit welchem Namen und welcher Adresse Ihre Formular-Mails verschickt werden. Diese Angaben gelten fuer die gesamte Hafenstudios-Flotte auf dieser Website.', 'leadlotse' ) . '</p>';

		// Warnkarte im Hans-Muster (nur bei Fremd- oder Freemail-Domain).
		echo $this->sender_warning( $from_email, $site_host ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- sender_warning escaped bereits.

		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 );

		echo '<table class="form-table" style="max-width:52em;"><tbody>';

		echo '<tr><th scope="row"><label for="ll-from-name">' . esc_html__( 'Absendername', 'leadlotse' ) . '</label></th><td>';
		echo '<input type="text" id="ll-from-name" name="from_name" value="' . esc_attr( $from_name ) . '" class="regular-text" placeholder="' . esc_attr( (string) get_bloginfo( 'name' ) ) . '" />';
		echo '<p class="description">' . esc_html__( 'Wird leer gelassen, verwendet die Website ihren Namen.', 'leadlotse' ) . '</p>';
		echo '</td></tr>';

		echo '<tr><th scope="row"><label for="ll-from-email">' . esc_html__( 'Absenderadresse', 'leadlotse' ) . '</label></th><td>';
		echo '<input type="email" id="ll-from-email" name="from_email" value="' . esc_attr( $from_email ) . '" class="regular-text" placeholder="' . esc_attr( $default ) . '" />';
		if ( '' === $from_email && '' !== $default ) {
			echo '<p class="description">' . sprintf(
				/* translators: %s: wirksame Standard-Absenderadresse */
				esc_html__( 'Noch nicht gesetzt. Es wird automatisch %s verwendet.', 'leadlotse' ),
				'<code>' . esc_html( $default ) . '</code>'
			) . '</p>';
		} else {
			echo '<p class="description">' . esc_html__( 'Am besten eine Adresse Ihrer eigenen Domain, damit die Mails zugestellt werden.', 'leadlotse' ) . '</p>';
		}
		echo '</td></tr>';

		echo '</tbody></table>';

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

		// Testmail (eigene Form, damit ein Klick den aktuellen Absender prueft).
		echo '<hr />';
		echo '<h2>' . esc_html__( 'Zustellung testen', 'leadlotse' ) . '</h2>';
		echo '<p class="description" style="max-width:52em;">' . sprintf(
			/* translators: %s: Admin-E-Mail-Adresse */
			esc_html__( 'Sendet eine Testmail ueber den aktuellen Absender an %s. Kommt sie nicht an oder landet sie im Spam, stimmt der Absender oder die SPF-Einrichtung Ihrer Domain noch nicht.', 'leadlotse' ),
			'<code>' . esc_html( $admin_mail ) . '</code>'
		) . '</p>';
		echo '<form method="post" action="' . esc_url( admin_url( 'admin-post.php' ) ) . '">';
		echo '<input type="hidden" name="action" value="' . esc_attr( self::ACTION_TEST ) . '" />';
		wp_nonce_field( self::ACTION_TEST );
		echo '<p><button type="submit" class="button">' . esc_html__( 'Testmail senden', 'leadlotse' ) . '</button></p>';
		echo '</form>';

		echo '</div>';
	}

	/**
	 * Baut die Warnkarte (Hans-Muster), wenn die Absender-Domain nicht zur
	 * Site-Domain passt. Leerer Absender: keine Warnung (der Default passt).
	 *
	 * @param string $from_email Eingetragene Absenderadresse.
	 * @param string $site_host  Site-Host.
	 * @return string HTML oder Leerstring.
	 */
	private function sender_warning( string $from_email, string $site_host ): string {
		$result = MailSenderCheck::evaluate( $from_email, $site_host );
		if ( MailSenderCheck::RESULT_OK === $result || MailSenderCheck::RESULT_EMPTY === $result ) {
			return '';
		}

		$domain = MailSenderCheck::domain_from_email( $from_email );

		if ( MailSenderCheck::RESULT_FREEMAIL === $result ) {
			$title = __( 'Dieser Absender landet fast sicher im Spam', 'leadlotse' );
			$text  = sprintf(
				/* translators: 1: Freemail-Domain, 2: Site-Domain */
				__( 'Sie versenden ueber eine Freemail-Adresse (%1$s). Solche Anbieter erlauben nur ihren eigenen Servern den Versand. Ihre Website ist das nicht, darum werten Empfaenger die Mail als Faelschung (SPF) und sortieren sie in den Spam. Nehmen Sie besser eine Adresse Ihrer eigenen Domain, zum Beispiel kontakt@%2$s.', 'leadlotse' ),
				$domain,
				'' !== $site_host ? $site_host : __( 'ihre-domain.de', 'leadlotse' )
			);
		} else {
			$title = __( 'Absender-Domain passt nicht zur Website', 'leadlotse' );
			$text  = sprintf(
				/* translators: 1: Absender-Domain, 2: Site-Domain */
				__( 'Die Absender-Domain (%1$s) ist eine andere als die Ihrer Website (%2$s). Wenn diese Domain den Versand ueber Ihre Website nicht ausdruecklich erlaubt (SPF), werten Empfaenger die Mails als Faelschung und sortieren sie in den Spam. Am zuverlaessigsten ist eine Absenderadresse Ihrer eigenen Website-Domain.', 'leadlotse' ),
				$domain,
				'' !== $site_host ? $site_host : __( 'Ihre Domain', 'leadlotse' )
			);
		}

		$hans  = Core::instance()->hans();
		$image = $hans->is_enabled() ? $hans->image_url( 33 ) : '';

		$out = '<div class="hs-mailwarn" role="note">';
		if ( '' !== $image ) {
			$out .= '<img class="hs-mailwarn__img" src="' . esc_url( $image ) . '" alt="" width="72" height="72" loading="lazy" />';
		}
		$out .= '<div class="hs-mailwarn__body">';
		$out .= '<p class="hs-mailwarn__title">' . esc_html( $title ) . '</p>';
		$out .= '<p class="hs-mailwarn__text">' . esc_html( $text ) . '</p>';
		$out .= '</div></div>';

		return $out;
	}

	/**
	 * Speichert Absendername und Absenderadresse in hs_core_mail. Alle uebrigen
	 * Schluessel der Option bleiben erhalten.
	 *
	 * @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 );

		$from_name  = sanitize_text_field( wp_unslash( $_POST['from_name'] ?? '' ) );
		$from_email = sanitize_email( wp_unslash( $_POST['from_email'] ?? '' ) );

		// Nicht-leere, aber ungueltige Adresse ablehnen (Rest unveraendert lassen).
		if ( '' !== $from_email && ! is_email( $from_email ) ) {
			$this->redirect( 'invalid_email' );
			return;
		}

		$config               = $this->config();
		$config['from_name']  = $from_name;
		$config['from_email'] = $from_email;
		update_option( self::OPTION, $config );

		$this->redirect( 'saved' );
	}

	/**
	 * Sendet eine Testmail ueber den Core-Mailer an die Admin-Adresse.
	 *
	 * @return void
	 */
	public function handle_test(): void {
		if ( ! current_user_can( 'hs_manage_settings' ) ) {
			wp_die( esc_html__( 'Keine Berechtigung.', 'leadlotse' ) );
		}
		check_admin_referer( self::ACTION_TEST );

		$to = (string) get_option( 'admin_email' );
		if ( '' === $to ) {
			$this->redirect( 'test_fail' );
			return;
		}

		$subject = sprintf(
			/* translators: %s: Site-Name */
			__( 'Testmail von %s', 'leadlotse' ),
			(string) get_bloginfo( 'name' )
		);
		$body  = '<p>' . esc_html__( 'Das ist eine Testmail aus der Leadlotse-Absendereinstellung.', 'leadlotse' ) . '</p>';
		$body .= '<p>' . esc_html__( 'Wenn Sie diese Nachricht im Posteingang (nicht im Spam) sehen, ist Ihr Absender richtig eingerichtet.', 'leadlotse' ) . '</p>';

		$ok = Core::instance()->mailer()->send( new Message( $to, $subject, $body ) );

		$this->redirect( $ok ? 'test_ok' : 'test_fail' );
	}

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

	/**
	 * Zeigt eine Erfolgs- oder Fehlermeldung nach einem Redirect.
	 *
	 * @return void
	 */
	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'] ) ) : '';
		switch ( $msg ) {
			case 'saved':
				printf( '<div class="notice notice-success is-dismissible"><p>%s</p></div>', esc_html__( 'Absender gespeichert.', 'leadlotse' ) );
				break;
			case 'invalid_email':
				printf( '<div class="notice notice-error is-dismissible"><p>%s</p></div>', esc_html__( 'Die Absenderadresse ist keine gueltige E-Mail-Adresse. Es wurde nichts geaendert.', 'leadlotse' ) );
				break;
			case 'test_ok':
				printf( '<div class="notice notice-success is-dismissible"><p>%s</p></div>', esc_html__( 'Testmail wurde versendet. Bitte pruefen Sie Ihren Posteingang und den Spam-Ordner.', 'leadlotse' ) );
				break;
			case 'test_fail':
				printf( '<div class="notice notice-error is-dismissible"><p>%s</p></div>', esc_html__( 'Die Testmail konnte nicht versendet werden. Bitte pruefen Sie die Mail-Einstellungen Ihrer Website.', 'leadlotse' ) );
				break;
		}
	}

	/**
	 * Zurueck zur Seite mit einer Meldung.
	 *
	 * @param string $msg Meldungsschluessel.
	 * @return void
	 */
	private function redirect( string $msg ): void {
		wp_safe_redirect(
			add_query_arg(
				array(
					'page' => self::SLUG,
					'msg'  => $msg,
				),
				admin_url( 'admin.php' )
			)
		);
		exit;
	}
}
