<?php

use Illuminate\Foundation\Application;
use Illuminate\Http\Request;

define('LARAVEL_START', microtime(true));

// Emergency fix: intercept base64-corrupted PHP files before Composer autoload.
// Two-step: (1) try to write decoded content back to disk; (2) if file is
// not writable, cache decoded PHP and serve it via a prepended autoloader
// that eval()s the decoded class definition — so the site recovers even when
// the persistent-storage overlay is read-only.
(function () {
    $base = dirname(__DIR__);
    $fixed = []; // path => decoded PHP content (for files we couldn't write)

    foreach ([$base . '/app', $base . '/routes'] as $dir) {
        if (!is_dir($dir)) {
            continue;
        }
        $it = new RecursiveIteratorIterator(
            new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS)
        );
        foreach ($it as $fileInfo) {
            if ($fileInfo->getExtension() !== 'php') {
                continue;
            }
            $path = $fileInfo->getPathname();
            if (!is_readable($path)) {
                continue;
            }
            $raw = file_get_contents($path);
            if ($raw === false || strlen($raw) < 10 || substr($raw, 0, 2) === '<?') {
                continue; // already valid PHP
            }
            $dec = base64_decode(trim($raw), true);
            if ($dec === false || strlen($dec) < 10 || substr($dec, 0, 2) !== '<?') {
                continue;
            }
            // Decoded content is valid PHP — restore the file
            if (is_writable($path)) {
                file_put_contents($path, $dec);
            } else {
                // Can't write — cache for eval-based loading below
                $fixed[$path] = $dec;
            }
        }
    }

    if (empty($fixed)) {
        return;
    }

    // Build a map from PSR-4 class name => decoded source for unwritable files.
    // Converts e.g. /var/…/app/Models/Job.php → App\Models\Job
    $classMap = [];
    foreach ($fixed as $path => $src) {
        // Extract namespace + class from decoded source
        if (preg_match('/^namespace\s+([\w\\\\]+)\s*;/m', $src, $nsM) &&
            preg_match('/^(?:(?:abstract|final)\s+)?class\s+(\w+)/m', $src, $clM)) {
            $fqcn = $nsM[1] . '\\' . $clM[1];
            $classMap[$fqcn] = $src;
        }
    }

    if (empty($classMap)) {
        return;
    }

    // Prepend a custom autoloader that evals the decoded source when Composer
    // would otherwise include the corrupted file.
    spl_autoload_register(function (string $class) use ($classMap) {
        if (!isset($classMap[$class])) {
            return;
        }
        // Strip opening <?php tag and eval the class body
        $src = preg_replace('/^<\?php\s*/i', '', $classMap[$class], 1);
        eval($src); // phpcs:ignore
    }, true /* throw */, true /* prepend */);
})();

// Determine if the application is in maintenance mode...
if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) {
    require $maintenance;
}

// Register the Composer autoloader...
require __DIR__.'/../vendor/autoload.php';

// Bootstrap Laravel and handle the request...
/** @var Application $app */
$app = require_once __DIR__.'/../bootstrap/app.php';

$app->handleRequest(Request::capture());
