<?php

use App\Mail\DunningNoticeMail;
use App\Mail\InvoiceMail;
use App\Mail\MaintenanceAnnouncementMail;
use App\Mail\ResetPasswordMail;
use App\Services\Mail\MailLane;
use App\Support\Settings;

/**
 * Welche Mail in welcher Spur fährt.
 *
 * Die Vorgaben stehen im Code, die Änderung des Betreibers darüber. Gesperrt
 * sind die Mails, auf die gerade ein Mensch wartet: ein Kennwort-Zurücksetzen,
 * das zwanzig Minuten liegt, ist ein Supportfall und kein gespartes Ansehen.
 */
it('kennt die Vorgabe jeder Mailklasse', function () {
    expect(MailLane::for(ResetPasswordMail::class))->toBe(MailLane::DIRECT)
        ->and(MailLane::for(MaintenanceAnnouncementMail::class))->toBe(MailLane::URGENT)
        ->and(MailLane::for(InvoiceMail::class))->toBe(MailLane::CALM)
        ->and(MailLane::for(DunningNoticeMail::class))->toBe(MailLane::CALM);
});

it('schickt eine unbekannte Mailklasse in die ruhige Spur', function () {
    expect(MailLane::for('App\\Mail\\GibtEsNichtMail'))->toBe(MailLane::CALM);
});

it('lässt den Betreiber eine Mail verschieben', function () {
    MailLane::assign(InvoiceMail::class, MailLane::URGENT);

    expect(MailLane::for(InvoiceMail::class))->toBe(MailLane::URGENT);
});

it('sperrt die Mails, auf die jemand wartet', function () {
    expect(MailLane::isLocked(ResetPasswordMail::class))->toBeTrue()
        ->and(MailLane::isLocked(InvoiceMail::class))->toBeFalse();

    expect(fn () => MailLane::assign(ResetPasswordMail::class, MailLane::CALM))
        ->toThrow(RuntimeException::class);

    expect(MailLane::for(ResetPasswordMail::class))->toBe(MailLane::DIRECT);
});

it('lässt eine gespeicherte Zuordnung eine gesperrte Klasse nicht überschreiben', function () {
    // Nicht über assign(), sondern direkt in die Einstellung geschrieben — so
    // sähe es aus, wenn jemand an der Prüfung vorbei schreibt.
    Settings::set('mail.lanes', [ResetPasswordMail::class => MailLane::CALM]);

    expect(MailLane::for(ResetPasswordMail::class))->toBe(MailLane::DIRECT);
});
