<?php
declare(strict_types=1);

require_once __DIR__ . '/includes/auth.php';
$currentUser = auth_permission('customer.read');

function h(mixed $value): string
{
    return htmlspecialchars((string) ($value ?? ''), ENT_QUOTES, 'UTF-8');
}

function nullable(string $value): ?string
{
    $value = trim($value);
    return $value === '' ? null : $value;
}

function copyValue(mixed $value, string $label, string $field): string
{
    $text = (string) ($value ?? '');
    $empty = $text === '';
    $description = $empty ? $label . ': kein Wert vorhanden' : $label . ' kopieren';
    return '<span class="copy-value"><span>' . h($empty ? '–' : $text) . '</span>'
        . '<button type="button" class="copy-value-button" data-copy-value="' . h($text)
        . '" data-copy-field="' . h($field) . '" aria-label="' . h($description)
        . '" title="' . h($description) . '"' . ($empty ? ' disabled' : '') . '>'
        . '<svg viewBox="0 0 24 24" width="16" height="16" aria-hidden="true" focusable="false">'
        . '<rect x="8" y="8" width="12" height="12" rx="2"/><path d="M16 8V4H4v12h4"/>'
        . '</svg></button></span>';
}

function postString(string $key): string
{
    return trim((string) ($_POST[$key] ?? ''));
}

function isValidHomepage(string $url): bool
{
    if (filter_var($url, FILTER_VALIDATE_URL) === false) {
        return false;
    }

    $scheme = strtolower((string) parse_url($url, PHP_URL_SCHEME));
    return in_array($scheme, ['http', 'https'], true);
}

function normalizePostedLocations(mixed $postedLocations): array
{
    if (!is_array($postedLocations)) {
        return [];
    }

    $locations = [];

    foreach ($postedLocations as $index => $location) {
        if (!is_array($location)) {
            continue;
        }

        $normalized = [
            'strasse' => trim((string) ($location['strasse'] ?? '')),
            'hausnummer' => trim((string) ($location['hausnummer'] ?? '')),
            'plz' => trim((string) ($location['plz'] ?? '')),
            'ort' => trim((string) ($location['ort'] ?? '')),
        ];

        if ((int) $index === 0 || implode('', $normalized) !== '') {
            $locations[] = $normalized;
        }
    }

    return array_values($locations);
}

function genderLabel(?string $gender): string
{
    return match ($gender) {
        'maennlich' => 'Männlich',
        'weiblich' => 'Weiblich',
        default => '–',
    };
}

function uploadImage(
    array $file,
    string $directory,
    string $relativeDirectory,
    string $prefix
): ?string {
    if (($file['error'] ?? UPLOAD_ERR_NO_FILE) === UPLOAD_ERR_NO_FILE) {
        return null;
    }

    if (($file['error'] ?? UPLOAD_ERR_OK) !== UPLOAD_ERR_OK) {
        throw new RuntimeException('Die Bilddatei konnte nicht hochgeladen werden.');
    }

    if (($file['size'] ?? 0) > 8 * 1024 * 1024) {
        throw new RuntimeException('Die Bilddatei darf maximal 8 MB groß sein.');
    }

    $finfo = new finfo(FILEINFO_MIME_TYPE);
    $mime = $finfo->file($file['tmp_name']);

    $types = [
        'image/jpeg' => 'jpg',
        'image/png'  => 'png',
        'image/webp' => 'webp',
    ];

    if (!isset($types[$mime])) {
        throw new RuntimeException('Erlaubt sind JPG, PNG und WebP.');
    }

    if (!is_dir($directory) && !mkdir($directory, 0755, true) && !is_dir($directory)) {
        throw new RuntimeException('Der Upload-Ordner konnte nicht angelegt werden.');
    }

    $safePrefix = preg_replace('/[^A-Za-z0-9_-]/', '_', $prefix);
    $filename = $safePrefix . '_' . bin2hex(random_bytes(6)) . '.' . $types[$mime];
    $target = rtrim($directory, '/') . '/' . $filename;

    if (!move_uploaded_file($file['tmp_name'], $target)) {
        throw new RuntimeException('Die Bilddatei konnte nicht gespeichert werden.');
    }

    return rtrim($relativeDirectory, '/') . '/' . $filename;
}

function fetchOne(PDO $pdo, string $sql, array $params): ?array
{
    $stmt = $pdo->prepare($sql);
    $stmt->execute($params);
    $row = $stmt->fetch();
    return $row ?: null;
}

function upsertSection(PDO $pdo, string $customerNumber, string $section, int $active): void
{
    $stmt = $pdo->prepare(
        'INSERT INTO kunden_bereiche (kundennummer, bereich, aktiv)
         VALUES (:kundennummer, :bereich, :aktiv)
         ON DUPLICATE KEY UPDATE aktiv = VALUES(aktiv)'
    );
    $stmt->execute([
        ':kundennummer' => $customerNumber,
        ':bereich' => $section,
        ':aktiv' => $active,
    ]);
}

$errors = [];
$isArchived = false;
$successMessage = (string) ($_SESSION['flash_success'] ?? '');
unset($_SESSION['flash_success']);

$kundennummer = trim((string) ($_GET['kundennummer'] ?? $_POST['original_kundennummer'] ?? ''));
$customerSelected = $kundennummer !== '';
$customerMissing = false;
$kunde = null;

if ($customerSelected) {
    $kunde = fetchOne(
        $pdo,
        'SELECT * FROM kunden WHERE kundennummer = :kundennummer',
        [':kundennummer' => $kundennummer]
    );

    if (!$kunde) {
        http_response_code(404);
        $customerMissing = true;
    }
}

if ($customerSelected && !$customerMissing && empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

if ($customerSelected && !$customerMissing) {
    $isArchived = (int) ($kunde['archiviert'] ?? 0) === 1;
}

if ($customerSelected && !$customerMissing && $_SERVER['REQUEST_METHOD'] === 'POST') {
    auth_check_post();
    if (!auth_can($currentUser, 'customer.write')) auth_deny();
    if ($kundennummer !== (string)($_POST['original_kundennummer'] ?? '')) auth_deny();
    if ($isArchived) {
        http_response_code(403);
        exit('Archivierte Kunden können nicht bearbeitet werden.');
    }

    $csrf = (string) ($_POST['csrf_token'] ?? '');

    if (!hash_equals($_SESSION['csrf_token'], $csrf)) {
        $errors[] = 'Die Anfrage konnte nicht verifiziert werden. Bitte die Seite neu laden.';
    }

    $originalNumber = postString('original_kundennummer');
    $newNumber = postString('kundennummer');
    $firmenname = postString('firmenname');
    $ssvStatus = postString('ssv_status');
    $homepage = postString('homepage');
    $tenantId = postString('tenant_id');
    if ($tenantId !== '' && !preg_match('/\A[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\z/', $tenantId)) {
        $errors[] = 'Die Tenant-ID muss aus 36 Zeichen im Format 12345678-abcd-1234-abcd-123456789abc bestehen (nur 0–9 und a–f).';
    }
    $sonstiges = postString('sonstiges');
    $postedLocations = normalizePostedLocations($_POST['standorte'] ?? []);

    if ($newNumber === '') {
        $errors[] = 'Die Kundennummer darf nicht leer sein.';
    } elseif (!preg_match('/\AKD[0-9]{7}\z/', $newNumber)) {
        $errors[] = 'Die Kundennummer muss aus „KD“ und genau sieben Ziffern bestehen (insgesamt 9 Zeichen).';
    }

    if ($firmenname === '') {
        $errors[] = 'Der Firmenname darf nicht leer sein.';
    } else {
        $duplicateNameStmt = $pdo->prepare(
            'SELECT kundennummer
             FROM kunden
             WHERE firmenname = :firmenname
               AND kundennummer <> :kundennummer
             LIMIT 1'
        );
        $duplicateNameStmt->execute([
            ':firmenname' => $firmenname,
            ':kundennummer' => $originalNumber,
        ]);

        if ($duplicateNameStmt->fetch()) {
            $errors[] = 'Ein anderer Kunde mit diesem Firmennamen existiert bereits.';
        }
    }
    if ($ssvStatus !== '' && !in_array($ssvStatus, ['-', 'Bronze', 'Silber', 'Gold', 'Platin'], true)) {
        $errors[] = 'Ungültiger SSV-Status.';
    }

    if ($homepage !== '' && !isValidHomepage($homepage)) {
        $errors[] = 'Die Homepage muss als vollständige HTTP- oder HTTPS-Adresse angegeben werden, z. B. https://www.example.de.';
    }

    foreach ([1, 2] as $n) {
        $firstName = postString("contact{$n}_vorname");
        $lastName = postString("contact{$n}_nachname");
        $gender = postString("contact{$n}_geschlecht");
        $position = postString("contact{$n}_position");
        $phone = postString("contact{$n}_telefon");
        $email = postString("contact{$n}_email");

        $hasAnyData =
            $firstName !== '' ||
            $lastName !== '' ||
            $gender !== '' ||
            $position !== '' ||
            $phone !== '' ||
            $email !== '';

        if ($n === 1) {
            if ($firstName === '') {
                $errors[] = 'Ansprechpartner 1 benötigt einen Vornamen.';
            }
            if ($lastName === '') {
                $errors[] = 'Ansprechpartner 1 benötigt einen Nachnamen.';
            }
        } elseif ($hasAnyData) {
            if ($firstName === '') {
                $errors[] = 'Bitte für Ansprechpartner 2 auch einen Vornamen angeben.';
            }
            if ($lastName === '') {
                $errors[] = 'Bitte für Ansprechpartner 2 auch einen Nachnamen angeben.';
            }
        }

        if ($gender !== '' && !in_array($gender, ['maennlich', 'weiblich'], true)) {
            $errors[] = "Ungültige Geschlechtsangabe bei Ansprechpartner {$n}.";
        }

        if ($email !== '' && filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
            $errors[] = "Die E-Mail-Adresse von Ansprechpartner {$n} ist ungültig.";
        }
    }

    if (!$postedLocations) {
        $errors[] = 'Die Firmenanschrift fehlt.';
    } else {
        foreach ($postedLocations as $index => $location) {
            $label = $index === 0 ? 'Firmenanschrift' : 'Standort ' . ($index + 1);

            foreach ([
                'strasse' => 'Straße',
                'hausnummer' => 'Hausnummer',
                'plz' => 'Postleitzahl',
                'ort' => 'Ort',
            ] as $field => $fieldLabel) {
                if ($location[$field] === '') {
                    $errors[] = "Beim {$label} muss das Feld „{$fieldLabel}“ ausgefüllt werden.";
                }
            }

            if (preg_match('/\p{N}/u', $location['strasse']) !== 0) {
                $errors[] = "Die Straße beim {$label} darf keine Zahlen enthalten. Bitte die Hausnummer separat eintragen.";
            }
            if ($location['plz'] !== '' && !preg_match('/^[0-9]{5}$/', $location['plz'])) {
                $errors[] = "Die Postleitzahl beim {$label} muss aus fünf Ziffern bestehen.";
            }
        }
    }

    $postedVms = $_POST['vms'] ?? [];
    if (!is_array($postedVms)) {
        $postedVms = [];
    }

    foreach ($postedVms as $vmData) {
        if (!is_array($vmData)) {
            continue;
        }

        $vmName = trim((string) ($vmData['vm_name'] ?? ''));
        $hasVmData = $vmName !== '';

        foreach ([
            $vmData['vm_id'] ?? '',
            $vmData['typ'] ?? '',
            $vmData['betriebssystem'] ?? '',
            $vmData['ram_mb'] ?? '',
            $vmData['cpu_anzahl'] ?? '',
            $vmData['bemerkung'] ?? '',
        ] as $value) {
            if (trim((string) $value) !== '') {
                $hasVmData = true;
                break;
            }
        }

        $adapterData = is_array($vmData['adapter'] ?? null) ? $vmData['adapter'] : [];
        foreach ($adapterData as $value) {
            if (trim((string) $value) !== '') {
                $hasVmData = true;
                break;
            }
        }

        $diskData = is_array($vmData['disks'] ?? null) ? $vmData['disks'] : [];
        foreach ($diskData as $disk) {
            if (is_array($disk) && trim((string) ($disk['size'] ?? '')) !== '') {
                $hasVmData = true;
                break;
            }
        }

        if ($hasVmData && $vmName === '') {
            $errors[] = 'Jede eingetragene VM benötigt einen VM-Namen.';
        }
    }

    $uploadedLogo = null;
    $oldLogoPath = $kunde['logo_pfad'] ?? null;

    $existingNetwork = fetchOne(
        $pdo,
        'SELECT * FROM netzwerk WHERE kundennummer = :kundennummer',
        [':kundennummer' => $originalNumber]
    );

    if (!$errors) {
        try {
            $uploadedLogo = uploadImage(
                $_FILES['customer_logo'] ?? [],
                __DIR__ . '/uploads/kundenlogos',
                'uploads/kundenlogos',
                $newNumber
            );

            $pdo->beginTransaction();
            $auditBefore = audit_customer_snapshot($pdo, $originalNumber);
            if ($auditBefore['Kundenstammdaten']['Stammdaten'][0]['archiviert'] === '1') {
                throw new RuntimeException('Archivierte Kunden können nicht bearbeitet werden.');
            }

            $logoPath = $uploadedLogo ?? $oldLogoPath;
            $primaryLocation = $postedLocations[0];

            $stmt = $pdo->prepare(
                'UPDATE kunden
                 SET kundennummer = :new_number,
                     firmenname = :firmenname,
                     ssv_status = :ssv_status,
                     homepage = :homepage,
                     strasse = :strasse,
                     hausnummer = :hausnummer,
                     plz = :plz,
                     ort = :ort,
                     sonstiges = :sonstiges,
                     logo_pfad = :logo_pfad
                 WHERE kundennummer = :old_number'
            );
            $stmt->execute([
                ':new_number' => $newNumber,
                ':firmenname' => $firmenname,
                ':ssv_status' => nullable($ssvStatus),
                ':homepage' => nullable($homepage),
                ':strasse' => nullable($primaryLocation['strasse']),
                ':hausnummer' => nullable($primaryLocation['hausnummer']),
                ':plz' => nullable($primaryLocation['plz']),
                ':ort' => nullable($primaryLocation['ort']),
                ':sonstiges' => nullable($sonstiges),
                ':logo_pfad' => $logoPath,
                ':old_number' => $originalNumber,
            ]);

            // Ansprechpartner bewusst neu schreiben: maximal zwei Einträge.
            $stmt = $pdo->prepare('DELETE FROM ansprechpartner WHERE kundennummer = :kundennummer');
            $stmt->execute([':kundennummer' => $newNumber]);

            $contactStmt = $pdo->prepare(
                'INSERT INTO ansprechpartner
                    (kundennummer, name, vorname, nachname, geschlecht, telefon, email, position)
                 VALUES
                    (:kundennummer, :name, :vorname, :nachname, :geschlecht, :telefon, :email, :position)'
            );

            foreach ([1, 2] as $n) {
                $firstName = postString("contact{$n}_vorname");
                $lastName = postString("contact{$n}_nachname");

                if ($firstName === '' && $lastName === '') {
                    continue;
                }

                $contactStmt->execute([
                    ':kundennummer' => $newNumber,
                    // Das alte Feld name bleibt für Abwärtskompatibilität befüllt.
                    ':name' => trim($firstName . ' ' . $lastName),
                    ':vorname' => nullable($firstName),
                    ':nachname' => nullable($lastName),
                    ':geschlecht' => nullable(postString("contact{$n}_geschlecht")),
                    ':telefon' => nullable(postString("contact{$n}_telefon")),
                    ':email' => nullable(postString("contact{$n}_email")),
                    ':position' => nullable(postString("contact{$n}_position")),
                ]);
            }

            // Standorte ebenfalls neu schreiben. Die erste Zeile ist immer die Firmenanschrift.
            $stmt = $pdo->prepare('DELETE FROM standorte WHERE kundennummer = :kundennummer');
            $stmt->execute([':kundennummer' => $newNumber]);

            $locationStmt = $pdo->prepare(
                'INSERT INTO standorte
                    (kundennummer, sortierung, ist_firmenanschrift, strasse, hausnummer, plz, ort)
                 VALUES
                    (:kundennummer, :sortierung, :ist_firmenanschrift, :strasse, :hausnummer, :plz, :ort)'
            );

            foreach ($postedLocations as $index => $location) {
                $locationStmt->execute([
                    ':kundennummer' => $newNumber,
                    ':sortierung' => $index + 1,
                    ':ist_firmenanschrift' => $index === 0 ? 1 : 0,
                    ':strasse' => $location['strasse'],
                    ':hausnummer' => $location['hausnummer'],
                    ':plz' => $location['plz'],
                    ':ort' => $location['ort'],
                ]);
            }

            $knownSections = [
                'hosting',
                'm365',
                'firewall',
                'hardware_onprem',
                'backup',
                'antivirus',
                'netzwerk',
            ];

            foreach ($knownSections as $section) {
                $active = isset($_POST['bereich'][$section]) ? 1 : 0;
                upsertSection($pdo, $newNumber, $section, $active);
            }

            // Hosting: mehrere VMs pro Kunde.
            $existingVmStmt = $pdo->prepare(
                'SELECT id
                 FROM hosting_vms
                 WHERE kundennummer = :kundennummer'
            );
            $existingVmStmt->execute([':kundennummer' => $newNumber]);
            $existingVmIds = array_map(
                'intval',
                array_column($existingVmStmt->fetchAll(), 'id')
            );

            $keptVmIds = [];

            foreach ($postedVms as $vmData) {
                if (!is_array($vmData)) {
                    continue;
                }

                $vmDbId = (int) ($vmData['db_id'] ?? 0);
                $vmName = trim((string) ($vmData['vm_name'] ?? ''));
                $vmExternalId = trim((string) ($vmData['vm_id'] ?? ''));
                $vmType = trim((string) ($vmData['typ'] ?? ''));
                $vmOs = trim((string) ($vmData['betriebssystem'] ?? ''));
                $vmRam = trim((string) ($vmData['ram_mb'] ?? ''));
                $vmCpu = trim((string) ($vmData['cpu_anzahl'] ?? ''));
                $vmNote = trim((string) ($vmData['bemerkung'] ?? ''));

                $adapterData = is_array($vmData['adapter'] ?? null)
                    ? $vmData['adapter']
                    : [];

                $diskData = is_array($vmData['disks'] ?? null)
                    ? $vmData['disks']
                    : [];

                $hasAnyData = $vmName !== '';
                foreach ([
                    $vmExternalId,
                    $vmType,
                    $vmOs,
                    $vmRam,
                    $vmCpu,
                    $vmNote,
                    $adapterData['interface_name'] ?? '',
                    $adapterData['mac_adresse'] ?? '',
                    $adapterData['ip_adresse'] ?? '',
                    $adapterData['prefix_laenge'] ?? '',
                    $adapterData['gateway'] ?? '',
                    $adapterData['vlan_id'] ?? '',
                ] as $value) {
                    if (trim((string) $value) !== '') {
                        $hasAnyData = true;
                        break;
                    }
                }

                if (!$hasAnyData) {
                    foreach ($diskData as $disk) {
                        if (is_array($disk) &&
                            trim((string) ($disk['size'] ?? '')) !== '') {
                            $hasAnyData = true;
                            break;
                        }
                    }
                }

                if (!$hasAnyData || $vmName === '') {
                    continue;
                }

                if ($vmDbId > 0 && in_array($vmDbId, $existingVmIds, true)) {
                    $stmt = $pdo->prepare(
                        'UPDATE hosting_vms
                         SET vm_name = :vm_name,
                             vm_id = :vm_id,
                             typ = :typ,
                             betriebssystem = :betriebssystem,
                             ram_mb = :ram_mb,
                             cpu_anzahl = :cpu_anzahl,
                             bemerkung = :bemerkung
                         WHERE id = :id
                           AND kundennummer = :kundennummer'
                    );
                    $stmt->execute([
                        ':vm_name' => $vmName,
                        ':vm_id' => $vmExternalId === '' ? null : (int) $vmExternalId,
                        ':typ' => nullable($vmType),
                        ':betriebssystem' => nullable($vmOs),
                        ':ram_mb' => $vmRam === '' ? null : (int) $vmRam,
                        ':cpu_anzahl' => $vmCpu === '' ? null : (int) $vmCpu,
                        ':bemerkung' => nullable($vmNote),
                        ':id' => $vmDbId,
                        ':kundennummer' => $newNumber,
                    ]);
                } else {
                    $stmt = $pdo->prepare(
                        'INSERT INTO hosting_vms
                            (kundennummer, vm_name, vm_id, typ, betriebssystem,
                             ram_mb, cpu_anzahl, bemerkung)
                         VALUES
                            (:kundennummer, :vm_name, :vm_id, :typ, :betriebssystem,
                             :ram_mb, :cpu_anzahl, :bemerkung)'
                    );
                    $stmt->execute([
                        ':kundennummer' => $newNumber,
                        ':vm_name' => $vmName,
                        ':vm_id' => $vmExternalId === '' ? null : (int) $vmExternalId,
                        ':typ' => nullable($vmType),
                        ':betriebssystem' => nullable($vmOs),
                        ':ram_mb' => $vmRam === '' ? null : (int) $vmRam,
                        ':cpu_anzahl' => $vmCpu === '' ? null : (int) $vmCpu,
                        ':bemerkung' => nullable($vmNote),
                    ]);
                    $vmDbId = (int) $pdo->lastInsertId();
                }

                $keptVmIds[] = $vmDbId;

                $interfaceName = trim((string) ($adapterData['interface_name'] ?? ''));
                $macAddress = trim((string) ($adapterData['mac_adresse'] ?? ''));
                $ipAddress = trim((string) ($adapterData['ip_adresse'] ?? ''));
                $prefixLength = trim((string) ($adapterData['prefix_laenge'] ?? ''));
                $gateway = trim((string) ($adapterData['gateway'] ?? ''));
                $vlanId = trim((string) ($adapterData['vlan_id'] ?? ''));

                $hasAdapterData =
                    $interfaceName !== '' ||
                    $macAddress !== '' ||
                    $ipAddress !== '' ||
                    $prefixLength !== '' ||
                    $gateway !== '' ||
                    $vlanId !== '';

                if ($hasAdapterData) {
                    $stmt = $pdo->prepare(
                        'INSERT INTO vm_netzwerkadapter
                            (vm_id, adapter_nr, interface_name, mac_adresse,
                             ip_adresse, prefix_laenge, gateway, vlan_id)
                         VALUES
                            (:vm_id, 1, :interface_name, :mac_adresse,
                             :ip_adresse, :prefix_laenge, :gateway, :vlan_id)
                         ON DUPLICATE KEY UPDATE
                            interface_name = VALUES(interface_name),
                            mac_adresse = VALUES(mac_adresse),
                            ip_adresse = VALUES(ip_adresse),
                            prefix_laenge = VALUES(prefix_laenge),
                            gateway = VALUES(gateway),
                            vlan_id = VALUES(vlan_id)'
                    );
                    $stmt->execute([
                        ':vm_id' => $vmDbId,
                        ':interface_name' => nullable($interfaceName),
                        ':mac_adresse' => nullable($macAddress),
                        ':ip_adresse' => nullable($ipAddress),
                        ':prefix_laenge' => $prefixLength === '' ? null : (int) $prefixLength,
                        ':gateway' => nullable($gateway),
                        ':vlan_id' => $vlanId === '' ? null : (int) $vlanId,
                    ]);
                } else {
                    $stmt = $pdo->prepare(
                        'DELETE FROM vm_netzwerkadapter
                         WHERE vm_id = :vm_id
                           AND adapter_nr = 1'
                    );
                    $stmt->execute([':vm_id' => $vmDbId]);
                }

                $stmt = $pdo->prepare(
                    'DELETE FROM vm_festplatten WHERE vm_id = :vm_id'
                );
                $stmt->execute([':vm_id' => $vmDbId]);

                $diskStmt = $pdo->prepare(
                    'INSERT INTO vm_festplatten
                        (vm_id, slot, groesse_gb, typ)
                     VALUES
                        (:vm_id, :slot, :groesse_gb, :typ)'
                );

                for ($slot = 1; $slot <= 4; $slot++) {
                    $disk = is_array($diskData[$slot] ?? null)
                        ? $diskData[$slot]
                        : [];

                    $size = trim((string) ($disk['size'] ?? ''));
                    $type = trim((string) ($disk['type'] ?? 'SSD'));

                    if ($size === '') {
                        continue;
                    }

                    if (!in_array($type, ['HDD', 'SSD'], true)) {
                        $type = 'SSD';
                    }

                    $diskStmt->execute([
                        ':vm_id' => $vmDbId,
                        ':slot' => $slot,
                        ':groesse_gb' => max(1, (int) $size),
                        ':typ' => $type,
                    ]);
                }
            }

            // VMs, die in der Oberfläche entfernt wurden, ebenfalls löschen.
            if ($keptVmIds) {
                $placeholders = implode(',', array_fill(0, count($keptVmIds), '?'));
                $deleteStmt = $pdo->prepare(
                    "DELETE FROM hosting_vms
                     WHERE kundennummer = ?
                       AND id NOT IN ({$placeholders})"
                );
                $deleteStmt->execute(array_merge([$newNumber], $keptVmIds));
            } else {
                $deleteStmt = $pdo->prepare(
                    'DELETE FROM hosting_vms
                     WHERE kundennummer = :kundennummer'
                );
                $deleteStmt->execute([':kundennummer' => $newNumber]);
            }

            // M365
            $stmt = $pdo->prepare(
                'INSERT INTO m365 (kundennummer, tenant_id)
                 VALUES (:kundennummer, :tenant_id)
                 ON DUPLICATE KEY UPDATE tenant_id = VALUES(tenant_id)'
            );
            $stmt->execute([
                ':kundennummer' => $newNumber,
                ':tenant_id' => nullable($tenantId),
            ]);

            $licenseMap = [
                'Business Basic' => 'ms_basic',
                'Business Standard' => 'ms_standard',
                'Business Premium' => 'ms_premium',
                'Enterprise E3' => 'ms_e3',
                'Enterprise E5' => 'ms_e5',
                'Frontline F1' => 'ms_f1',
                'Frontline F3' => 'ms_f3',
            ];

            $stmt = $pdo->prepare('DELETE FROM m365_lizenzen WHERE kundennummer = :kundennummer');
            $stmt->execute([':kundennummer' => $newNumber]);

            $licenseStmt = $pdo->prepare(
                'INSERT INTO m365_lizenzen (kundennummer, lizenztyp, anzahl)
                 VALUES (:kundennummer, :lizenztyp, :anzahl)'
            );

            foreach ($licenseMap as $licenseType => $fieldName) {
                $count = postString($fieldName);
                if ($count === '') {
                    continue;
                }
                $licenseStmt->execute([
                    ':kundennummer' => $newNumber,
                    ':lizenztyp' => $licenseType,
                    ':anzahl' => max(0, (int) $count),
                ]);
            }

            // Firewall: erster Datensatz.
            $firewallId = (int) ($_POST['firewall_db_id'] ?? 0);
            $firewallModel = postString('firewall_modell');
            $firewallName = postString('firewall_name');
            $firewallDetails = postString('firewall_details');

            if ($firewallModel !== '' || $firewallName !== '' || $firewallDetails !== '') {
                if ($firewallId > 0) {
                    $stmt = $pdo->prepare(
                        'UPDATE firewalls
                         SET modell = :modell, name = :name, details = :details
                         WHERE id = :id AND kundennummer = :kundennummer'
                    );
                    $stmt->execute([
                        ':modell' => nullable($firewallModel),
                        ':name' => nullable($firewallName),
                        ':details' => nullable($firewallDetails),
                        ':id' => $firewallId,
                        ':kundennummer' => $newNumber,
                    ]);
                } else {
                    $stmt = $pdo->prepare(
                        'INSERT INTO firewalls (kundennummer, modell, name, details)
                         VALUES (:kundennummer, :modell, :name, :details)'
                    );
                    $stmt->execute([
                        ':kundennummer' => $newNumber,
                        ':modell' => nullable($firewallModel),
                        ':name' => nullable($firewallName),
                        ':details' => nullable($firewallDetails),
                    ]);
                }
            }

            // On-Premise-Hardware
            $stmt = $pdo->prepare(
                'INSERT INTO onprem_hardware (kundennummer, kommentar)
                 VALUES (:kundennummer, :kommentar)
                 ON DUPLICATE KEY UPDATE kommentar = VALUES(kommentar)'
            );
            $stmt->execute([
                ':kundennummer' => $newNumber,
                ':kommentar' => nullable(postString('onprem_kommentar')),
            ]);

            // Backup
            $stmt = $pdo->prepare(
                'INSERT INTO backup (kundennummer, ausfuehrungstag, bemerkung)
                 VALUES (:kundennummer, :tag, :bemerkung)
                 ON DUPLICATE KEY UPDATE
                    ausfuehrungstag = VALUES(ausfuehrungstag),
                    bemerkung = VALUES(bemerkung)'
            );
            $stmt->execute([
                ':kundennummer' => $newNumber,
                ':tag' => nullable(postString('backup_day')),
                ':bemerkung' => nullable(postString('backup_bemerkung')),
            ]);

            // Antivirus
            $stmt = $pdo->prepare(
                'INSERT INTO antivirus (kundennummer, lizenzanzahl, produkt, bemerkung)
                 VALUES (:kundennummer, :lizenzanzahl, :produkt, :bemerkung)
                 ON DUPLICATE KEY UPDATE
                    lizenzanzahl = VALUES(lizenzanzahl),
                    produkt = VALUES(produkt),
                    bemerkung = VALUES(bemerkung)'
            );
            $antivirusLicenses = postString('antivirus_lizenzen');
            $stmt->execute([
                ':kundennummer' => $newNumber,
                ':lizenzanzahl' => $antivirusLicenses === '' ? null : (int) $antivirusLicenses,
                ':produkt' => nullable(postString('antivirus_produkt')),
                ':bemerkung' => nullable(postString('antivirus_bemerkung')),
            ]);

            // Netzwerk
            $networkPlanPath = $existingNetwork['netzwerkplan_pfad'] ?? null;
            $networkPrefix = postString('netz_prefix');
            $networkVlan = postString('netz_vlan');
            $lease = postString('dhcp_lease');

            $stmt = $pdo->prepare(
                'INSERT INTO netzwerk
                    (kundennummer, domain_name, netzadresse, prefix_laenge, standard_gateway,
                     dhcp_von, dhcp_bis, dhcp_lease_minuten, standard_vlan_id,
                     netzwerkplan_pfad, bemerkung)
                 VALUES
                    (:kundennummer, :domain_name, :netzadresse, :prefix_laenge, :standard_gateway,
                     :dhcp_von, :dhcp_bis, :dhcp_lease_minuten, :standard_vlan_id,
                     :netzwerkplan_pfad, :bemerkung)
                 ON DUPLICATE KEY UPDATE
                    domain_name = VALUES(domain_name),
                    netzadresse = VALUES(netzadresse),
                    prefix_laenge = VALUES(prefix_laenge),
                    standard_gateway = VALUES(standard_gateway),
                    dhcp_von = VALUES(dhcp_von),
                    dhcp_bis = VALUES(dhcp_bis),
                    dhcp_lease_minuten = VALUES(dhcp_lease_minuten),
                    standard_vlan_id = VALUES(standard_vlan_id),
                    netzwerkplan_pfad = VALUES(netzwerkplan_pfad),
                    bemerkung = VALUES(bemerkung)'
            );
            $stmt->execute([
                ':kundennummer' => $newNumber,
                ':domain_name' => nullable(postString('domain_name')),
                ':netzadresse' => nullable(postString('netzadresse')),
                ':prefix_laenge' => $networkPrefix === '' ? null : (int) $networkPrefix,
                ':standard_gateway' => nullable(postString('standard_gateway')),
                ':dhcp_von' => nullable(postString('dhcp_von')),
                ':dhcp_bis' => nullable(postString('dhcp_bis')),
                ':dhcp_lease_minuten' => $lease === '' ? null : (int) $lease,
                ':standard_vlan_id' => $networkVlan === '' ? null : (int) $networkVlan,
                ':netzwerkplan_pfad' => $networkPlanPath,
                ':bemerkung' => nullable(postString('netzwerk_bemerkung')),
            ]);

            $stmt = $pdo->prepare('DELETE FROM dns_server WHERE kundennummer = :kundennummer');
            $stmt->execute([':kundennummer' => $newNumber]);

            $dnsStmt = $pdo->prepare(
                'INSERT INTO dns_server (kundennummer, position, adresse)
                 VALUES (:kundennummer, :position, :adresse)'
            );
            for ($position = 1; $position <= 3; $position++) {
                $address = postString("dns{$position}");
                if ($address === '') {
                    continue;
                }
                $dnsStmt->execute([
                    ':kundennummer' => $newNumber,
                    ':position' => $position,
                    ':adresse' => $address,
                ]);
            }

            $auditAfter = audit_customer_snapshot($pdo, $newNumber);
            audit_customer_write($pdo, $currentUser, $newNumber, $firmenname,
                'kunde_bearbeitet', audit_customer_diff($auditBefore, $auditAfter));
            $pdo->commit();

            // Alte Dateien erst nach erfolgreicher DB-Transaktion entfernen.
            if ($uploadedLogo && $oldLogoPath && $oldLogoPath !== $uploadedLogo) {
                $oldFile = __DIR__ . '/' . $oldLogoPath;
                if (is_file($oldFile)) {
                    @unlink($oldFile);
                }
            }

            $_SESSION['flash_success'] = 'Die Änderungen wurden gespeichert.';
            header('Location: kd0000x.php?kundennummer=' . rawurlencode($newNumber));
            exit;
        } catch (Throwable $e) {
            if ($pdo->inTransaction()) {
                $pdo->rollBack();
            }

            if ($uploadedLogo) {
                $filePath = __DIR__ . '/' . $uploadedLogo;
                if (is_file($filePath)) {
                    @unlink($filePath);
                }
            }

            if ($e instanceof PDOException && (string) $e->getCode() === '23000') {
                $errors[] = 'Die Kundennummer oder der Firmenname wird bereits verwendet oder eine Eingabe verletzt eine Datenbankregel.';
            } else {
                $errors[] = 'Die Änderungen konnten nicht gespeichert werden: ' . $e->getMessage();
            }
        }
    }
}

// Daten für die Ausgabe laden/neu laden.
if ($customerSelected && !$customerMissing) {
    $kundennummer = trim((string) ($_GET['kundennummer'] ?? $kundennummer));

    $kunde = fetchOne(
        $pdo,
        'SELECT * FROM kunden WHERE kundennummer = :kundennummer',
        [':kundennummer' => $kundennummer]
    );

    if (!$kunde) {
        $customerMissing = true;
        http_response_code(404);
    }
}

$contacts = [];
$locations = [];
$sections = [];
$hostingVms = [];
$m365 = null;
$licenses = [];
$firewall = null;
$onprem = null;
$backup = null;
$antivirus = null;
$network = null;
$dns = [];

if ($customerSelected && !$customerMissing) {
    $stmt = $pdo->prepare(
        'SELECT * FROM ansprechpartner
         WHERE kundennummer = :kundennummer
         ORDER BY id ASC
         LIMIT 2'
    );
    $stmt->execute([':kundennummer' => $kundennummer]);
    $contacts = $stmt->fetchAll();

    while (count($contacts) < 2) {
        $contacts[] = [
            'name' => '',
            'vorname' => '',
            'nachname' => '',
            'geschlecht' => '',
            'position' => '',
            'telefon' => '',
            'email' => '',
        ];
    }

    $stmt = $pdo->prepare(
        'SELECT strasse, hausnummer, plz, ort, sortierung, ist_firmenanschrift
         FROM standorte
         WHERE kundennummer = :kundennummer
         ORDER BY ist_firmenanschrift DESC, sortierung ASC, id ASC'
    );
    $stmt->execute([':kundennummer' => $kundennummer]);
    $locations = $stmt->fetchAll();

    // Kompatibilität mit älteren Datensätzen: falls die Standorttabelle für einen
    // Kunden noch leer ist, wird die bisherige Anschrift aus kunden verwendet.
    if (!$locations) {
        $locations[] = [
            'strasse' => $kunde['strasse'] ?? '',
            'hausnummer' => $kunde['hausnummer'] ?? '',
            'plz' => $kunde['plz'] ?? '',
            'ort' => $kunde['ort'] ?? '',
            'sortierung' => 1,
            'ist_firmenanschrift' => 1,
        ];
    }

    $stmt = $pdo->prepare(
        'SELECT bereich, aktiv
         FROM kunden_bereiche
         WHERE kundennummer = :kundennummer'
    );
    $stmt->execute([':kundennummer' => $kundennummer]);
    foreach ($stmt->fetchAll() as $row) {
        $sections[$row['bereich']] = (bool) $row['aktiv'];
    }

    $stmt = $pdo->prepare(
        'SELECT *
         FROM hosting_vms
         WHERE kundennummer = :kundennummer
         ORDER BY id ASC'
    );
    $stmt->execute([':kundennummer' => $kundennummer]);
    $hostingVms = $stmt->fetchAll();

    foreach ($hostingVms as &$vm) {
        $vm['_adapter'] = fetchOne(
            $pdo,
            'SELECT *
             FROM vm_netzwerkadapter
             WHERE vm_id = :vm_id
               AND adapter_nr = 1
             LIMIT 1',
            [':vm_id' => $vm['id']]
        ) ?? [];

        $diskStmt = $pdo->prepare(
            'SELECT *
             FROM vm_festplatten
             WHERE vm_id = :vm_id
             ORDER BY slot ASC'
        );
        $diskStmt->execute([':vm_id' => $vm['id']]);

        $vm['_disks'] = [];
        foreach ($diskStmt->fetchAll() as $diskRow) {
            $vm['_disks'][(int) $diskRow['slot']] = $diskRow;
        }
    }
    unset($vm);

    $m365 = fetchOne(
        $pdo,
        'SELECT * FROM m365 WHERE kundennummer = :kundennummer',
        [':kundennummer' => $kundennummer]
    );

    $stmt = $pdo->prepare(
        'SELECT lizenztyp, anzahl FROM m365_lizenzen
         WHERE kundennummer = :kundennummer'
    );
    $stmt->execute([':kundennummer' => $kundennummer]);
    foreach ($stmt->fetchAll() as $row) {
        $licenses[$row['lizenztyp']] = $row['anzahl'];
    }

    $firewall = fetchOne(
        $pdo,
        'SELECT * FROM firewalls
         WHERE kundennummer = :kundennummer
         ORDER BY id ASC
         LIMIT 1',
        [':kundennummer' => $kundennummer]
    );

    $onprem = fetchOne(
        $pdo,
        'SELECT * FROM onprem_hardware WHERE kundennummer = :kundennummer',
        [':kundennummer' => $kundennummer]
    );

    $backup = fetchOne(
        $pdo,
        'SELECT * FROM backup WHERE kundennummer = :kundennummer',
        [':kundennummer' => $kundennummer]
    );

    $antivirus = fetchOne(
        $pdo,
        'SELECT * FROM antivirus WHERE kundennummer = :kundennummer',
        [':kundennummer' => $kundennummer]
    );

    $network = fetchOne(
        $pdo,
        'SELECT * FROM netzwerk WHERE kundennummer = :kundennummer',
        [':kundennummer' => $kundennummer]
    );

    $stmt = $pdo->prepare(
        'SELECT position, adresse FROM dns_server
         WHERE kundennummer = :kundennummer
         ORDER BY position ASC'
    );
    $stmt->execute([':kundennummer' => $kundennummer]);
    foreach ($stmt->fetchAll() as $row) {
        $dns[(int) $row['position']] = $row['adresse'];
    }
}

function sectionActive(array $sections, string $name): bool
{
    return array_key_exists($name, $sections) ? (bool) $sections[$name] : true;
}

$logo = $customerSelected && !$customerMissing && !empty($kunde['logo_pfad'])
    ? 'customer_logo.php?kundennummer=' . rawurlencode($kunde['kundennummer'])
    : null;

$licenseFields = [
    'Business Basic' => 'ms_basic',
    'Business Standard' => 'ms_standard',
    'Business Premium' => 'ms_premium',
    'Enterprise E3' => 'ms_e3',
    'Enterprise E5' => 'ms_e5',
    'Frontline F1' => 'ms_f1',
    'Frontline F3' => 'ms_f3',
];

$firewallModels = [
    'Keine',
    'VM-Firewall',
    'Black Dwarf G5',
    'Black Dwarf Pro G5',
    'RC100 G5',
    'RC200 G5',
    'RC300S G5',
    'RC350R G6',
    'RC400R G5',
    'RC400 G6',
    'RC1000R G5',
    'RC1000R G6',
    'RC2000 G6',
];

$backupDays = [
    'montags',
    'dienstags',
    'mittwochs',
    'donnerstags',
    'freitags',
    'samstags',
    'sonntags',
];


// Berechtigungen werden zentral über includes/auth.php ermittelt.
$canWrite = auth_can($currentUser, 'customer.write');
$canArchive = auth_can($currentUser, 'customer.archive');
$canDelete = auth_can($currentUser, 'customer.delete');

// Linke Kundenleiste: aktive Kunden in der normalen Ansicht, archivierte
// Kunden in der schreibgeschützten Archivansicht.
$customerList = [];
if (!$customerMissing) {
    if ($customerSelected && $isArchived) {
        $stmt = $pdo->query(
            'SELECT kundennummer, firmenname
             FROM kunden
             WHERE archiviert = 1
             ORDER BY archiviert_am DESC, kundennummer ASC'
        );
    } else {
        $stmt = $pdo->query(
            'SELECT kundennummer, firmenname
             FROM kunden
             WHERE archiviert = 0
             ORDER BY kundennummer ASC'
        );
    }
    $customerList = $stmt->fetchAll();
}

// Reihenfolge und Beschriftung der Tactical-RMM-artigen Dokumentations-Tabs.
$documentationTabs = [
    'section-hosting' => ['label' => 'Hosting', 'section' => 'hosting'],
    'section-m365' => ['label' => 'M365', 'section' => 'm365'],
    'section-firewall' => ['label' => 'Firewall', 'section' => 'firewall'],
    'section-hardware-rz' => ['label' => 'Hardware RZ', 'section' => null],
    'section-hardware-onprem' => ['label' => 'On-Premise', 'section' => 'hardware_onprem'],
    'section-backup' => ['label' => 'Backup', 'section' => 'backup'],
    'section-antivirus' => ['label' => 'Antivirus', 'section' => 'antivirus'],
    'section-netzwerk' => ['label' => 'Netzwerk', 'section' => 'netzwerk'],
];

// Bereits serverseitig genau einen sichtbaren Tab aktivieren. So bleibt die
// Oberfläche auch ohne JavaScript eine echte Einzelansicht statt einer langen Liste.
$initialTabTarget = null;
foreach ($documentationTabs as $tabTarget => $tabDefinition) {
    $sectionKey = $tabDefinition['section'];
    if ($sectionKey === null || sectionActive($sections, $sectionKey)) {
        $initialTabTarget = $tabTarget;
        break;
    }
}
?>
<!DOCTYPE html>
<html lang="de">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title><?= $customerMissing ? 'Kunde nicht gefunden' : (!$customerSelected ? 'Kundenübersicht' : h($kunde['kundennummer'] . ' - ' . $kunde['firmenname'])) ?></title>
    <link rel="icon" type="image/png" href="Bilder/Logo_fuer_Tab.png">
    <link rel="stylesheet" href="style.css">
</head>
<body class="page-customer <?= $isArchived ? 'customer-archived' : '' ?>">
<?php auth_bar($currentUser); ?>
    <div class="notice">
        <h5>Vorschlag eines Dokumentationstools</h5>
    </div>

    <header class="header">
        <div class="logo">
            <a href="index.php">
                <img src="Bilder/Logo.png" alt="Logo">
            </a>
        </div>
        <h1>PITNAS<sup>®</sup> - Dokumentationen</h1>
        <p id="creator">► Proton IT Network and Solution ◄</p>
    </header>

    <?php auth_main_nav($currentUser, 'overview'); ?>

    <?php if ($customerMissing): ?>
        <section class="section">
            <h1>Kunde nicht gefunden</h1>
        </section>

        <main class="customer-error-page">
            <p>Es wurde kein passender Kunde gefunden.</p>
            <p><a class="navlink" href="kd0000x.php">Zur Kundenübersicht</a></p>
        </main>
    <?php elseif (!$customerSelected): ?>
        <section class="section customer-toolbar">
            <h1 id="customer-title">Übersicht</h1>
        </section>

        <main class="mainmiddle customer-workspace customer-no-selection">
            <aside id="kind_links" class="customer-sidebar" aria-label="Kundenliste">
                <div class="customer-list-heading">
                    <h2>Kunden</h2>
                    <span><?= count($customerList) ?></span>
                </div>

                <div class="customer-list" role="list">
                    <?php if (!$customerList): ?>
                        <p class="customer-list-empty">Keine aktiven Kunden vorhanden.</p>
                    <?php else: ?>
                        <?php foreach ($customerList as $listCustomer): ?>
                            <a class="customer-list-item"
                               href="kd0000x.php?kundennummer=<?= rawurlencode($listCustomer['kundennummer']) ?>"
                               role="listitem">
                                <span class="customer-list-number"><?= h($listCustomer['kundennummer']) ?></span>
                                <span class="customer-list-name"><?= h($listCustomer['firmenname']) ?></span>
                            </a>
                        <?php endforeach; ?>
                    <?php endif; ?>
                </div>
            </aside>

            <section id="kind_rechts" class="customer-detail customer-detail-empty" aria-label="Kundendetails"></section>
        </main>
    <?php else: ?>
        <section class="section customer-toolbar">
            <h1 id="customer-title"><?= h($kunde['kundennummer']) ?> - <?= h($kunde['firmenname']) ?></h1>

            <?php if (!$isArchived): ?>
                <div class="edit-mode-indicator" role="status" aria-live="polite">
                    Bearbeitungsmodus aktiv
                </div>
                <div class="customer-toolbar-actions">
                    <?php if ($canWrite): ?>
                    <button class="button" id="button_kunde_bearbeiten" type="button">Kunde bearbeiten</button>
                    <?php endif; ?>

                    <div class="customer-edit-actions edit-only">
                        <button class="button"
                                id="save-edit"
                                type="submit"
                                form="customer-edit-form">
                            Änderungen speichern
                        </button>

                        <button class="button" id="cancel-edit" type="button">Abbrechen</button>

                        <?php if ($canArchive): ?>
                        <button class="button archive-customer-button"
                                id="archive-customer-button"
                                type="submit"
                                form="customer-edit-form"
                                formaction="archive_customer.php"
                                formmethod="POST"
                                name="archive_kundennummer"
                                value="<?= h($kunde['kundennummer']) ?>"
                                data-customer-number="<?= h($kunde['kundennummer']) ?>"
                                data-company-name="<?= h($kunde['firmenname']) ?>">
                            Kunde archivieren
                        </button>
<?php endif; ?>

                        <?php if ($canDelete): ?>
                        <button class="button delete-customer-button"
                                id="delete-customer-button"
                                type="submit"
                                form="customer-edit-form"
                                formaction="delete_customer.php"
                                formmethod="POST"
                                name="delete_kundennummer"
                                value="<?= h($kunde['kundennummer']) ?>"
                                data-customer-number="<?= h($kunde['kundennummer']) ?>"
                                data-company-name="<?= h($kunde['firmenname']) ?>">
                            Kunde löschen
                        </button>
<?php endif; ?>
                    </div>
                </div>
            <?php else: ?>
                <div class="customer-toolbar-actions">
                    <?php if ($canDelete): ?>
                    <button class="button delete-customer-button"
                            id="delete-customer-button"
                            type="submit"
                            form="customer-edit-form"
                            formaction="delete_customer.php"
                            formmethod="POST"
                            name="delete_kundennummer"
                            value="<?= h($kunde['kundennummer']) ?>"
                            data-customer-number="<?= h($kunde['kundennummer']) ?>"
                            data-company-name="<?= h($kunde['firmenname']) ?>">
                        Kunde löschen
                    </button>
<?php endif; ?>
                </div>
            <?php endif; ?>
        </section>

        <?php if ($successMessage !== ''): ?>
            <div class="form-message form-success flash-message" id="save-success-message">
                <?= h($successMessage) ?>
            </div>
        <?php endif; ?>

        <?php if ($errors): ?>
            <div class="form-message form-error">
                <strong>Die Änderungen konnten nicht gespeichert werden:</strong>
                <ul>
                    <?php foreach ($errors as $error): ?>
                        <li><?= h($error) ?></li>
                    <?php endforeach; ?>
                </ul>
            </div>
        <?php endif; ?>

        <form id="customer-edit-form"
              action="kd0000x.php?kundennummer=<?= rawurlencode($kunde['kundennummer']) ?>"
              method="POST"
              enctype="multipart/form-data">

            <input type="hidden" name="csrf_token" value="<?= h($_SESSION['csrf_token']) ?>">
            <input type="hidden" name="original_kundennummer" value="<?= h($kunde['kundennummer']) ?>">
            <input type="hidden" name="firewall_db_id" value="<?= h($firewall['id'] ?? '') ?>">

            <main class="mainmiddle customer-workspace">
                <aside id="kind_links" class="customer-sidebar" aria-label="Kundenliste">
                    <div class="customer-list-heading">
                        <h2><?= $isArchived ? 'Archiv' : 'Kunden' ?></h2>
                        <span><?= count($customerList) ?></span>
                    </div>

                    <div class="customer-list" role="list">
                        <?php if (!$customerList): ?>
                            <p class="customer-list-empty"><?= $isArchived ? 'Keine archivierten Kunden vorhanden.' : 'Keine aktiven Kunden vorhanden.' ?></p>
                        <?php else: ?>
                            <?php foreach ($customerList as $listCustomer): ?>
                                <?php $isCurrentCustomer = $listCustomer['kundennummer'] === $kunde['kundennummer']; ?>
                                <a class="customer-list-item <?= $isCurrentCustomer ? 'is-current' : '' ?>"
                                   href="kd0000x.php?kundennummer=<?= rawurlencode($listCustomer['kundennummer']) ?>"
                                   role="listitem"
                                   <?= $isCurrentCustomer ? 'aria-current="page"' : '' ?>>
                                    <span class="customer-list-number"><?= h($listCustomer['kundennummer']) ?></span>
                                    <span class="customer-list-name"><?= h($listCustomer['firmenname']) ?></span>
                                </a>
                            <?php endforeach; ?>
                        <?php endif; ?>
                    </div>
                </aside>

                <section id="kind_rechts" class="customer-detail" aria-label="Kundendetails und Dokumentation">
                    <?php if ($isArchived): ?>
                        <div class="archived-customer-notice">
                            <strong>Archivierter Kunde</strong>
                            <p>Dieser Kunde ist schreibgeschützt und kann nicht bearbeitet werden.</p>
                        </div>
                    <?php endif; ?>

                    <section id="edit-panel" class="edit-panel edit-only" aria-label="Bearbeitungsoptionen">
                        <h2>Bearbeitungsmodus</h2>
                        <p>Lege fest, welche kundenspezifischen Dokumentationsbereiche sichtbar sein sollen.</p>

                        <div class="documentation-checkboxes">
                            <?php
                            $sectionLabels = [
                                'hosting' => 'Hosting',
                                'm365' => 'M365',
                                'firewall' => 'Firewall',
                                'hardware_onprem' => 'On-Premise-Hardware',
                                'backup' => 'Backup',
                                'antivirus' => 'Antivirus',
                                'netzwerk' => 'Netzwerk',
                            ];
                            ?>
                            <?php foreach ($sectionLabels as $sectionKey => $sectionLabel): ?>
                                <label>
                                    <input type="checkbox"
                                           class="doc-toggle"
                                           name="bereich[<?= h($sectionKey) ?>]"
                                           data-target="section-<?= h(str_replace('_', '-', $sectionKey)) ?>"
                                           value="1"
                                           <?= sectionActive($sections, $sectionKey) ? 'checked' : '' ?>>
                                    <?= h($sectionLabel) ?>
                                </label>
                            <?php endforeach; ?>
                        </div>

                    </section>

                    <section class="customer-summary-panel" aria-label="Kundendaten">
                        <div class="customer-summary-heading">
                            <div>
                                <span class="panel-eyebrow">Kundenstammdaten</span>
                                <h2><?= h($kunde['firmenname']) ?></h2>
                            </div>
                            <span class="customer-number-badge"><?= h($kunde['kundennummer']) ?></span>
                        </div>

                    <div id="logofremdfirmacontainer">
                        <img id="logofremdfirma"<?= $logo ? ' src="' . h($logo) . '"' : ' hidden' ?> alt="Firmenlogo von <?= h($kunde['firmenname']) ?>">
                        <p id="customer-logo-placeholder"<?= $logo ? ' hidden' : '' ?>>Kein Firmenlogo hinterlegt.</p>
                        <div class="edit-only logo-upload-area">
                            <div class="file-upload">
                                <button class="upload-btn" type="button">🔍 Neues Firmenlogo auswählen</button>
                                <input type="file"
                                       id="customer-logo-upload"
                                       name="customer_logo"
                                       accept="image/png,image/jpeg,image/webp">
                            </div>
                        </div>
                    </div>

                    <div id="kundendatencontainer">
                        <div class="customer-item">
                            <h4>Kundennummer:</h4>
                            <p class="view-only"><?= copyValue($kunde['kundennummer'], 'Kundennummer', 'kundennummer') ?></p>
                            <input class="edit-only customer-field"
                                   name="kundennummer"
                                   type="text"
                                   value="<?= h($kunde['kundennummer']) ?>"
                                   pattern="KD[0-9]{7}"
                                   minlength="9"
                                   maxlength="9"
                                   title="Die Kundennummer muss aus KD und genau sieben Ziffern bestehen (insgesamt 9 Zeichen)."
                                   required>
                        </div>

                        <div class="customer-item">
                            <h4>Firmenname:</h4>
                            <p class="view-only"><?= copyValue($kunde['firmenname'], 'Firmenname', 'firmenname') ?></p>
                            <input class="edit-only customer-field"
                                   name="firmenname"
                                   type="text"
                                   value="<?= h($kunde['firmenname']) ?>"
                                   required>
                        </div>

                        <div class="customer-item">
                            <h4>SSV-Status:</h4>
                            <p class="view-only"><?= h($kunde['ssv_status'] ?: '–') ?></p>
                            <select class="edit-only customer-field" name="ssv_status">
                                <option value="">Auswählen</option>
                                <?php foreach (['-', 'Bronze', 'Silber', 'Gold', 'Platin'] as $status): ?>
                                    <option value="<?= h($status) ?>"
                                        <?= ($kunde['ssv_status'] ?? '') === $status ? 'selected' : '' ?>>
                                        <?= h($status) ?>
                                    </option>
                                <?php endforeach; ?>
                            </select>
                        </div>

                        <div class="customer-item">
                            <h4>Homepage:</h4>
                            <div class="view-only">
                                <?php if (!empty($kunde['homepage'])): ?>
                                    <a class="customer-homepage-link"
                                       href="<?= h($kunde['homepage']) ?>"
                                       target="_blank"
                                       rel="noopener noreferrer">
                                        <?= h($kunde['homepage']) ?>
                                    </a>
                                <?php else: ?>
                                    <p>–</p>
                                <?php endif; ?>
                            </div>
                            <input class="edit-only customer-field"
                                   name="homepage"
                                   type="url"
                                   value="<?= h($kunde['homepage'] ?? '') ?>"
                                   placeholder="https://www.musterfirma.de">
                        </div>

                        <?php for ($n = 1; $n <= 2; $n++): ?>
                            <?php
                            $contact = $contacts[$n - 1];
                            $legacyName = trim((string) ($contact['name'] ?? ''));
                            $contactFirstName = trim((string) ($contact['vorname'] ?? ''));
                            $contactLastName = trim((string) ($contact['nachname'] ?? ''));

                            // Alte Datensätze hatten nur das Feld name. Dieses wird weiterhin
                            // sichtbar gehalten, ohne den Namen automatisch und fehleranfällig zu zerlegen.
                            if ($contactFirstName === '' && $contactLastName === '' && $legacyName !== '') {
                                $contactLastName = $legacyName;
                            }

                            $contactHasData =
                                $contactFirstName !== '' ||
                                $contactLastName !== '' ||
                                trim((string) ($contact['geschlecht'] ?? '')) !== '' ||
                                trim((string) ($contact['position'] ?? '')) !== '' ||
                                trim((string) ($contact['telefon'] ?? '')) !== '' ||
                                trim((string) ($contact['email'] ?? '')) !== '';
                            ?>
                            <div class="customer-item contact-customer-block <?= $n === 2 && !$contactHasData ? 'secondary-contact-empty' : '' ?>">
                                <h4>Ansprechpartner <?= $n ?>:</h4>

                                <div class="view-only contact-display">
                                    <p><strong>Vorname:</strong> <?= copyValue($contactFirstName, "Vorname Ansprechpartner $n", "contact{$n}_vorname") ?></p>
                                    <p><strong>Nachname:</strong> <?= copyValue($contactLastName, "Nachname Ansprechpartner $n", "contact{$n}_nachname") ?></p>
                                    <p><strong>Geschlecht:</strong> <?= h(genderLabel($contact['geschlecht'] ?? null)) ?></p>
                                    <p><strong>Position:</strong> <?= copyValue($contact['position'], "Position Ansprechpartner $n", "contact{$n}_position") ?></p>
                                    <p><strong>Telefon:</strong> <?= copyValue($contact['telefon'], "Telefon Ansprechpartner $n", "contact{$n}_telefon") ?></p>
                                    <p><strong>E-Mail:</strong> <?= copyValue($contact['email'], "E-Mail Ansprechpartner $n", "contact{$n}_email") ?></p>
                                </div>

                                <div class="edit-only contact-edit-fields">
                                    <label><h5>Vorname</h5></label>
                                    <input class="customer-field"
                                           name="contact<?= $n ?>_vorname"
                                           type="text"
                                           value="<?= h($contactFirstName) ?>"
                                           <?= $n === 1 ? 'required' : '' ?>>

                                    <label><h5>Nachname</h5></label>
                                    <input class="customer-field"
                                           name="contact<?= $n ?>_nachname"
                                           type="text"
                                           value="<?= h($contactLastName) ?>"
                                           <?= $n === 1 ? 'required' : '' ?>>

                                    <fieldset class="contact-gender-fieldset">
                                        <legend>Geschlecht</legend>
                                        <label>
                                            <input type="radio"
                                                   name="contact<?= $n ?>_geschlecht"
                                                   value="maennlich"
                                                   <?= ($contact['geschlecht'] ?? '') === 'maennlich' ? 'checked' : '' ?>>
                                            Männlich
                                        </label>
                                        <label>
                                            <input type="radio"
                                                   name="contact<?= $n ?>_geschlecht"
                                                   value="weiblich"
                                                   <?= ($contact['geschlecht'] ?? '') === 'weiblich' ? 'checked' : '' ?>>
                                            Weiblich
                                        </label>
                                    </fieldset>

                                    <label><h5>Position</h5></label>
                                    <input class="customer-field"
                                           name="contact<?= $n ?>_position"
                                           type="text"
                                           value="<?= h($contact['position'] ?? '') ?>">

                                    <label><h5>Telefon</h5></label>
                                    <input class="customer-field"
                                           name="contact<?= $n ?>_telefon"
                                           type="tel"
                                           value="<?= h($contact['telefon'] ?? '') ?>">

                                    <label><h5>E-Mail</h5></label>
                                    <input class="customer-field"
                                           name="contact<?= $n ?>_email"
                                           type="email"
                                           value="<?= h($contact['email'] ?? '') ?>">
                                </div>
                            </div>
                        <?php endfor; ?>

                        <div class="customer-item locations-customer-block">
                            <h4>Standorte:</h4>

                            <div id="customer-location-list" data-next-index="<?= count($locations) ?>">
                                <?php foreach ($locations as $index => $location): ?>
                                    <section class="customer-location-card">
                                        <div class="customer-location-header">
                                            <h5><?= $index === 0 ? 'Firmenanschrift' : 'Standort ' . ($index + 1) ?></h5>
                                            <?php if ($index > 0): ?>
                                                <button class="edit-only remove-customer-location-button" type="button">Standort entfernen</button>
                                            <?php endif; ?>
                                        </div>

                                        <div class="view-only">
                                            <p>
                                                <?= h($location['strasse'] ?? '') ?>
                                                <?= h($location['hausnummer'] ?? '') ?><br>
                                                <?= h($location['plz'] ?? '') ?>
                                                <?= h($location['ort'] ?? '') ?>
                                            </p>
                                        </div>

                                        <div class="edit-only address-fields">
                                            <label><h5>Straße</h5></label>
                                            <input class="customer-field"
                                                   name="standorte[<?= $index ?>][strasse]"
                                                   pattern="[^\p{N}]+" title="Die Straße darf keine Zahlen enthalten. Hausnummer bitte separat eintragen."
                                                   type="text"
                                                   value="<?= h($location['strasse'] ?? '') ?>"
                                                   required>

                                            <label><h5>Hausnummer</h5></label>
                                            <input class="customer-field"
                                                   name="standorte[<?= $index ?>][hausnummer]"
                                                   type="text"
                                                   value="<?= h($location['hausnummer'] ?? '') ?>"
                                                   required>

                                            <label><h5>PLZ</h5></label>
                                            <input class="customer-field customer-location-postal-code"
                                                   name="standorte[<?= $index ?>][plz]"
                                                   type="text"
                                                   maxlength="5"
                                                   inputmode="numeric"
                                                   autocomplete="postal-code"
                                                   value="<?= h($location['plz'] ?? '') ?>"
                                                   required>

                                            <label><h5>Ort</h5></label>
                                            <input class="customer-field customer-location-city"
                                                   name="standorte[<?= $index ?>][ort]"
                                                   type="text"
                                                   autocomplete="address-level2"
                                                   value="<?= h($location['ort'] ?? '') ?>"
                                                   required>
                                        </div>
                                    </section>
                                <?php endforeach; ?>
                            </div>

                            <button id="add-customer-location-button"
                                    class="button edit-only add-customer-location-button"
                                    type="button">
                                Weiteren Standort hinzufügen
                            </button>

                            <template id="customer-location-template">
                                <section class="customer-location-card">
                                    <div class="customer-location-header">
                                        <h5>Standort __NUMBER__</h5>
                                        <button class="remove-customer-location-button" type="button">Standort entfernen</button>
                                    </div>

                                    <div class="address-fields">
                                        <label><h5>Straße</h5></label>
                                        <input class="customer-field street-input" name="standorte[__INDEX__][strasse]" type="text" pattern="[^\p{N}]+" title="Die Straße darf keine Zahlen enthalten. Hausnummer bitte separat eintragen." required>

                                        <label><h5>Hausnummer</h5></label>
                                        <input class="customer-field" name="standorte[__INDEX__][hausnummer]" type="text" required>

                                        <label><h5>PLZ</h5></label>
                                        <input class="customer-field customer-location-postal-code"
                                               name="standorte[__INDEX__][plz]"
                                               type="text"
                                               maxlength="5"
                                               inputmode="numeric"
                                               autocomplete="postal-code"
                                               required>

                                        <label><h5>Ort</h5></label>
                                        <input class="customer-field customer-location-city"
                                               name="standorte[__INDEX__][ort]"
                                               type="text"
                                               autocomplete="address-level2"
                                               required>
                                    </div>
                                </section>
                            </template>
                        </div>

                        <div class="customer-item">
                            <h4>Sonstiges:</h4>
                            <p class="view-only"><?= nl2br(h($kunde['sonstiges'] ?: '–')) ?></p>
                            <textarea class="edit-only customer-field customer-textarea"
                                      name="sonstiges"
                                      placeholder="Weitere Informationen zum Kunden"><?= h($kunde['sonstiges'] ?? '') ?></textarea>
                        </div>
                    </div>
                    </section>

                    <section class="customer-documentation-workspace" aria-label="Dokumentationsbereiche">
                        <nav class="customer-tabs" role="tablist" aria-label="Dokumentationsbereiche">
                            <?php foreach ($documentationTabs as $tabTarget => $tab): ?>
                                <?php
                                $sectionKey = $tab['section'];
                                $tabVisible = $sectionKey === null || sectionActive($sections, $sectionKey);
                                $tabIsActive = $tabVisible && $tabTarget === $initialTabTarget;
                                ?>
                                <button class="customer-tab <?= $tabVisible ? '' : 'hidden' ?> <?= $tabIsActive ? 'is-active' : '' ?>"
                                        type="button"
                                        role="tab"
                                        aria-selected="<?= $tabIsActive ? 'true' : 'false' ?>"
                                        aria-controls="<?= h($tabTarget) ?>"
                                        tabindex="<?= $tabIsActive ? '0' : '-1' ?>"
                                        data-tab-target="<?= h($tabTarget) ?>"
                                        <?= $tabVisible ? '' : 'hidden' ?>>
                                    <?= h($tab['label']) ?>
                                </button>
                            <?php endforeach; ?>
                        </nav>

                        <div class="customer-tab-panels">
                    <article class="enkelrechts documentation-section <?= sectionActive($sections, 'hosting') ? '' : 'hidden' ?> tab-panel"
                             id="section-hosting"<?= $initialTabTarget === 'section-hosting' ? '' : ' hidden' ?>>
                        <h2>Hosting</h2>

                        <div class="view-only">
                            <?php if (!$hostingVms): ?>
                                <p>Keine VMs hinterlegt.</p>
                            <?php else: ?>
                                <div class="vm-view-list">
                                    <?php foreach ($hostingVms as $vmIndex => $vm): ?>
                                        <?php
                                        $adapter = $vm['_adapter'] ?? [];
                                        $vmDisks = $vm['_disks'] ?? [];
                                        ?>
                                        <section class="vm-view-card">
                                            <h3><?= copyValue($vm['vm_name'], 'VM-Name', "vms[$vmIndex][vm_name]") ?></h3>
                                            <p><b>VM-ID:</b> <?= h($vm['vm_id'] ?? '–') ?></p>
                                            <p><b>Typ:</b> <?= copyValue($vm['typ'], 'VM-Typ', "vms[$vmIndex][typ]") ?></p>
                                            <p><b>Betriebssystem:</b> <?= copyValue($vm['betriebssystem'], 'Betriebssystem', "vms[$vmIndex][betriebssystem]") ?></p>
                                            <p><b>RAM:</b> <?= $vm['ram_mb'] ? h($vm['ram_mb']) . ' MB' : '–' ?></p>
                                            <p><b>vCPU:</b> <?= h($vm['cpu_anzahl'] ?? '–') ?></p>

                                            <?php if ($adapter): ?>
                                                <h4>Netzwerkadapter</h4>
                                                <p><b>Interface:</b> <?= copyValue($adapter['interface_name'], 'Interface', "vms[$vmIndex][adapter][interface_name]") ?></p>
                                                <p><b>MAC:</b> <?= copyValue($adapter['mac_adresse'], 'MAC-Adresse', "vms[$vmIndex][adapter][mac_adresse]") ?></p>
                                                <p>
                                                    <b>IP:</b>
                                                    <?= copyValue($adapter['ip_adresse'], 'IP-Adresse', "vms[$vmIndex][adapter][ip_adresse]") ?>
                                                    <?= $adapter['prefix_laenge'] !== null ? '/' . h($adapter['prefix_laenge']) : '' ?>
                                                </p>
                                                <p><b>Gateway:</b> <?= copyValue($adapter['gateway'], 'Gateway', "vms[$vmIndex][adapter][gateway]") ?></p>
                                                <p><b>VLAN:</b> <?= h($adapter['vlan_id'] ?? '–') ?></p>
                                            <?php endif; ?>

                                            <?php if ($vmDisks): ?>
                                                <h4>Festplatten</h4>
                                                <ul>
                                                    <?php foreach ($vmDisks as $disk): ?>
                                                        <li>Slot <?= h($disk['slot']) ?>: <?= h($disk['groesse_gb']) ?> GB <?= h($disk['typ']) ?></li>
                                                    <?php endforeach; ?>
                                                </ul>
                                            <?php endif; ?>

                                            <?php if (!empty($vm['bemerkung'])): ?>
                                                <p><b>Bemerkung:</b> <?= nl2br(h($vm['bemerkung'])) ?></p>
                                            <?php endif; ?>
                                        </section>
                                    <?php endforeach; ?>
                                </div>
                            <?php endif; ?>
                        </div>

                        <div class="edit-only">
                            <div id="vm-editors" data-next-index="<?= count($hostingVms) ?>">
                                <?php foreach ($hostingVms as $vmIndex => $vm): ?>
                                    <?php
                                    $adapter = $vm['_adapter'] ?? [];
                                    $vmDisks = $vm['_disks'] ?? [];
                                    ?>
                                    <section class="vm-editor">
                                        <div class="vm-editor-header">
                                            <h3>VM <?= $vmIndex + 1 ?></h3>
                                            <button class="remove-vm-button" type="button">VM entfernen</button>
                                        </div>

                                        <input type="hidden" name="vms[<?= $vmIndex ?>][db_id]" value="<?= h($vm['id']) ?>">

                                        <div class="vm-editor-fields">
                                        <div class="vm-field-group">
                                        <h4>VM-Daten</h4>

                                        <div class="vm-field-grid">
                                            <label><span>VM-Name</span><input class="eingabefeld" name="vms[<?= $vmIndex ?>][vm_name]" type="text" value="<?= h($vm['vm_name']) ?>" placeholder="DC01"></label>
                                            <label><span>VM-ID</span><input class="eingabefeld" name="vms[<?= $vmIndex ?>][vm_id]" type="number" value="<?= h($vm['vm_id'] ?? '') ?>" placeholder="101"></label>
                                            <label><span>Typ</span><input class="eingabefeld" name="vms[<?= $vmIndex ?>][typ]" type="text" value="<?= h($vm['typ'] ?? '') ?>" placeholder="Domain Controller"></label>
                                            <label><span>Betriebssystem</span><input class="eingabefeld" name="vms[<?= $vmIndex ?>][betriebssystem]" type="text" value="<?= h($vm['betriebssystem'] ?? '') ?>" placeholder="Windows Server 2025"></label>
                                            <label><span>RAM in MB</span><input class="eingabefeld" name="vms[<?= $vmIndex ?>][ram_mb]" type="number" min="1" value="<?= h($vm['ram_mb'] ?? '') ?>" placeholder="8192"></label>
                                            <label><span>vCPU</span><input class="eingabefeld" name="vms[<?= $vmIndex ?>][cpu_anzahl]" type="number" min="1" value="<?= h($vm['cpu_anzahl'] ?? '') ?>" placeholder="4"></label>
                                        </div>

                                        </div>

                                        <div class="vm-field-group">
                                        <h4>Netzwerkadapter</h4>
                                        <div class="vm-field-grid">
                                            <label><span>Interface</span><input class="eingabefeld" name="vms[<?= $vmIndex ?>][adapter][interface_name]" type="text" value="<?= h($adapter['interface_name'] ?? '') ?>" placeholder="ens18"></label>
                                            <label><span>MAC-Adresse</span><input class="eingabefeld" name="vms[<?= $vmIndex ?>][adapter][mac_adresse]" type="text" value="<?= h($adapter['mac_adresse'] ?? '') ?>" placeholder="BC:24:11:AA:BB:CC"></label>
                                            <label><span>IP-Adresse</span><input class="eingabefeld" name="vms[<?= $vmIndex ?>][adapter][ip_adresse]" type="text" value="<?= h($adapter['ip_adresse'] ?? '') ?>" placeholder="192.168.10.10"></label>
                                            <label><span>Präfix</span><input class="eingabefeld" name="vms[<?= $vmIndex ?>][adapter][prefix_laenge]" type="number" min="0" max="128" value="<?= h($adapter['prefix_laenge'] ?? '') ?>" placeholder="24"></label>
                                            <label><span>Gateway</span><input class="eingabefeld" name="vms[<?= $vmIndex ?>][adapter][gateway]" type="text" value="<?= h($adapter['gateway'] ?? '') ?>" placeholder="192.168.10.1"></label>
                                            <label><span>VLAN-ID</span><input class="eingabefeld" name="vms[<?= $vmIndex ?>][adapter][vlan_id]" type="number" min="1" max="4094" value="<?= h($adapter['vlan_id'] ?? '') ?>" placeholder="10"></label>
                                        </div>

                                        </div>

                                        <div class="vm-field-group">
                                        <h4>Festplatten</h4>
                                        <div class="disk-grid">
                                            <?php for ($slot = 1; $slot <= 4; $slot++): ?>
                                                <?php $disk = $vmDisks[$slot] ?? null; ?>
                                                <div class="disk-editor">
                                                    <strong>Festplatte <?= $slot ?></strong>
                                                    <input class="eingabefeld" name="vms[<?= $vmIndex ?>][disks][<?= $slot ?>][size]" type="number" min="1" value="<?= h($disk['groesse_gb'] ?? '') ?>" placeholder="Größe in GB">
                                                    <select class="eingabefeld" name="vms[<?= $vmIndex ?>][disks][<?= $slot ?>][type]">
                                                        <option value="SSD" <?= ($disk['typ'] ?? 'SSD') === 'SSD' ? 'selected' : '' ?>>SSD</option>
                                                        <option value="HDD" <?= ($disk['typ'] ?? '') === 'HDD' ? 'selected' : '' ?>>HDD</option>
                                                    </select>
                                                </div>
                                            <?php endfor; ?>
                                        </div>

                                        </div>
                                        </div>

                                        <label class="vm-note-label">
                                            <span>Bemerkung</span>
                                            <textarea class="customer-textarea" name="vms[<?= $vmIndex ?>][bemerkung]"><?= h($vm['bemerkung'] ?? '') ?></textarea>
                                        </label>
                                    </section>
                                <?php endforeach; ?>
                            </div>

                            <button class="button add-vm-button" id="add-vm-button" type="button">+ VM hinzufügen</button>

                            <template id="vm-editor-template">
                                <section class="vm-editor">
                                    <div class="vm-editor-header">
                                        <h3>Neue VM</h3>
                                        <button class="remove-vm-button" type="button">VM entfernen</button>
                                    </div>
                                    <input type="hidden" name="vms[__INDEX__][db_id]" value="">

                                    <div class="vm-editor-fields">
                                    <div class="vm-field-group">
                                    <h4>VM-Daten</h4>

                                    <div class="vm-field-grid">
                                        <label><span>VM-Name</span><input class="eingabefeld" name="vms[__INDEX__][vm_name]" type="text" placeholder="DC01"></label>
                                        <label><span>VM-ID</span><input class="eingabefeld" name="vms[__INDEX__][vm_id]" type="number" placeholder="101"></label>
                                        <label><span>Typ</span><input class="eingabefeld" name="vms[__INDEX__][typ]" type="text" placeholder="Domain Controller"></label>
                                        <label><span>Betriebssystem</span><input class="eingabefeld" name="vms[__INDEX__][betriebssystem]" type="text" placeholder="Windows Server 2025"></label>
                                        <label><span>RAM in MB</span><input class="eingabefeld" name="vms[__INDEX__][ram_mb]" type="number" min="1" placeholder="8192"></label>
                                        <label><span>vCPU</span><input class="eingabefeld" name="vms[__INDEX__][cpu_anzahl]" type="number" min="1" placeholder="4"></label>
                                    </div>

                                    </div>

                                    <div class="vm-field-group">
                                    <h4>Netzwerkadapter</h4>
                                    <div class="vm-field-grid">
                                        <label><span>Interface</span><input class="eingabefeld" name="vms[__INDEX__][adapter][interface_name]" type="text" placeholder="ens18"></label>
                                        <label><span>MAC-Adresse</span><input class="eingabefeld" name="vms[__INDEX__][adapter][mac_adresse]" type="text" placeholder="BC:24:11:AA:BB:CC"></label>
                                        <label><span>IP-Adresse</span><input class="eingabefeld" name="vms[__INDEX__][adapter][ip_adresse]" type="text" placeholder="192.168.10.10"></label>
                                        <label><span>Präfix</span><input class="eingabefeld" name="vms[__INDEX__][adapter][prefix_laenge]" type="number" min="0" max="128" placeholder="24"></label>
                                        <label><span>Gateway</span><input class="eingabefeld" name="vms[__INDEX__][adapter][gateway]" type="text" placeholder="192.168.10.1"></label>
                                        <label><span>VLAN-ID</span><input class="eingabefeld" name="vms[__INDEX__][adapter][vlan_id]" type="number" min="1" max="4094" placeholder="10"></label>
                                    </div>

                                    </div>

                                    <div class="vm-field-group">
                                    <h4>Festplatten</h4>
                                    <div class="disk-grid">
                                        <div class="disk-editor"><strong>Festplatte 1</strong><input class="eingabefeld" name="vms[__INDEX__][disks][1][size]" type="number" min="1" placeholder="Größe in GB"><select class="eingabefeld" name="vms[__INDEX__][disks][1][type]"><option value="SSD">SSD</option><option value="HDD">HDD</option></select></div>
                                        <div class="disk-editor"><strong>Festplatte 2</strong><input class="eingabefeld" name="vms[__INDEX__][disks][2][size]" type="number" min="1" placeholder="Größe in GB"><select class="eingabefeld" name="vms[__INDEX__][disks][2][type]"><option value="SSD">SSD</option><option value="HDD">HDD</option></select></div>
                                        <div class="disk-editor"><strong>Festplatte 3</strong><input class="eingabefeld" name="vms[__INDEX__][disks][3][size]" type="number" min="1" placeholder="Größe in GB"><select class="eingabefeld" name="vms[__INDEX__][disks][3][type]"><option value="SSD">SSD</option><option value="HDD">HDD</option></select></div>
                                        <div class="disk-editor"><strong>Festplatte 4</strong><input class="eingabefeld" name="vms[__INDEX__][disks][4][size]" type="number" min="1" placeholder="Größe in GB"><select class="eingabefeld" name="vms[__INDEX__][disks][4][type]"><option value="SSD">SSD</option><option value="HDD">HDD</option></select></div>
                                    </div>

                                    </div>
                                    </div>

                                    <label class="vm-note-label">
                                        <span>Bemerkung</span>
                                        <textarea class="customer-textarea" name="vms[__INDEX__][bemerkung]"></textarea>
                                    </label>
                                </section>
                            </template>
                        </div>
                    </article>

                    <article class="enkelrechts documentation-section <?= sectionActive($sections, 'm365') ? '' : 'hidden' ?> tab-panel"
                             id="section-m365"<?= $initialTabTarget === 'section-m365' ? '' : ' hidden' ?>>
                        <h2>M365</h2>

                        <p>
                            <b>Tenant-ID:</b>
                            <span class="view-only"><?= copyValue($m365['tenant_id'] ?? '', 'Tenant-ID', 'tenant_id') ?></span>
                            <input class="edit-only"
                                   id="tenent_id"
                                   name="tenant_id"
                                   type="text"
                                   pattern="[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"
                                   minlength="36"
                                   maxlength="36"
                                   placeholder="12345678-abcd-1234-abcd-123456789abc"
                                   title="36 Zeichen: Hexadezimalzeichen (0–9, a–f) in Gruppen von 8–4–4–4–12, getrennt durch Bindestriche."
                                   value="<?= h($m365['tenant_id'] ?? '') ?>">
                        </p><br>

                        <ul class="license-list">
                            <?php foreach ($licenseFields as $licenseType => $fieldName): ?>
                                <li>
                                    <b><?= h($licenseType) ?>:</b>
                                    <span class="view-only"><?= h($licenses[$licenseType] ?? 0) ?></span>
                                    <input class="edit-only anzahl_ms_lizenzen"
                                           name="<?= h($fieldName) ?>"
                                           type="number"
                                           min="0"
                                           value="<?= h($licenses[$licenseType] ?? '') ?>">
                                </li>
                            <?php endforeach; ?>
                        </ul>
                    </article>

                    <article class="enkelrechts documentation-section <?= sectionActive($sections, 'firewall') ? '' : 'hidden' ?> tab-panel"
                             id="section-firewall"<?= $initialTabTarget === 'section-firewall' ? '' : ' hidden' ?>>
                        <h2>Firewall</h2>

                        <div class="view-only">
                            <p><b>Modell:</b> <?= h($firewall['modell'] ?? '–') ?></p>
                            <p><b>Name:</b> <?= copyValue($firewall['name'] ?? '', 'Firewall-Name', 'firewall_name') ?></p>
                            <p><b>Details:</b> <?= nl2br(h($firewall['details'] ?? '–')) ?></p>
                        </div>

                        <div class="edit-only documentation-fields">
                            <label>Firewall-Modell</label>
                            <select id="fw-modell" name="firewall_modell">
                                <option value="">Auswählen</option>
                                <?php foreach ($firewallModels as $model): ?>
                                    <option value="<?= h($model) ?>"
                                        <?= ($firewall['modell'] ?? '') === $model ? 'selected' : '' ?>>
                                        <?= h($model) ?>
                                    </option>
                                <?php endforeach; ?>
                            </select>

                            <label>Name</label>
                            <input class="eingabefeld"
                                   name="firewall_name"
                                   type="text"
                                   value="<?= h($firewall['name'] ?? '') ?>">

                            <label>Details</label>
                            <textarea class="customer-textarea"
                                      name="firewall_details"><?= h($firewall['details'] ?? '') ?></textarea>
                        </div>
                    </article>

                    <article class="enkelrechts documentation-section tab-panel" id="section-hardware-rz"<?= $initialTabTarget === 'section-hardware-rz' ? '' : ' hidden' ?>>
                        <h2>Hardware Rechenzentrum</h2>
                        <p>Dieser Bereich wird später zentral und für alle Kunden einheitlich eingebunden.</p>
                    </article>

                    <article class="enkelrechts documentation-section <?= sectionActive($sections, 'hardware_onprem') ? '' : 'hidden' ?> tab-panel"
                             id="section-hardware-onprem"<?= $initialTabTarget === 'section-hardware-onprem' ? '' : ' hidden' ?>>
                        <h2>On-Premise-Hardware</h2>

                        <p class="view-only"><?= nl2br(h($onprem['kommentar'] ?? '–')) ?></p>

                        <textarea class="edit-only customer-textarea"
                                  name="onprem_kommentar"
                                  placeholder="Individuelle On-Premise-Hardware beschreiben"><?= h($onprem['kommentar'] ?? '') ?></textarea>
                    </article>

                    <article class="enkelrechts documentation-section <?= sectionActive($sections, 'backup') ? '' : 'hidden' ?> tab-panel"
                             id="section-backup"<?= $initialTabTarget === 'section-backup' ? '' : ' hidden' ?>>
                        <h2>Backup</h2>

                        <p class="view-only">
                            <b>Backup-Ausführung:</b> <?= h($backup['ausfuehrungstag'] ?? '–') ?>
                        </p>
                        <?php if (!empty($backup['bemerkung'])): ?>
                            <p class="view-only"><?= nl2br(h($backup['bemerkung'])) ?></p>
                        <?php endif; ?>

                        <div class="edit-only backup-options">
                            <h4>Backup-Ausführung</h4>
                            <?php foreach ($backupDays as $day): ?>
                                <label>
                                    <input type="radio"
                                           name="backup_day"
                                           value="<?= h($day) ?>"
                                           <?= ($backup['ausfuehrungstag'] ?? '') === $day ? 'checked' : '' ?>>
                                    <?= h($day) ?>
                                </label>
                            <?php endforeach; ?>

                            <label>Bemerkung</label>
                            <textarea class="customer-textarea"
                                      name="backup_bemerkung"><?= h($backup['bemerkung'] ?? '') ?></textarea>
                        </div>
                    </article>

                    <article class="enkelrechts documentation-section <?= sectionActive($sections, 'antivirus') ? '' : 'hidden' ?> tab-panel"
                             id="section-antivirus"<?= $initialTabTarget === 'section-antivirus' ? '' : ' hidden' ?>>
                        <h2>Antivirus</h2>

                        <div class="view-only">
                            <p><b>Produkt:</b> <?= copyValue($antivirus['produkt'] ?? '', 'Antivirus-Produkt', 'antivirus_produkt') ?></p>
                            <p><b>Gebuchte Lizenzen:</b> <?= h($antivirus['lizenzanzahl'] ?? '–') ?></p>
                            <?php if (!empty($antivirus['bemerkung'])): ?>
                                <p><?= nl2br(h($antivirus['bemerkung'])) ?></p>
                            <?php endif; ?>
                        </div>

                        <div class="edit-only documentation-fields">
                            <label>Produkt</label>
                            <input class="eingabefeld"
                                   name="antivirus_produkt"
                                   type="text"
                                   value="<?= h($antivirus['produkt'] ?? '') ?>">

                            <label>Anzahl gebuchter Lizenzen</label>
                            <input class="eingabefeld"
                                   name="antivirus_lizenzen"
                                   type="number"
                                   min="0"
                                   value="<?= h($antivirus['lizenzanzahl'] ?? '') ?>">

                            <label>Bemerkung</label>
                            <textarea class="customer-textarea"
                                      name="antivirus_bemerkung"><?= h($antivirus['bemerkung'] ?? '') ?></textarea>
                        </div>
                    </article>

                    <article class="enkelrechts documentation-section <?= sectionActive($sections, 'netzwerk') ? '' : 'hidden' ?> tab-panel"
                             id="section-netzwerk"<?= $initialTabTarget === 'section-netzwerk' ? '' : ' hidden' ?>>
                        <h2>Netzwerk</h2>

                        <div class="view-only">
                            <p><b>Domain:</b> <?= copyValue($network['domain_name'] ?? '', 'Domain', 'domain_name') ?></p>
                            <p>
                                <b>Netz:</b>
                                <?= copyValue($network['netzadresse'] ?? '', 'Netzadresse', 'netzadresse') ?>
                                <?= isset($network['prefix_laenge']) && $network['prefix_laenge'] !== null
                                    ? '/' . h($network['prefix_laenge'])
                                    : '' ?>
                            </p>
                            <p><b>Standard-Gateway:</b> <?= copyValue($network['standard_gateway'] ?? '', 'Standard-Gateway', 'standard_gateway') ?></p>
                            <p><b>Standard-VLAN:</b> <?= h($network['standard_vlan_id'] ?? '–') ?></p>

                            <h4>DNS</h4>
                            <p>DNS-Server 1: <?= copyValue($dns[1] ?? '', 'DNS-Server 1', 'dns1') ?></p>
                            <p>DNS-Server 2: <?= copyValue($dns[2] ?? '', 'DNS-Server 2', 'dns2') ?></p>
                            <p>DNS-Server 3: <?= copyValue($dns[3] ?? '', 'DNS-Server 3', 'dns3') ?></p>

                            <h4>DHCP</h4>
                            <p>Range: <?= copyValue($network['dhcp_von'] ?? '', 'DHCP von', 'dhcp_von') ?> bis <?= copyValue($network['dhcp_bis'] ?? '', 'DHCP bis', 'dhcp_bis') ?></p>
                            <p>Lease: <?= h($network['dhcp_lease_minuten'] ?? '–') ?> Minuten</p>
                        </div>

                        <div class="edit-only documentation-fields">
                            <label>Domain</label>
                            <input class="eingabefeld"
                                   name="domain_name"
                                   type="text"
                                   value="<?= h($network['domain_name'] ?? '') ?>">

                            <label>Netzadresse</label>
                            <input class="eingabefeld"
                                   name="netzadresse"
                                   type="text"
                                   value="<?= h($network['netzadresse'] ?? '') ?>"
                                   placeholder="192.168.100.0">

                            <label>Präfix</label>
                            <input class="eingabefeld"
                                   name="netz_prefix"
                                   type="number"
                                   min="0"
                                   max="128"
                                   value="<?= h($network['prefix_laenge'] ?? '') ?>"
                                   placeholder="24">

                            <label>Standard-Gateway</label>
                            <input class="eingabefeld"
                                   name="standard_gateway"
                                   type="text"
                                   value="<?= h($network['standard_gateway'] ?? '') ?>">

                            <label>Standard-VLAN</label>
                            <input class="eingabefeld"
                                   name="netz_vlan"
                                   type="number"
                                   min="1"
                                   max="4094"
                                   value="<?= h($network['standard_vlan_id'] ?? '') ?>">

                            <h4>DNS</h4>
                            <?php for ($position = 1; $position <= 3; $position++): ?>
                                <label>DNS-Server <?= $position ?></label>
                                <input class="eingabefeld"
                                       name="dns<?= $position ?>"
                                       type="text"
                                       value="<?= h($dns[$position] ?? '') ?>">
                            <?php endfor; ?>

                            <h4>DHCP</h4>
                            <label>Von</label>
                            <input class="eingabefeld"
                                   name="dhcp_von"
                                   type="text"
                                   value="<?= h($network['dhcp_von'] ?? '') ?>">

                            <label>Bis</label>
                            <input class="eingabefeld"
                                   name="dhcp_bis"
                                   type="text"
                                   value="<?= h($network['dhcp_bis'] ?? '') ?>">

                            <label>Lease in Minuten</label>
                            <input class="eingabefeld"
                                   name="dhcp_lease"
                                   type="number"
                                   min="0"
                                   value="<?= h($network['dhcp_lease_minuten'] ?? '') ?>">

                            <label>Bemerkung</label>
                            <textarea class="customer-textarea"
                                      name="netzwerk_bemerkung"><?= h($network['bemerkung'] ?? '') ?></textarea>
                        </div>

                        <div class="network-plan-placeholder" aria-label="Platzhalter für automatischen Netzwerkplan">
                            <div class="network-plan-placeholder-icon">⌘</div>
                            <h3>Automatischer Netzwerkplan</h3>
                            <p>
                                Hier wird später aus den gespeicherten VM-, IP-, VLAN-,
                                Gateway- und Netzwerkdaten automatisch ein Netzwerkplan erzeugt.
                            </p>
                        </div>
                    </article>

                        </div>

                    <article class="document-export">
                        <button class="button" type="button" disabled>Dokumentation [Word]</button>
                        <button class="button" type="button" disabled>Dokumentation [PDF]</button>
                    </article>
                    </section>
                </section>
            </main>
        </form>
    <?php endif; ?>

    <div class="banner-down"></div>

    <footer class="footer">
        <a class="footerlink" href="https://pitnas.de">PITNAS<sup>®</sup></a>
    </footer>

    <?php if ($customerSelected && !$customerMissing): ?>
        <script src="script.js"></script>
    <?php endif; ?>
</body>
</html>
