<?php // tests/Feature/Cancellation/ExportAnswerHasReadersTest.php

use App\Livewire\Admin\Instances as AdminInstances;
use App\Livewire\Settings;
use App\Models\Customer;
use App\Models\Instance;
use App\Models\Order;
use App\Models\User;
use Livewire\Livewire;

/**
 * Wer die Antwort auf die Exportfrage überhaupt zu sehen bekommt.
 *
 * Zwei Empfänger, die es vorher nicht gab: der Kunde auf seiner Vertragsseite
 * — dort stand ein einziger Satz, der JEDEM den Export versprach, auch dem,
 * der eine Sekunde vorher „Nein" gewählt hatte — und der Betreiber in der
 * Konsole, wo `export_wish` gar nicht vorkam. Ein Ja landete in einer Spalte
 * ohne Leser; die Frage im Kündigungsdialog war ein Formular ohne Empfänger.
 */

/**
 * Ein Kunde, dessen Kündigung vorgemerkt ist — der Zustand, in dem
 * ConfirmCancelPackage::cancelPackage() ihn auf die Vertragsseite umleitet.
 * Eigene Fixture statt der aus DashboardCountdownTest, damit ein gezielter
 * Lauf über nur diese Datei sie noch findet (siehe tests/Pest.php).
 *
 * @return array{0: User, 1: Instance}
 */
function kundeMitVorgemerkterKuendigung(?bool $exportWunsch): array
{
    $user = User::factory()->create(['email' => 'vertrag@example.test', 'email_verified_at' => now()]);

    $customer = Customer::factory()->create([
        'email' => 'vertrag@example.test',
        'user_id' => $user->id,
        'status' => 'active',
    ]);

    $order = Order::factory()->create(['customer_id' => $customer->id, 'plan' => 'team']);

    $instance = Instance::factory()->create([
        'customer_id' => $customer->id,
        'order_id' => $order->id,
        'plan' => 'team',
        'status' => 'cancellation_scheduled',
        'subdomain' => 'vertrag',
        'cancel_requested_at' => now()->subDay(),
        'service_ends_at' => now()->addDays(20),
        'export_wish' => $exportWunsch,
    ]);

    return [$user, $instance->refresh()];
}

it('verspricht keinen Export, wenn der Kunde gerade Nein gesagt hat', function () {
    // K2: zwei richtige Bauteile, ein Bildschirm dazwischen, der beiden
    // widersprach. Der Dialog schreibt korrekt `false` und leitet auf genau
    // diese Seite um — und das Erste, was der Kunde dort las, war, dass er
    // den Export bekommt.
    [$user, $instance] = kundeMitVorgemerkterKuendigung(false);

    Livewire::actingAs($user)->test(Settings::class, ['tab' => 'contract'])
        ->assertSee(__('settings.cancel_scheduled_body_no', [
            'date' => $instance->service_ends_at->local()->isoFormat('LL'),
        ]))
        ->assertDontSee(__('settings.cancel_scheduled_body_yes', [
            'date' => $instance->service_ends_at->local()->isoFormat('LL'),
        ]));
});

it('nennt den Export nur dem, der ihn wollte', function () {
    [$user, $instance] = kundeMitVorgemerkterKuendigung(true);

    Livewire::actingAs($user)->test(Settings::class, ['tab' => 'contract'])
        ->assertSee(__('settings.cancel_scheduled_body_yes', [
            'date' => $instance->service_ends_at->local()->isoFormat('LL'),
        ]));
});

it('fragt auf der Vertragsseite nach, wenn niemand gefragt wurde', function () {
    // `null` heißt: vor dieser Ausrollung gekündigt. Der Satz fragt dann,
    // statt zu versprechen — und sagt, was passiert, wenn die Frage offen
    // bleibt.
    [$user, $instance] = kundeMitVorgemerkterKuendigung(null);

    Livewire::actingAs($user)->test(Settings::class, ['tab' => 'contract'])
        ->assertSee(__('settings.cancel_scheduled_body_open', [
            'date' => $instance->service_ends_at->local()->isoFormat('LL'),
        ]))
        ->assertDontSee(__('settings.cancel_scheduled_body_yes', [
            'date' => $instance->service_ends_at->local()->isoFormat('LL'),
        ]));
});

it('zeigt dem Betreiber, wer einen Export bestellt hat und bis wann', function () {
    // W1: ohne diesen Abschnitt hatte ein „Ja" in der ganzen Konsole keinen
    // einzigen Leser — ein grep über app/ und die Konsolenansichten fand
    // ausserhalb dieses Vorhabens keinen Treffer. Beides muss dastehen: wer,
    // und wann dessen Laufzeit endet.
    $customer = Customer::factory()->create(['name' => 'Exportkundin GmbH']);
    $instance = Instance::factory()->create([
        'customer_id' => $customer->id,
        'status' => 'cancellation_scheduled',
        'subdomain' => 'exportkundin',
        'service_ends_at' => now()->addDays(9),
        'export_wish' => true,
    ]);

    Livewire::actingAs(admin(), 'operator')->test(AdminInstances::class)
        ->assertSee(__('admin.export_wish.title'))
        ->assertSee('Exportkundin GmbH')
        ->assertSee($instance->service_ends_at->local()->isoFormat('LL'));
});

it('fuehrt in der Konsole niemanden auf, der keinen Export wollte', function () {
    // Ein Nein und ein unbeantwortetes Null sind beide keine Bestellung. Der
    // Abschnitt erscheint gar nicht erst — ein dauerhaft leerer Kasten wird
    // nach der zweiten Woche nicht mehr gelesen. Geprüft an der Überschrift
    // und nicht am Kundennamen: der steht ohnehin in der Instanzliste
    // darunter, und eine Zusicherung darauf wäre aus dem falschen Grund rot.
    $customer = Customer::factory()->create(['name' => 'Neinkundin GmbH']);
    Instance::factory()->create([
        'customer_id' => $customer->id,
        'status' => 'cancellation_scheduled',
        'subdomain' => 'neinkundin',
        'service_ends_at' => now()->addDays(9),
        'export_wish' => false,
    ]);
    Instance::factory()->create([
        'status' => 'cancellation_scheduled',
        'subdomain' => 'niegefragt',
        'service_ends_at' => now()->addDays(9),
    ]);

    Livewire::actingAs(admin(), 'operator')->test(AdminInstances::class)
        ->assertDontSee(__('admin.export_wish.title'));
});
