<?php

namespace App\Support;

/**
 * Ein Name, seine Adressen — A und AAAA.
 *
 * Eine eigene Klasse statt eines nackten `gethostbynamel()` an der
 * Verwendungsstelle, damit ein Test sie im Container ersetzen kann
 * (`app()->instance(DnsLookup::class, …)`, wie FakeRemoteShell und
 * FakeProxmoxClient es für SSH und Proxmox schon vormachen). Ein Test, der für
 * seine Zusicherung echtes DNS bräuchte, prüft nicht die Regel, sondern das
 * Netz des Rechners, auf dem er gerade läuft.
 *
 * Ein Name, der sich nicht auflösen lässt, ergibt ein leeres Feld — kein
 * Fehler. Der einzige Aufrufer (BlockAddress::exemptRanges()) behandelt das
 * wie einen leeren Eintrag.
 */
class DnsLookup
{
    /** @return array<int, string> */
    public function addressesFor(string $name): array
    {
        $v4 = gethostbynamel($name);

        // Getrennt geholt, weil gethostbynamel() nur A-Records kennt. Ein
        // Endpunkt, der ausschließlich per AAAA existiert, wäre sonst still
        // nicht ausgenommen — genau der Fehler, den dieser Umbau schließt, nur
        // eine Adressfamilie weiter.
        $records = @dns_get_record($name, DNS_AAAA) ?: [];

        $v6 = array_values(array_filter(array_map(
            fn (array $record): string => (string) ($record['ipv6'] ?? ''),
            $records,
        )));

        return array_values(array_unique(array_merge(
            is_array($v4) ? $v4 : [],
            $v6,
        )));
    }
}
