<?php

namespace App\Livewire\Admin;

use App\Actions\StartHostOnboarding;
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
{
    /**
     * Die fertige Befehlszeile — gesetzt, sobald der Host angelegt ist.
     *
     * Sie wird GENAU EINMAL gezeigt. In der Datenbank steht nur der Hash des
     * Codes, und der private Schlüssel steht dort überhaupt nicht; wer die Seite
     * neu lädt, bekommt sie nicht wieder, sondern legt einen neuen Code an. Das
     * ist kein Versehen, sondern der Grund, warum ein abgefangener Blick auf
     * einen Bildschirm später nichts mehr wert ist.
     */
    public ?string $command = null;

    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) \App\Models\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);

        // Kein Weiterleiten mehr. Die Befehlszeile gibt es nur hier und nur
        // jetzt — wer den Betreiber auf eine andere Seite schickt, schickt ihn
        // von dem einzigen Wert weg, den er braucht.
        $this->command = HostTakeoverCommand::for($host, 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' => \App\Models\Datacenter::query()->active()->orderBy('name')->get(),
            'previewName' => $preview,
            'previewFqdn' => $preview === null ? null : HostName::fqdn($preview),
            'archiveUrl' => HostTakeoverCommand::archiveUrl(),
            'missingSettings' => HostTakeoverCommand::missingSettings(),
        ]);
    }
}
