<?php
    class Request {
        protected $controllerName;
        protected $uriParameters;
        protected static $singleton = NULL;

        public function __construct() {
            $this->jsonReceived = null;
            $this->initBaseURI();
            $this->initControllerAndParametersFromURI();
        }

        public static function getCurrentRequest() {
            if (is_null(static::$singleton))
                static::$singleton = new static();
                
            return static::$singleton;
        }

        // intialise baseURI
        // e.g. http://eden.imt-lille-douai.fr/~luc.fabresse/api.php => __BASE_URI = /~luc.fabresse
        // e.g. http://localhost/CDAW/api.php => __BASE_URI = /CDAW
        protected function initBaseURI() {
            $this->baseURI = explode('/api.php', $_SERVER['SCRIPT_NAME'])[0];
        }

        // intialise controllerName et uriParameters
        // controllerName contient chaîne 'default' ou le nom du controleur s'il est présent dans l'URI (la requête)
        // uriParameters contient un tableau vide ou un tableau contenant les paramètres passés dans l'URI (la requête)
        protected function initControllerAndParametersFromURI(){
            $url = trim($_SERVER['PATH_INFO'], '/');
            $urlSegments = explode('/', $url);

            $scheme = ['controller', 'params'];
            $route = [];

            foreach ($urlSegments as $index => $segment){
                if ($scheme[$index] == 'params'){
                    $route['params'] = array_slice($urlSegments, $index);
                    break;
                } else {
                    $route[$scheme[$index]] = $segment;
                }
            }

            $this->controllerName = $route['controller'] != "" ? $route['controller'] : "default";
            $this->uriParameters = isset($route['params']) ? $route['params'] : [];
        }

        // ==============
        // Public API
        // ==============

            // retourne le name du controleur qui doit traiter la requête courante
        public function getControllerName() {
            return $this->controllerName;
        }

            // retourne la méthode HTTP utilisée dans la requête courante
        public function getHttpMethod() {
            return $_SERVER["REQUEST_METHOD"];
        }

        public function getUriParameters() {
            return $this->uriParameters;
        }
    }
?>