<?php

require_once __DIR__.'/../vendor/autoload.php';

// Symfony Aliasing
use Symfony\Component\Dotenv\Dotenv;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
use Symfony\Component\HttpKernel\Controller\ControllerResolver;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\Matcher\UrlMatcher;

// Solace Aliasing
use Solace\Framework\RoutingEngine;

// Init
$response = null;

// Error Handler
try {

    // Load variables from .env file
    $dotenv = new Dotenv();
    $dotenv->load(__DIR__.'/../.env');

    // Create Request Object
    $request = Request::createFromGlobals();

    // Load Routes From PHP File
    $routes = include __DIR__.'/../src/routes.php';

    // Create Request Context
    $context = new RequestContext();

    // Create URL Matcher
    $matcher = new UrlMatcher($routes, $context);

    // Create Resolvers
    $controllerResolver = new ControllerResolver();
    $argumentResolver = new ArgumentResolver();

    // Load Routing Engine and Pass Request
    $framework = new RoutingEngine($matcher, $controllerResolver, $argumentResolver);
    $response = $framework->handle($request);

// 404 Error
} catch (ResourceNotFoundException $exception) {
    // Begin Output Buffering
    ob_start();

    // Load Resource
    include __DIR__.'/../404.html';

    // Fetch Response Using Output Buffer
    $response = new Response(ob_get_clean(), 404);

// 500 Error
} catch (Exception $exception) {
    // Begin Output Buffering
    ob_start();

    // Load Resource
    include __DIR__.'/../50X.html';

    // Fetch Response Using Output Buffer
    $response = new Response(ob_get_clean(), 500);
}

// Send response to client
$response->send();

?>
