<?php

declare(strict_types=1);

namespace MintyPHP\Console\Support;

use MintyPHP\App\AppContainer;
use MintyPHP\Http\RequestContext;
use RuntimeException;

final class CliAppBootstrap
{
    private static bool $booted = false;
    private static ?AppContainer $container = null;

    private function __construct()
    {
    }

    public static function projectRoot(): string
    {
        return dirname(__DIR__, 3);
    }

    public static function bootstrap(string $channel = 'cli', string $path = 'bin/cli'): AppContainer
    {
        if (!self::$booted) {
            $projectRoot = self::projectRoot();
            chdir($projectRoot);

            require_once $projectRoot . '/vendor/autoload.php';
            require_once $projectRoot . '/config/config.php';
            require_once $projectRoot . '/core/Support/helpers.php';

            /** @var AppContainer $container */
            $container = require $projectRoot . '/core/App/registerContainer.php';
            setAppContainer($container);

            self::$container = $container;
            self::$booted = true;
        }

        RequestContext::start([
            'channel' => $channel,
            'method' => 'CLI',
            'path' => $path,
        ]);

        if (!self::$container instanceof AppContainer) {
            throw new RuntimeException('CLI app container bootstrap failed.');
        }

        return self::$container;
    }
}
