<?php

if (!function_exists('ensure_env_file')) {
    /**
     * @throws \Random\RandomException
     */
    function ensure_env_file(): void
    {
        $envPath = __DIR__ . '/../.env';
        $envExamplePath = __DIR__ . '/../.env.example';

        // 1. Check if .env exists
        if (!file_exists($envPath)) {
            // Copy .env.example
            copy($envExamplePath, $envPath);

            // 2. Generate a secure APP_KEY
            $key = 'base64:' . base64_encode(random_bytes(32));
            $contents = file_get_contents($envPath);

            if (str_contains($contents, 'APP_KEY=')) {
                $contents = preg_replace('/^APP_KEY=.*$/m', 'APP_KEY=' . $key, $contents);
            } else {
                // fallback: append APP_KEY if not found
                $contents .= PHP_EOL . 'APP_KEY=' . $key;
            }

            file_put_contents($envPath, $contents);
        }
    }
}

ensure_env_file();

/*
|--------------------------------------------------------------------------
| Create The Application
|--------------------------------------------------------------------------
|
| The first thing we will do is create a new Laravel application instance
| which serves as the "glue" for all the components of Laravel, and is
| the IoC container for the system binding all of the various parts.
|
*/

$app = new Illuminate\Foundation\Application(
    $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);

/*
|--------------------------------------------------------------------------
| Bind Important Interfaces
|--------------------------------------------------------------------------
|
| Next, we need to bind some important interfaces into the container so
| we will be able to resolve them when needed. The kernels serve the
| incoming requests to this application from both the web and CLI.
|
*/

$app->singleton(
    Illuminate\Contracts\Http\Kernel::class,
    App\Http\Kernel::class
);

$app->singleton(
    Illuminate\Contracts\Console\Kernel::class,
    App\Console\Kernel::class
);

$app->singleton(
    Illuminate\Contracts\Debug\ExceptionHandler::class,
    App\Exceptions\Handler::class
);

/*
|--------------------------------------------------------------------------
| Return The Application
|--------------------------------------------------------------------------
|
| This script returns the application instance. The instance is given to
| the calling script so we can separate the building of the instances
| from the actual running of the application and sending responses.
|
*/

return $app;
