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

namespace Hafenstudios\Kurato\Mail;

use Hafenstudios\Core\Core;
use Hafenstudios\Core\Mail\Driver\SmtpDriver;
use Hafenstudios\Core\Mail\Driver\WpMailDriver;
use Hafenstudios\Core\Mail\MailDriver;

defined( 'ABSPATH' ) || exit;

/**
 * Waehlt den Versandtreiber fuer Kurato-Marketing-Mails aus dem Setting
 * `mail.transport` (brevo | smtp | wp_mail). Brevo ist ein EspDriver (liefert
 * detaillierte Ergebnisse fuer die Queue), SMTP und wp_mail sind Core-Treiber.
 *
 * Die Auswahllogik (`make`) ist von der Settings-Anbindung (`current`) getrennt,
 * damit sie ohne WP-Optionen testbar bleibt.
 */
final class DriverFactory {

	/**
	 * Baut einen Treiber aus einem Transport-Namen und expliziter Konfiguration.
	 *
	 * @param string               $transport brevo | smtp | wp_mail.
	 * @param array<string, mixed> $config    ['brevo_key' => string, 'smtp' => array].
	 * @return MailDriver
	 */
	public function make( string $transport, array $config = array() ): MailDriver {
		switch ( $transport ) {
			case 'brevo':
				return new BrevoDriver( (string) ( $config['brevo_key'] ?? '' ) );
			case 'postmark':
				return new PostmarkDriver( (string) ( $config['postmark_token'] ?? '' ) );
			case 'mailgun':
				return new MailgunDriver(
					(string) ( $config['mailgun_key'] ?? '' ),
					(string) ( $config['mailgun_domain'] ?? '' ),
					(string) ( $config['mailgun_region'] ?? 'us' )
				);
			case 'smtp2go':
				return new Smtp2goDriver( (string) ( $config['smtp2go_key'] ?? '' ) );
			case 'ses':
				return new SesDriver(
					(string) ( $config['ses_access_key'] ?? '' ),
					(string) ( $config['ses_secret_key'] ?? '' ),
					(string) ( $config['ses_region'] ?? '' )
				);
			case 'smtp':
				return new SmtpDriver( is_array( $config['smtp'] ?? null ) ? $config['smtp'] : array() );
			default:
				return new WpMailDriver();
		}
	}

	/**
	 * Baut den aktuell konfigurierten Treiber aus den Kurato-Settings.
	 *
	 * @return MailDriver
	 */
	public function current(): MailDriver {
		$settings = Core::instance()->settings( 'kurato' );
		return $this->make(
			(string) $settings->get( 'mail.transport', 'wp_mail' ),
			array(
				'brevo_key'      => Secrets::decrypt( (string) $settings->get( 'mail.brevo.api_key', '' ) ),
				'postmark_token' => Secrets::decrypt( (string) $settings->get( 'mail.postmark.token', '' ) ),
				'mailgun_key'    => Secrets::decrypt( (string) $settings->get( 'mail.mailgun.api_key', '' ) ),
				'mailgun_domain' => (string) $settings->get( 'mail.mailgun.domain', '' ),
				'mailgun_region' => (string) $settings->get( 'mail.mailgun.region', 'us' ),
				'smtp2go_key'    => Secrets::decrypt( (string) $settings->get( 'mail.smtp2go.api_key', '' ) ),
				'ses_access_key' => (string) $settings->get( 'mail.ses.access_key', '' ),
				'ses_secret_key' => Secrets::decrypt( (string) $settings->get( 'mail.ses.secret_key', '' ) ),
				'ses_region'     => (string) $settings->get( 'mail.ses.region', '' ),
				'smtp'           => (array) $settings->get( 'mail.smtp', array() ),
			)
		);
	}

	/**
	 * Liefert den aktuellen Treiber als EspDriver, falls er detaillierte
	 * Ergebnisse unterstuetzt (fuer die Queue). Sonst null.
	 *
	 * @return EspDriver|null
	 */
	public function current_esp(): ?EspDriver {
		$driver = $this->current();
		return $driver instanceof EspDriver ? $driver : null;
	}
}
