<?php
class FrontController{
    
    static function main(){

        require 'libs/Config.php'; //de configuracion
        require 'libs/SPDO.php'; //PDO con singleton
        require 'libs/ControllerBase.php'; //Clase controlador base
        require 'libs/ModelAbstract.php';
        require 'libs/ModelBase.php'; //Clase modelo base
        require 'libs/View.php'; //Mini motor de plantillas

        require 'libs/SessionsModel.php';//Clase para el manejo de sesiones
        require 'libs/filesManager.php';//Clase para el manejo de archivos
        require 'config.php'; //Archivo con configuraciones.

        if(! empty($_REQUEST['option']))
          $comp_name = $_REQUEST['option'];
        else
          $comp_name = "com_users";

        if(! empty($_REQUEST['controller']))
          $controllerName = $_REQUEST['controller'] . 'Controller';
        else
          $controllerName = "UsersController";

        if(! empty($_REQUEST['action']))
          $actionName = $_REQUEST['action'];
        else
          $actionName = "ingresar";

        $controllerPath = $config->get('components').DS.$comp_name.DS.$controllerName.'.php';
            
        //Incluimos el fichero que contiene nuestra clase controladora solicitada
        if(is_file($controllerPath))
          require $controllerPath;
        else
          die('El controlador no existe - 404 not found');

        //Si no existe la clase que buscamos y su accion, tiramos un error 404
        if (is_callable(array($controllerName, $actionName)) == false){
            trigger_error ($controllerName . '->' . $actionName . '` no existe', E_USER_NOTICE);
            return false;
        }
            
        if(isset($_SESSION['usersession']['iduser'])){
            $duracion_session =  20;//en minutos
            $valor_intervalo_session = 'PT'.$duracion_session.'M';
            $intervalo_session = new DateInterval( $valor_intervalo_session ); //minutos
            $session_valida = true;//variable para definir si vemos la acción o mostramos el login

            $frontSession = new SessionsModel();
            $rs_session = $frontSession->validarSession(@$_SESSION['usersession']['iduser']);
            //print_r($rs_session);
            $info_session = $rs_session->fetch();
            if(is_array($info_session)){
                $date_currency = new DateTime(date('Y-m-d H:i:s'));
                $date_session = new DateTime($info_session["date_last_activity"]);
                date_add($date_session, $intervalo_session);
                if($date_session < $date_currency ){
                    $session_valida = false;
                    //unset($_SESSION['usersession']);
                }else{
                    $session_valida = true;
                }
            }else{
                $session_valida = false;
            }

            if($session_valida){
                $date_last_activity = new DateTime(date("Y-m-d H:i:s"));

                $datos["date_last_activity"] = $date_last_activity->format("Y-m-d H:i:s") ;
                $frontSession->setIdValue($_SESSION['usersession']['idsession']);

                $_SESSION['usersession']['date_last_activity'] = $datos["date_last_activity"];

                list($rs_actividad, $message) = $frontSession->UpdateItem($datos);

                //Se direcciona al controlador
                $controller = new $controllerName();
                $controller->$actionName();
            }else{
                //establecemos el controlado y la acción por defecto
                $actionName = "logout";
                if($comp_name != "com_users"){
                    $comp_name = "com_users";
                    if($controllerName != "UsersController" ){
                        $controllerName = "UsersController"; //esto es para no instanciarlo dos veces
                        $controllerPath = $config->get('components').DS.$comp_name.DS.$controllerName.'.php';
                        require $controllerPath;
                    }
                }

                //:::instanciamos e invocamos la acción
                $controller = new $controllerName();
                $controller->$actionName();
            }
        }else{
            $controller = new $controllerName();
            $controller->$actionName();
        }
    }
}
?>