<?php

namespace App\Services\Mail;

/**
 * Die eine Liste aller Mailarten, die dieses Haus verschickt.
 *
 * Es gab sie schon — als Array in MailPreviews, nur für die Vorschau. Mit der
 * Wegwahl je Mailart bräuchte es eine zweite, und die zweite Liste ist die, die
 * beim siebzehnten Mail vergessen wird. Also eine, aus der beide lesen.
 *
 * `purpose` ist die VORGABE: das Postfach, aus dem diese Mailart geht, solange
 * niemand etwas anderes einstellt. Sie muss dem entsprechen, was die Mailklasse
 * heute an mailboxEnvelope() übergibt — sonst ändert dieser Umbau still das
 * Verhalten.
 *
 * Reihenfolge wie in der Vorschau: Anmeldung, Kauf, Betrieb, Geld, Sicherheit.
 */
final class MailCatalogue
{
    /** @return array<string, array{label: string, purpose: string}> */
    public static function all(): array
    {
        return [
            'verify-email' => ['label' => 'E-Mail bestätigen (Registrierung)', 'purpose' => MailPurpose::SYSTEM],
            'reset-password' => ['label' => 'Passwort zurücksetzen', 'purpose' => MailPurpose::SYSTEM],
            // Die Einladung in die Konsole. SYSTEM wie ihre beiden Nachbarn:
            // eine Mail über den ZUGANG selbst, nicht über einen Kauf, einen
            // Betriebsvorgang oder eine Supportantwort. Sie trägt kein
            // Passwort, nur einen Link, an dem der Eingeladene sein eigenes
            // vergibt — siehe App\Mail\OperatorInvitationMail.
            'operator-invitation' => ['label' => 'Einladung in die Konsole', 'purpose' => MailPurpose::SYSTEM],
            'order-confirmation' => ['label' => 'Bestellbestätigung', 'purpose' => MailPurpose::BILLING],
            'cloud-ready' => ['label' => 'Cloud ist bereit (Zugangsdaten)', 'purpose' => MailPurpose::PROVISIONING],
            'maintenance-announcement' => ['label' => 'Wartungsfenster angekündigt', 'purpose' => MailPurpose::MAINTENANCE],
            'maintenance-cancelled' => ['label' => 'Wartungsfenster abgesagt', 'purpose' => MailPurpose::MAINTENANCE],
            // Die Erinnerung vor dem Laufzeitende (App\Mail\ServiceEndingSoonMail).
            // Kein Rundschreiben und keine Werbung, sondern eine Frist, auf die
            // der Empfänger wartet — PROVISIONING wie cloud-ready, weil es um
            // die Maschine selbst geht, nicht um Geld.
            'service-ending-soon' => ['label' => 'Cloud endet bald (Erinnerung)', 'purpose' => MailPurpose::PROVISIONING],
            'invoice' => ['label' => 'Rechnung', 'purpose' => MailPurpose::BILLING],
            'new-device' => ['label' => 'Anmeldung von einem neuen Gerät', 'purpose' => MailPurpose::SYSTEM],
            'dormant-warning' => ['label' => 'Konto ohne Paket wird gelöscht', 'purpose' => MailPurpose::SYSTEM],
            'operator-message' => ['label' => 'Nachricht aus der Konsole', 'purpose' => MailPurpose::SUPPORT],
            // Die sechs Texte des Mahnlaufs. Vorschaubar, weil sie die
            // unangenehmsten sind, die dieses Haus verschickt — und die
            // einzigen, die ein Kunde bekommt, wenn ohnehin gerade etwas
            // schiefläuft. Alle sechs aus dem BILLING-Postfach: eine Mahnung
            // ist immer eine Frage übers Geld.
            'dunning-0' => ['label' => 'Zahlung fehlgeschlagen (Hinweis)', 'purpose' => MailPurpose::BILLING],
            'dunning-1' => ['label' => 'Zahlungserinnerung (1. Mahnung)', 'purpose' => MailPurpose::BILLING],
            'dunning-2' => ['label' => '2. Mahnung (mit Mahnspesen)', 'purpose' => MailPurpose::BILLING],
            'dunning-3' => ['label' => '3. Mahnung (letzte vor Abschaltung)', 'purpose' => MailPurpose::BILLING],
            'cloud-suspended' => ['label' => 'Cloud abgeschaltet', 'purpose' => MailPurpose::BILLING],
            'cloud-resumed' => ['label' => 'Cloud läuft wieder', 'purpose' => MailPurpose::BILLING],
            // Sicherheit: die eine Meldung des Frühwarnsystems (BlockAddress).
            // EIN Eintrag, aber ZWEI Empfängerkreise — an den Inhaber, wenn
            // eine Adresse an seiner Instanz gesperrt wird, und an die
            // Betreiber mit `hosts.manage`, wenn es an einem Host passiert.
            // Beide Fälle tragen denselben Schlüssel, gehen also gemeinsam
            // dorthin, wohin die Wegwahl sie legt; welchen Text und welchen
            // Knopf sie bekommen, entscheidet SecurityBlockMail.
            'security-block' => ['label' => 'Adresse wegen Anmeldeversuchen gesperrt', 'purpose' => MailPurpose::SYSTEM],
        ];
    }

    public static function label(string $key): string
    {
        return self::all()[$key]['label'] ?? $key;
    }

    public static function purpose(string $key): string
    {
        return self::all()[$key]['purpose'] ?? MailPurpose::SYSTEM;
    }

    /**
     * Der Mailer dieser Mailart — also das SMTP-Konto, über das sie geht.
     *
     * Nicht `'cp_'.$purpose`, und das ist der ganze Punkt: die Wegwahl darf
     * nicht nur die Absenderzeile verschieben. Wer `security-block` auf `info@`
     * legt, will die Mail AUS `info@`, nicht mit `From: info@` durch die
     * Anmeldung von `no-reply@` — viele Server weisen genau das ab. `config/
     * mail.php` erzeugt zu jedem Schlüssel dieser Liste einen Mailer mit
     * derselben `mail_key`, und `MailboxTransport` fragt damit dieselbe
     * `MailRoute`, die auch den Umschlag entscheidet.
     *
     * Ohne Eintrag in der Wegwahl fällt beides auf den Zweck zurück, das
     * Verhalten bleibt also unverändert.
     */
    public static function mailer(string $key): string
    {
        // Ein Schlüssel, den diese Liste nicht kennt, bekommt den Mailer seines
        // Zwecks: config/mail.php erzeugt nur zu den Einträgen hier einen, und
        // Laravel würfe sonst "Mailer [...] is not defined" — die Mail ginge
        // dann gar nicht, statt wie zuvor aus dem Zweck-Postfach.
        return isset(self::all()[$key]) ? 'cp_mail_'.$key : 'cp_'.self::purpose($key);
    }
}
