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

namespace Hafenstudios\Kurato\Mail;

defined( 'ABSPATH' ) || exit;

/**
 * Detailliertes Versandergebnis eines ESP-Treibers.
 *
 * Die Queue braucht mehr als ein bool: die Provider-Message-ID (fuer die
 * spaetere Zuordnung von Bounce-/Open-Events) und die Unterscheidung zwischen
 * permanenten Fehlern (kein Retry sinnvoll, z.B. ungueltige Adresse) und
 * voruebergehenden (Retry mit Backoff, z.B. Timeout).
 */
final class SendResult {

	public bool $ok;

	public string $message_id;

	public bool $permanent;

	public string $error;

	/**
	 * @param bool   $ok         Erfolg.
	 * @param string $message_id Provider-Message-ID.
	 * @param bool   $permanent  Permanenter Fehler (kein Retry)?
	 * @param string $error      Fehlermeldung.
	 */
	public function __construct( bool $ok, string $message_id = '', bool $permanent = false, string $error = '' ) {
		$this->ok         = $ok;
		$this->message_id = $message_id;
		$this->permanent  = $permanent;
		$this->error      = $error;
	}

	/**
	 * Erfolg.
	 *
	 * @param string $message_id Provider-Message-ID.
	 * @return SendResult
	 */
	public static function success( string $message_id = '' ): SendResult {
		return new self( true, $message_id );
	}

	/**
	 * Voruebergehender Fehler (Retry sinnvoll).
	 *
	 * @param string $error Fehlermeldung.
	 * @return SendResult
	 */
	public static function transient( string $error ): SendResult {
		return new self( false, '', false, $error );
	}

	/**
	 * Permanenter Fehler (kein Retry).
	 *
	 * @param string $error Fehlermeldung.
	 * @return SendResult
	 */
	public static function permanent( string $error ): SendResult {
		return new self( false, '', true, $error );
	}
}
