<?php
class Request {

    protected $controllerName;
    protected $uriParameters;
    protected $data;
    protected static $_instance;

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

   public function __construct() {
      $this->initBaseURI();
      $this->initControllerAndParametersFromURI();
      $this->initData();
   }

   // 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 = parse_url($_SERVER['REQUEST_URI'], PHP_URL_QUERY);
   }

   // 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)
   // e.g. http://eden.imt-lille-douai.fr/~luc.fabresse/api.php
   //    => controllerName == 'default'
   //       uriParameters == []
   // e.g. http://eden.imt-lille-douai.fr/~luc.fabresse/api.php/user/1
   //    => controllerName == 'user'
   //       uriParameters == [ 1 ]
   protected function initControllerAndParametersFromURI(){

        $prefix = $_SERVER['SCRIPT_NAME'];
        $uriParameters = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

        $i=0;
        while($i<strlen($prefix) && $i<strlen($uriParameters))
        if($prefix[$i]===$uriParameters[$i])
        $i++;

        $uriParameters = substr($uriParameters, $i);

        $uriParameters = trim($uriParameters, '/');
        $uriSegments = explode('/', $uriParameters);

        $this->controllerName = array_shift($uriSegments) ?: "default";
        $this->uriParameters = $uriSegments;
    }

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

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

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

   public function initData() {
      if ($this->getHttpMethod() === 'PUT'){
         $this->data = "";
         $stream = fopen("php://input", "r");
         $next_byte=fread($stream, '1024');
         $this->data .= $next_byte;
         fclose($stream);
         $this->data=json_decode($this->data, TRUE);
      }
         
   }
   

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

   public function getData() {
      return $this->data;
   }

   

}