<?php

use App\Livewire\Admin\HostCreate;
use App\Livewire\Admin\Hosts;
use App\Models\Operator;
use Livewire\Features\SupportTesting\Testable;
use Livewire\Livewire;

beforeEach(function () {
    fakeServices();
    config()->set('admin_access.app_host', 'app.clupilot.com');
    config()->set('provisioning.dns.platform_zone', 'clupilot.com');
});

function guidePage(string $component): Testable
{
    return Livewire::actingAs(Operator::factory()->role('Owner')->create(), 'operator')->test($component);
}

/**
 * Der eigentliche Fund, der diese Datei nötig gemacht hat.
 *
 * Die erste Fassung zeigte die Anleitung ERST NACH dem Anlegen. Ihre Schritte 1
 * und 2 passieren aber beim Anbieter — Server bestellen, Rettungssystem starten
 * —, und wer sie dort zum ersten Mal liest, hat den Einmal-Code schon in der
 * Zwischenablage und dessen 24-Stunden-Frist läuft bereits.
 */
it('explains the whole procedure before anything is created', function () {
    $page = guidePage(HostCreate::class);

    // Alle sechs, als Schiene — kurze Beschriftungen, damit die Seite eine
    // Seite bleibt und keine Textwand wird. Das war der zweite Fund: sechs
    // Absätze übereinander beantworteten alles und zeigten nichts.
    foreach (range(1, 3) as $step) {
        $page->assertSee(__("hosts.takeover.s{$step}_label"));
    }

    // Der beim Anbieter ausführlich, weil er VOR dem Speichern erledigt sein
    // muss und nur hier erklärt wird.
    $page->assertSee(__('hosts.takeover.s1_body'));
});

/**
 * Und schon auf der Liste, nicht erst hinter „Host hinzufügen": wer dort steht,
 * hat den Server womöglich noch gar nicht bestellt — und genau das ist Schritt 1.
 */
it('offers the same procedure on the hosts list', function () {
    guidePage(Hosts::class)
        ->assertSee(__('hosts.takeover.how_title'))
        ->assertSee(__('hosts.takeover.s1_title'))
        ->assertSee(__('hosts.takeover.s2_title'));
});

/**
 * Die zwei Schritte beim Anbieter sind als solche gekennzeichnet. Ohne die
 * Markierung liest sich die Liste, als könne man oben anfangen und sich
 * durcharbeiten — und Schritt 2 ist dann eine halbe Stunde Wartezeit mitten
 * in einem laufenden Code.
 */
it('marks the provider step as something to do first', function () {
    guidePage(HostCreate::class)->assertSee(__('hosts.takeover.badge_before'));
});

/**
 * Vor dem Anlegen gibt es keine Befehlszeile — sonst stünde dort eine, die zu
 * keinem Host gehört.
 */
it('shows no command until a host exists', function () {
    guidePage(HostCreate::class)->assertDontSee('--wg-private');
});
