🌹🏠🌹？》《》？《》？<?php

declare(strict_types=1);

namespace App\App;

use App\Middlewares\Middlewares;
use App\Services\Openapi;
use App\Services\Cors;
use App\Services\Database;
use App\Services\Log;
use App\Services\Routes;
use Throwable;


try {

    require __DIR__ . '/../vendor/autoload.php';
    
    Config::init( __DIR__ . '/..' );

    list($container, $app) = require __DIR__ . '/../src/App/Container.php';

    // Carga de servicios, que tambien son agregados al container para el uso futuro de DI
    foreach([
        Log::class,
        Openapi::class,
        Database::class,        
    ] as $servicio) {
        $container->get( $servicio);
    }

    // otros servicios, aprovechando la DI, pero no se agregan al Container porque no se reutilizan
    foreach( [
        Cors::class,
        Routes::class,
        Middlewares::class,
    ] as $servicio ) {
        $container->make($servicio);             
    }

    $app->run();


} catch (Throwable $e) {
    if( isset( $container ) && $container->has(Log::class) ) {
        $container->get(Log::class)->critical($e->getMessage() );
    }
    
    http_response_code(500);
    header('Content-Type: application/json');
    $data = [
        'error' => $e->getMessage(),
        'trace' => $e->getTrace()
    ];
    die( json_encode($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT) );
}

