<?php
/**
 * speed.php - All-in-One Speedtest Endpoint
 *
 * FÜHRE DIESES SKRIPT EINMALIG PER CLI AUS, UM DIE ZUFALLSDATEN-DATEI ZU GENERIEREN:
 * > php /pfad/zum/script/speed.php
 */

// --- KONFIGURATION ---
define('DATA_FILE_NAME', 'random_data.php');
// KORREKTUR: Wir definieren den VOLLSTÄNDIGEN Pfad zur Datendatei,
// basierend auf dem Speicherort dieses Skripts. Das ist jetzt idiotensicher.
define('DATA_FILE_PATH', __DIR__ . '/' . DATA_FILE_NAME);
define('NUM_CHUNKS', 10);
define('CHUNK_SIZE_KB', 256);


// --- KONTEXT-WEICHE: CLI oder WEB? ---
if (php_sapi_name() === 'cli') {
    // --- GENERATOR-MODUS ---
    echo "Führe im CLI-Modus aus. Generiere '" . DATA_FILE_PATH . "'...\n";

    $chunk_size_bytes = CHUNK_SIZE_KB * 1024;
    $chunks_array = [];
    for ($i = 0; $i < NUM_CHUNKS; $i++) {
        echo "Generiere Block " . ($i + 1) . "/" . NUM_CHUNKS . "...\n";
        $random_data = random_bytes($chunk_size_bytes);
        $chunks_array[] = base64_encode($random_data);
    }

    $file_content = "<?php\n// " . DATA_FILE_NAME . "\n// Generiert am: " . date('Y-m-d H:i:s') . "\n\n";
    $file_content .= "\$RANDOM_CHUNKS = [\n";
    foreach ($chunks_array as $chunk) {
        $file_content .= "    '" . $chunk . "',\n";
    }
    $file_content .= "];\n?>";

    // KORREKTUR: Schreibe in den absoluten Pfad.
    if (file_put_contents(DATA_FILE_PATH, $file_content)) {
        echo "\nERFOLG: '" . DATA_FILE_PATH . "' wurde erfolgreich erstellt.\n";
    } else {
        echo "\nFEHLER: Konnte '" . DATA_FILE_PATH . "' nicht schreiben.\n";
    }
    exit(0);
}


// --- WEB-MODUS ---

// Security & Caching Headers
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Pragma: no-cache");

// Logik-Weiche: GET für Download, POST für Upload
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // --- UPLOAD LOGIK ---
    $input = file_get_contents('php://input');
    $received_bytes = strlen($input);
    header('Content-Type: text/plain');
    echo $received_bytes;
    exit();
}

if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    // --- DOWNLOAD LOGIK ---
    if (!file_exists(DATA_FILE_PATH)) {
        http_response_code(503); // Service Unavailable
        echo "FEHLER: Bitte das Skript zuerst einmal per CLI ausführen um Zufallsdaten zu erzeugen.";
        exit();
    }

    require_once DATA_FILE_PATH;

    $chunks_to_send = isset($_GET['chunks']) ? (int)$_GET['chunks'] : 1;
    $chunk_size_bytes = CHUNK_SIZE_KB * 1024;
    $total_size_bytes = $chunks_to_send * $chunk_size_bytes;

    header('Content-Type: application/octet-stream');
    header('Content-Length: ' . $total_size_bytes);

    for ($i = 0; $i < $chunks_to_send; $i++) {
        $random_chunk_base64 = $RANDOM_CHUNKS[array_rand($RANDOM_CHUNKS)];
        echo base64_decode($random_chunk_base64);
        flush();
    }
    exit();
}
if ($_SERVER['REQUEST_METHOD'] === 'HEAD') {
    // Der Jitter-Test sendet HEAD. Wir antworten einfach mit 200 OK.
    // Der Webserver sorgt dafür, dass kein Body gesendet wird.
    exit();
}

// Fallback für andere HTTP-Methoden
http_response_code(405);
echo "Method Not Allowed";
exit();
?>
