<?php

declare(strict_types=1);

/**
 * QR-Code für DRUCKSACHEN erzeugen (nur CLI).
 *
 *   php bin/qr.php <pfad|url> [ziel.png] [--scale=24]
 *
 * Beispiele:
 *   php bin/qr.php stadionzeitung/aktuell
 *   php bin/qr.php stadionzeitung/aktuell ~/Desktop/qr-plakat.png --scale=30
 *   php bin/qr.php https://tsv08kulmbach.de/stadionzeitung/aktuell
 *
 * Abgrenzung zu den QR-Codes der Stadionzeitung: die erzeugt
 * bin/stadionzeitung-add.php selbst, klein und für die A5-Seiten
 * (generate_qr_png() Default-Skalierung, gut 200px). Dieses Skript ist für
 * Plakate und Aushänge, die in Canva zusammengebaut werden — dort braucht es
 * ein Vielfaches an Pixeln, sonst franst der Code im Druck aus.
 *
 * DIE EIGENTLICHE AUFGABE DIESES SKRIPTS IST DIE WARNUNG: ein QR-Code enthält
 * die URL fest eingebacken. Wird er gegen die Entwicklungs-Config erzeugt, steht
 * `http://localhost:8000/…` darin und das gedruckte Plakat ist Altpapier. Ein
 * interner Pfad läuft deshalb durch abs_url() (Single Source: config base_url),
 * und wenn die nicht auf https zeigt, sagt das Skript es laut.
 */
if (PHP_SAPI !== 'cli') {
    exit(1);
}

require dirname(__DIR__) . '/app/bootstrap.php';

$args = array_values(array_filter(array_slice($argv, 1), static fn (string $a): bool => !str_starts_with($a, '--')));
$scale = 24;
foreach ($argv as $arg) {
    if (str_starts_with($arg, '--scale=')) {
        $scale = max(1, (int) substr($arg, 8));
    }
}

if ($args === []) {
    fwrite(STDERR, "Nutzung: php bin/qr.php <pfad|url> [ziel.png] [--scale=24]\n");
    exit(1);
}

$target = $args[0];
$isAbsolute = str_starts_with($target, 'http://') || str_starts_with($target, 'https://');
$url = $isAbsolute ? $target : abs_url(trim($target, '/'));

// Zielpfad: ohne Angabe neben das Skript-Verzeichnis in storage/qr/ ablegen —
// Druckmaterial ist kein Website-Asset und hat unter public/ nichts zu suchen.
$dest = $args[1] ?? null;
if ($dest === null) {
    $dir = STORAGE_PATH . '/qr';
    if (!is_dir($dir)) {
        mkdir($dir, 0755, true);
    }
    $name = preg_replace('/[^a-z0-9]+/', '-', strtolower($isAbsolute ? (string) parse_url($url, PHP_URL_PATH) : $target)) ?? 'qr';
    $dest = $dir . '/qr-' . trim($name, '-') . '.png';
}

if (!$isAbsolute && !str_starts_with((string) config('base_url'), 'https://')) {
    fwrite(STDERR, "WARNUNG  base_url ist '" . (string) config('base_url') . "' — dieser QR-Code führt NICHT auf die echte Seite\n");
    fwrite(STDERR, "         und ist als Druckvorlage unbrauchbar. Entweder die Produktions-Config verwenden\n");
    fwrite(STDERR, "         oder die vollständige URL direkt übergeben:\n");
    fwrite(STDERR, "         php bin/qr.php https://tsv08kulmbach.de/{$target}\n\n");
}

if (!generate_qr_png($url, $dest, $scale)) {
    fwrite(STDERR, "FEHLER  QR-Code konnte nicht erzeugt werden (vendor-manual/phpqrcode vorhanden?)\n");
    exit(1);
}

[$w, $h] = getimagesize($dest) ?: [0, 0];
echo "QR-Code erzeugt\n";
echo "  Ziel-URL : {$url}\n";
echo "  Datei    : {$dest}\n";
echo "  Größe    : {$w}x{$h} px  (bei 300 dpi etwa " . round($w / 300 * 2.54, 1) . " cm)\n";
