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

namespace Hafenstudios\Core\Mail;

use Hafenstudios\Core\Events\EventBus;
use Hafenstudios\Core\Mail\Driver\SmtpDriver;
use Hafenstudios\Core\Mail\Driver\WpMailDriver;

defined( 'ABSPATH' ) || exit;

/**
 * Transaktions-Mailer mit SMTP-Abstraktion.
 *
 * In Phase 1 versendet der Mailer Bestaetigungs- und Benachrichtigungsmails, damit
 * Leadlotse eigenstaendig funktioniert (BAUPLAN Abschnitt 7). Marketing-Massenversand
 * ist bewusst NICHT hier, sondern kommt mit Kurato.
 */
final class Mailer {

	/**
	 * Liefert den aktiven Treiber, abgeleitet aus den Core-Mail-Einstellungen.
	 * Ueber den Filter `hafenstudios/mail_driver` erweiterbar (ESP-Treiber in Kurato).
	 *
	 * @return MailDriver
	 */
	public function driver(): MailDriver {
		$config = get_option( 'hs_core_mail', array() );
		$config = is_array( $config ) ? $config : array();
		$type   = (string) ( $config['driver'] ?? 'wp_mail' );

		$driver = 'smtp' === $type
			? new SmtpDriver( is_array( $config['smtp'] ?? null ) ? $config['smtp'] : array() )
			: new WpMailDriver();

		/**
		 * Erlaubt das Ersetzen des Versandtreibers (ESP-Anbindung ab Phase 2).
		 *
		 * @param MailDriver           $driver Aktueller Treiber.
		 * @param array<string, mixed> $config Mail-Konfiguration.
		 */
		return EventBus::filter( 'mail_driver', $driver, $config );
	}

	/**
	 * Versendet eine Nachricht ueber den aktiven Treiber.
	 *
	 * @param Message $message Nachricht (wird mit Absender-Defaults ergaenzt).
	 * @return bool Erfolg.
	 */
	public function send( Message $message ): bool {
		$config = get_option( 'hs_core_mail', array() );
		$config = is_array( $config ) ? $config : array();

		if ( '' === $message->from_email ) {
			$from = (string) ( $config['from_email'] ?? '' );
			if ( '' === $from ) {
				// Wie WordPress selbst: wordpress@{eigene Domain}. Die admin_email
				// waere haeufig eine Fremd-Domain (z.B. Gmail) - solche Absender
				// scheitern beim Empfaenger am SPF-Check und die Mail verschwindet.
				$host = strtolower( (string) wp_parse_url( home_url(), PHP_URL_HOST ) );
				if ( 0 === strpos( $host, 'www.' ) ) {
					$host = substr( $host, 4 );
				}
				$from = 'wordpress@' . $host;
			}
			$message->from_email = $from;
		}
		if ( '' === $message->from_name ) {
			$message->from_name = (string) ( $config['from_name'] ?? get_bloginfo( 'name' ) );
		}

		/**
		 * Letzte Gelegenheit, die Nachricht zu veraendern (z.B. Footer, DKIM-Hinweis).
		 *
		 * @param Message $message Nachricht.
		 */
		$message = EventBus::filter( 'mail_message', $message );

		$ok = $this->driver()->send( $message );

		EventBus::emit( 'mail_sent', $message, $ok );

		return $ok;
	}
}
