<?php
/**
 * Created by PhpStorm.
 * User: stahiy
 * Date: 28.08.17
 * Time: 17:12
 */
/*
error_reporting(E_ALL);
ini_set('display_errors', 1);
*/
require((dirname(__DIR__)) . '/bootstrap.php');

/*
 * TODO:Переделать
 */
$httpMethod = '';
$uri = '';
$nameModule = 'Application';
$nameController = 'IndexController';


$httpMethod = $_SERVER['REQUEST_METHOD'];
$uri = $_SERVER['REQUEST_URI'];
$uri = str_replace("/engine", "", $uri);
if (false !== $pos = strpos($uri, '?')) {
    $uri = substr($uri, 0, $pos);
}


$newUriArr = array_diff(explode("/", $uri), ['', null, false]);
if (!empty($newUriArr[1])) {
    $nameController = ucfirst($newUriArr[1]) . 'Controller';
    $nameModule = ucfirst($newUriArr[1]);
}
$uri = rawurldecode($uri);

$routeInfo = $dispatcher->dispatch($httpMethod, $uri);

$handler = 'indexAction';
$vars = [];
$realmNames = ['App', 'Aiti', 'Unisiter'];
try {
    foreach ($realmNames as $key => $name) {
        $nameRealmController = \App\Application\Controller\IndexController::getNameBaseController($name, $nameController);
        $className = $name . '\\' . $nameModule . '\\' . 'Controller' . '\\' . $nameRealmController;
        if ($name === 'App' && !class_exists($className)) {
            $subClassName = '';
            $last = $nameRealmController;
            $function = '';
            $method = array_pop($newUriArr);
            $count = count($newUriArr);
            $function = $newUriArr[$count];
            $classIndexName = $newUriArr[$count - 1];
            $sCName = '';
            foreach ($newUriArr as $kC => $nameSubModule) {
                $subClassName .= '\\' . ucfirst($nameSubModule);
                if ($kC !== $count) {
                    $sCName .= '\\' . ucfirst($nameSubModule);
                }
                $last = ucfirst($nameSubModule);
            }

            $subClassName2 = 'App' . $sCName . '\\Controller\\' . ucfirst($classIndexName) . 'Controller';
            $subClassName = 'App' . $subClassName . '\\' . 'Controller' . '\\' . $last . 'Controller';


            $newClassName = $subClassName;
            if (class_exists($subClassName)) {
                $newClassName = $subClassName;
            }

            if (class_exists($subClassName2)) {
                $newClassName = $subClassName2;
            }
            $className = $newClassName;
            if (!class_exists($className)) {
                continue;
            }

        } elseif (!class_exists($className)) {

            /**
             * TODO: error
             */
            continue;
        }
        $controller = new $className();
        if ($name === 'App') {
            if (!empty($routeInfo[2]) && is_array($routeInfo[2])) {
                $vars = $routeInfo[2];
            }
            if ($routeInfo[0] === FastRoute\Dispatcher::FOUND) {
                $handler = $routeInfo[1];
            } else {
                $handler = ucfirst(array_pop($newUriArr));
            }
            $controller->newUriArr = $newUriArr;
            $controller->$handler($vars);
            break;
        }
        if ($name !== "App") {
            if ($newUriArr[1] === 'ruscovers') {
                $newUriArr = array_diff(explode("/", $uri), array('', null, false));
                if (!empty($newUriArr[1])) {
                    $nameController = ucfirst($newUriArr[1]) . 'Controller';
                    $nameModule = ucfirst($newUriArr[1]);
                }
            }

            $handler = 'action' . ucfirst(array_pop($newUriArr));
            $controller->$handler($vars);
            break;
        }
    }
} catch (\Error|Exception $exception) {
    ErrorApp::send($exception);
    die();
}
