<?php

use App\Mail\NewDeviceSignInMail;
use App\Models\User;
use Illuminate\Auth\Events\Login;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Mail;

/**
 * Zwei identische „neues Gerät"-Mails im selben Augenblick.
 *
 * Gemessen, nicht vermutet — `Event::getRawListeners()` führte den Listener
 * zweimal:
 *
 *   App\Listeners\RecordSignInDevice          ← Laravel findet ihn selbst
 *   App\Listeners\RecordSignInDevice@handle   ← die Zeile im AppServiceProvider
 *
 * Laravel 11+ erkennt Listener in `app/Listeners` an der Typangabe ihrer
 * handle()-Methode. Die ausdrückliche Registrierung war zu der Zeit richtig,
 * als sie geschrieben wurde, und ist seither eine zweite Anmeldung desselben
 * Empfängers. Der Kopfkommentar des Listeners begründet, warum am EVENT
 * gehorcht wird und nicht an den zwei Anmeldewegen — diese Begründung trägt die
 * automatische Erkennung genauso.
 */
it('registers the sign-in listener exactly once', function () {
    $listeners = Event::getRawListeners()[Login::class] ?? [];

    expect($listeners)->toHaveCount(1);
});

it('sends one new-device mail per sign-in, not two', function () {
    // Der Test, der wirklich zählt: nicht wie oft etwas registriert ist,
    // sondern wie oft der Kunde etwas bekommt.
    Mail::fake();

    $user = User::factory()->create();

    // Erste Anmeldung überhaupt: die warnt bewusst nicht (siehe
    // DeviceRecognition — jemandem das Gerät zu melden, mit dem er sich gerade
    // anmeldet, ist keine Warnung).
    Event::dispatch(new Login('web', $user, false));
    Mail::assertNothingQueued();

    // Zweite Anmeldung, neues Gerät: genau EINE Mail.
    request()->cookies->remove('clupilot_device');
    Event::dispatch(new Login('web', $user, false));

    Mail::assertQueued(NewDeviceSignInMail::class, 1);
});
