<?php
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(204);
    exit();
}

// ini_set('display_errors', 1);
// error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT & ~E_USER_NOTICE & ~E_USER_DEPRECATED);
// error_reporting(0);
// ini_set('display_errors', 0);
// ini_set('display_startup_errors', 0);
// error_reporting(0);

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

use App\Core\Router;
use App\Core\Attributes\Route as RouteAttr;
use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
use ReflectionClass;
use App\Core\Service\Redis;
//Existing environment variables will not be overwritten.
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
$router = new Router();
$rserver = new Redis();
if(!empty($_ENV['REDIS_HOST']) && !empty($_ENV['REDIS_PORT'])) {
    $conn = $rserver->connect();
}
require_once __DIR__ . '/app/Helpers/common.php';
$routes_arr = require __DIR__ . '/app/routes.php';
foreach ($routes_arr as $elem) {
    $m = [];
    if(count($elem) > 3) {
        $m = array_slice($elem, 2, count($elem)-3);
    }
    $router->add($elem[0], $elem[1], $elem[count($elem)-1], $m);
}

$dir = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator(__DIR__ . '/app/Controllers')
);

foreach ($dir as $file) {
    if ($file->getExtension() !== 'php') continue;
    $fqcn = 'App\\Controllers\\' . str_replace('/', '\\', str_replace('.php', '', substr($file->getPathname(), strlen(__DIR__ . '/app/Controllers/'))));
    
    if (!class_exists($fqcn) || $fqcn == 'App\Controllers\BaseController') continue;

    $ref = new ReflectionClass($fqcn);
    foreach ($ref->getMethods() as $method) {
        foreach ($method->getAttributes(RouteAttr::class) as $attr) {
            $data = $attr->newInstance();
            $router->add($data->method, $data->path, [$fqcn, $method->name], []);
        }
    }
}
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$base = '/' . basename(__DIR__);
if ($base !== '/' && str_starts_with($uri, $base)) {
    $uri = substr($uri, strlen($base));
}
$uri = '/' . ltrim($uri, '/');
$uri = rtrim($uri, '/');
$uri = $uri === '' ? '/' : $uri;
$router->dispatch($_SERVER['REQUEST_METHOD'], str_replace(__DIR__."/", '', $uri));
