<?php
/**
 * Clase para validar la sesión del usuario y que el usuario esté activo.
 *
 * @author Alejandro
 */
class ValidaSesion {
    private $acceso, $edicion, $pagina, $sistema = 8;//guarda si el usuario puede acceder y/o editar
    private $error, $hasError = false;
    
    /**
     * Constructor
     * @return boolean
     */
    function __construct($pdo, $submenu) {
        if (session_status() == PHP_SESSION_NONE) {
            session_start();
        }
        $session_life = 1*60*60;//1 hora convertido a segundos
        // check to see if $_SESSION["timeout"] is set
        if (isset($_SESSION['timeout'])) {
        // calculate the session's "time to live"
            $sessionTTL = time() - $_SESSION['timeout'];
            if ($sessionTTL > $session_life) {
                $this->terminaSesion();
            }
        }else
            $this->terminaSesion();
        $_SESSION['timeout'] = time();
        
        if(!isset($_SESSION['usuario_id']) || $_SESSION['usuario_id'] == '') $this->terminaSesion();
        
        //existe id en sesión?
        if(array_key_exists("usuario_id", $_SESSION) && is_numeric($_SESSION["usuario_id"]) && $_SESSION["usuario_id"] > 0){
            if(is_int($submenu)){
                $this->obtenerNombrePagina($pdo, $submenu);
                //valida permisos
                $stmt = $pdo->prepare('Select * from alu_fs_validapermisos(:rol, :sub)');//devuelve: permiso, edicion
                $stmt->bindParam(":rol", $_SESSION["RolUsuario_id"]);
                $stmt->bindParam(":sub", $submenu);
                if(!$stmt->execute()){
                    $this->hasError = true;
                    $this->error = $stmt->errorInfo();
                }else{
                    $rs = $stmt->fetch();
                    $stmt->closeCursor(); // cierra conexion de resultado
                    $stmt = null; // cierra conexion

                    //si es administrador de sistema, siempre es true
                    $this->acceso = (bool) $rs["permiso"];
                    $this->edicion = (bool) $rs["edicion"];
                    $rs = null;
                }
            }else if(is_array($submenu)){
                $stmt = $pdo->prepare('Select * from alu_fs_validapermisos(:sub, :sist)');//devuelve: permiso, edicion
                $stmt->bindParam(":sist", $this->sistema);
                foreach($submenu as $subItem){
                    if(!$this->hasError){
                        //valida permisos
                        $stmt->bindParam(":sub", $subItem);
                        if(!$stmt->execute()){
                            $this->hasError = true;
                            $this->error = $stmt->errorInfo();
                        }else{
                            $rs = $stmt->fetch();

                            //si es administrador de sistema, siempre es true
                            $this->acceso = $this->acceso || (bool) $rs["permiso"];
                            $this->edicion = $this->edicion || (bool) $rs["edicion"];
                            $rs = null;
                        }
                    }
                }
                $stmt->closeCursor(); // cierra conexion de resultado
                $stmt = null; // cierra conexion
            }else if(is_null($submenu)){
                //Valida permisos de acceso sistema
                $stmt = $pdo->prepare('Select * from fs_validasistema(:usr, :sist)');//devuelve: permiso, edicion
                $stmt->bindParam(":usr", $_SESSION["usuario_id"]);
                $stmt->bindParam(":sist", $this->sistema);
                if(!$stmt->execute()){
                    $this->hasError = true;
                    $this->error = $stmt->errorInfo();
                }else{
                    $rs = $stmt->fetch();
                    $stmt->closeCursor(); // cierra conexion de resultado
                    $stmt = null; // cierra conexion

                    $this->acceso = (bool) $rs["permiso"];
                    $this->edicion = false;//acceso a sistema no tiene edición
                    $rs = null;
                }
            }else{
                $this->hasError = true;
                $this->error = "Dato no válido en validación de permisos";
            }
        }else{
            $this->error = "No existe la llave en sesión";
            $this->hasError = true;
            $this->acceso = false;
            $this->edicion = false;
        }
        if($this->hasError){
            $this->acceso = false;
            $this->edicion = false;
        }
    }
    private function obtenerNombrePagina($pdo, $submenu){
        $this->pagina = '';
        try {
            $stmt = $pdo->prepare('SELECT "Submenu_desc" FROM fs_menusubmenus(:sist) WHERE "Submenu_id" = ' . $submenu );
            $stmt->bindParam(":sist", $this->sistema);
            if($stmt->execute()){
                $temp = $stmt->fetch();
                if (isset($temp['Submenu_desc']))
                    $this->pagina = $temp['Submenu_desc'];
            }
        } catch (\PDOException $ex) {}            
        $stmt->closeCursor();
        $stmt = null;
    }
    function nombrePagina(){
        return $this->pagina;
    }


    function tieneAcceso(){
        return $this->acceso;
    }
    
    function puedeEditar(){
        return $this->acceso && $this->edicion;
    }
    
    function tieneError(){
        return $this->hasError;
    }
    
    function getError(){
        return $this->error;
    }
    
    function terminaSesion(){
        $_SESSION = array();
        session_destroy();
        header('Location: salir.php?expired=1');
        exit();
    }
    
    public static function salirPagina(){
        $_SESSION = array();
        session_destroy();
        header('Location: salir.php');
        exit();
    }
    
    public static function errorBD(){
        $_SESSION = array();
        session_destroy();
        header('Location: error.php');
        exit();
    }
}