<?php

namespace App\Livewire\Admin;

use App\Actions\StartHostOnboarding;
use App\Models\Datacenter;
use App\Support\HostEnrolment;
use App\Support\HostName;
use App\Support\HostTakeoverCommand;
use Livewire\Attributes\Layout;
use Livewire\Attributes\Validate;
use Livewire\Component;

#[Layout('layouts.admin')]
class HostCreate extends Component
{
    /**
     * Gesetzt, sobald der Host angelegt ist — und zugleich die Weiche der
     * Ansicht zwischen Formular und Bestätigung.
     */
    public ?string $createdUuid = null;

    public ?string $createdName = null;

    #[Validate('required|string|exists:datacenters,code,active,1')]
    public string $datacenter = '';

    public function mount(): void
    {
        $this->datacenter = (string) Datacenter::query()->active()->orderBy('name')->value('code');
    }

    #[Validate('required|ip|unique:hosts,public_ip')]
    public string $public_ip = '';

    #[Validate('required|string|min:8')]
    public string $root_password = '';

    public function save(StartHostOnboarding $action)
    {
        $this->authorize('hosts.manage');
        $data = $this->validate();

        $host = $action->run($data);

        // Der Einmal-Code und das Schlüsselpaar entstehen weiterhin: dieselbe
        // Methode legt auch die Tunneladresse und den öffentlichen Schlüssel am
        // Host an, und der Code trägt den Bootstrap-Weg, der über
        // Admin\ReissueTakeover erreichbar bleibt.
        //
        // Die BEFEHLSZEILE daraus zeigt diese Seite nicht mehr. Sie gehört zum
        // Rettungssystem-Weg, und das Speichern hier startet die
        // Provisionierungs-Pipeline: `EstablishSshTrust` meldet sich mit dem
        // Root-Passwort an einer laufenden Debian-Maschine an, danach kommt
        // Proxmox per Paket dazu. Es gibt für den Betreiber nichts zu kopieren.
        HostEnrolment::issueWithKeys($host);

        $this->createdUuid = $host->uuid;
        $this->createdName = $host->name;
    }

    public function render()
    {
        // Ein Name, der ohne Ankündigung entsteht, ist eine Überraschung. Die
        // Seite zeigt ihn, sobald ein Rechenzentrum gewählt ist — gelesen, nicht
        // reserviert (siehe HostName::preview).
        $preview = $this->datacenter === '' ? null : HostName::preview($this->datacenter);

        return view('livewire.admin.host-create', [
            'datacenters' => Datacenter::query()->active()->orderBy('name')->get(),
            'previewName' => $preview,
            'previewFqdn' => $preview === null ? null : HostName::fqdn($preview),
            // `archiveUrl` fiel weg: er war der Hinweis, woher die Bootstrap-
            // Zeile ihr Skript holt, und die Zeile zeigt diese Seite nicht mehr.
            // Die fehlenden Tunnel-Einstellungen bleiben — ohne sie kommt auch
            // die Pipeline nicht in den Tunnel.
            'missingSettings' => HostTakeoverCommand::missingSettings(),
        ]);
    }
}
