<?php 
require_once APPRAIZ . 'inc/sistema/Session.class.inc';

class ControleAcesso { 
 
	final public function  __construct(){
		$sisdiretorio = $this->getDiretorioDoSistema(Session::get('sisdiretorio'));
		Session::set('sisdiretorio' ,$sisdiretorio); 
		$this->verificaUsuarioLogado();
	}

	public static function tratarUrlRelativaAnterior($url_anterior){
        if ($url_anterior){
            ControleAcesso::loadAcessosUsuario($url_anterior);
            $url_relativa_anterior = ControleAcesso::getUrlRelativa($url_anterior);
            $url_relativa_anterior = ControleAcesso::checkUrl($url_relativa_anterior);

            return $url_relativa_anterior;
        }
    }

	public static function verificaPermissaoUrlUsuarioLogado($url_atual){
	    global $url;
	    ControleAcesso::verificaUsuarioLogado();
	    ControleAcesso::loadAcessosUsuario($url_atual);
		$url = ControleAcesso::getUrlRelativa($url_atual);
		ControleAcesso::checkFavoritaUrl($url);
		$menus = Session::get('acl');
		$sisid = Session::get('sisid');
		
		$url = ControleAcesso::checkUrl($url);

		// função para tratamento url relativa anterior
        $url_anterior = Session::get('url_ultimo_acesso');
        $url_relativa_anterior = ControleAcesso::tratarUrlRelativaAnterior($url_anterior);
        
        //ver($menus);
        //ver($sisid,1);
        
        // @TODO tratar essa condição de menus que é utilizada após o login
		if (!$menus[$sisid]) {
		    
            $menus = ControleAcesso::getMenusUsuarioSistema();
            ControleAcesso::setMenuInSession($menus,$sisid);

            if($menus[$url]){
                Session::set('url_ultimo_acesso',$url_anterior);
            } else {
                if ($menus[$sisid][$url_anterior]) {
                    Session::set('url_ultimo_acesso', $url_anterior);
                } else if(isset($_SESSION['url_inicio_personalizada']) ){
                    // Url configurada em Associar Menu Inicio Perfil
                    $urlInicio = '/' .Session::get('sisdiretorio'). '/' . $_SESSION['url_inicio_personalizada'];
                    Session::set('url_ultimo_acesso', $urlInicio);
                }
            }

            if(isset($menus[$url])){
                return $menus[$url];
            }else {
                return $menus[self::resolveAcaoUrl($url)];
            }

		}
		
		// se a url digitada existe então
        if($menus[$sisid][$url]){
            Session::set('url_ultimo_acesso', $url_atual);
            Session::set('mnuid', $menus[$sisid][$url]['mnuid']);
        }else if($menus[$sisid][self::resolveAcaoUrl($url)]){
            Session::set('url_ultimo_acesso', self::resolveAcaoUrl($url_atual));
            Session::set('mnuid', $menus[$sisid][self::resolveAcaoUrl($url)]['mnuid']);
        } else {
            
            if ($menus[$sisid][$url_relativa_anterior]) {
                Session::set('url_ultimo_acesso', $url_anterior);
            }
            
            return $menus[$sisid][Session::get('url_ultimo_acesso')];
        }

        if(isset($menus[$sisid][$url])){
            return $menus[$sisid][$url];
        }else {
            return $menus[$sisid][self::resolveAcaoUrl($url)];
        }
	}

	public static function  verificaUsuarioLogado()
	{ 

		if (!Session::get('usucpf') || !Session::get('sisid')) { 
			session_unset ();
			Session::set('link_tentativa',$_SERVER ['HTTP_HOST'] . $_SERVER ['REQUEST_URI']);
			Session::set('MSG_AVISO', 'Autenticação inválida. Efetue login novamente.');
			header ( 'Location: ../logout.php' );
			exit;
		}   
	}

	public static function  getUrlRelativa($request_url){
	    return str_replace ( '/' . Session::get('sisdiretorio'). '/', '', $request_url );

	}

	public static function  getDiretorioDoSistema($sisdiretorio){

        if (empty($sisdiretorio))
	        return explode("/", $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'])[1];
        return $sisdiretorio;
	}

	public static function  checkFavoritaUrl($url){
		if (! strpos ( $url, 'favorito' )) {
			Session::set('favurl' ,$url);  
		}
	}

	public static function  checkUrl ($url){
		$posicao = strpos ( $url, '&acao=' );
		if($posicao != false){
		    $url = substr ( $url, 0, $posicao + 7 );
		}else{
		    $arrUrl = explode('&', $url);
		    $url = urldecode($arrUrl[0]);
		}
		return $url;	
	}

	public static function  getMenusUsuarioSistema(){

	    global $db;

        $sql =" SELECT mnu.mnuid,
                       mnu.mnudsc,
                       pfu.usucpf,
                       pfu.pflcod,
                       pfl.pfldsc,
                       TRIM(mnu.mnulink) AS mnulink
                  FROM seguranca.perfilusuario pfu,
                       seguranca.perfil pfl,
                       seguranca.menu mnu,
                       seguranca.perfilmenu pfm
                  WHERE pfu.pflcod = pfl.pflcod
                    AND mnu.mnuid = pfm.mnuid
                    AND pfm.pflcod = pfl.pflcod
                    AND pfu.usucpf = '".Session::get("usucpf")."'
                    AND pfl.sisid = ".Session::get("sisid")."
                    AND mnu.mnulink IS NOT NULL; ";

        $saida = $db->carregar($sql);

        $acls = array();
        if (is_array($saida)) {
            foreach ($saida as $menu) {
                $acls[$menu['mnulink']] = $menu;
            }
        }
        return $acls;
	}

	public static function  setMenuInSession($menus,$sisid){
	    $_SESSION['acl'][$sisid] = $menus;
	    Session::load($_SESSION);
	} 

	public static function  setDadosMenu($arrMenu){
		$arrRet = array();
		$arrRet[] = $arrMenu['abacod'];
		$arrRet[] = $arrMenu['mnutransacao'];

		if (isset($url) && !strpos($url, 'favorito')) {
		Session::set('mnudsc', $arrMenu['mnudsc'] . '...');
		}
		Session::set('mnuid', $arrMenu['mnuid']); 
		 
		$arrRet[] = $arrMenu['mnuid'];

		return $arrRet;
	}

	public static function  loadAcessosUsuario($urlRequest) {
        global $db;
        preg_match( '/\/([a-zA-Z_2]*)\//', $urlRequest, $sisdiretorio );
        $sisdiretorio = $sisdiretorio[1];
        preg_match( '/\/([a-zA-Z_2]*)\.php/', $urlRequest, $sisarquivo );
        $sisarquivo = $sisarquivo[1];

        if (
                ($sisdiretorio != NULL and Session::get('usucpf'))
                and (
                    $sisarquivo != Session::get('sisarquivo') or
                    $sisdiretorio != Session::get('sisdiretorio')
                )
        )
        {
            // obtém os dados do módulo
            $sql = sprintf(
                "SELECT
                    s.sisid, s.sisdiretorio, s.sisarquivo, s.sisdsc, s.sisurl, s.sisabrev, s.paginainicial, p.pflnivel AS usunivel, us.susdataultacesso, us.suscod, s.sisarquivo
                    FROM seguranca.usuario u
                    INNER JOIN seguranca.perfilusuario pu USING ( usucpf )
                    INNER JOIN seguranca.perfil p ON pu.pflcod = p.pflcod
                    INNER JOIN seguranca.sistema s ON p.sisid = s.sisid
                    INNER JOIN seguranca.usuariosistema us ON s.sisid = us.sisid AND u.usucpf = us.usucpf
                WHERE
                    s.sisdiretorio = '%s' AND
                    s.sisarquivo = '%s' AND
                    u.usucpf = '%s' AND
                    us.suscod = 'A' AND
                    p.pflstatus = 'A' AND
                    u.suscod = 'A'
                ORDER BY p.pflnivel
                LIMIT 1",
                $sisdiretorio,
                $sisarquivo,
                Session::get('usucpf')
            );
            $rs = $db->carregar($sql);
            $sistema = $rs[0];

            if( is_array($sistema) ){
                foreach ( $sistema as $attribute => $value ) {
                    $_SESSION[$attribute] = $value;
                }
                Session::load($_SESSION);
            }
        }
	}

    public static function getDadosBreadcrumbUrl($url = '')
    {
        //ControleAcesso::getDadosBreadcrumbUrl()
        if(empty($url)){
            $url = $_SERVER ['REQUEST_URI'];
        }

        global $db;

        $url = ControleAcesso::getUrlRelativa($_SERVER ['REQUEST_URI']);
        $url = explode('&', $url)[0];
        $sql =" SELECT 
                m1.mnudsc as p1, 
                m2.mnudsc as p2, 
                m3.mnudsc as p3, 
                m4.mnudsc as p4, 
                m5.mnudsc as p5,
                m1.mnulink as linkp1, 
                m2.mnulink as linkp2, 
                m3.mnulink as linkp3, 
                m4.mnulink as linkp4, 
                m5.mnulink as linkp5
                
                FROM seguranca.menu m1 
                LEFT JOIN seguranca.menu m2  ON m2.mnuidpai= M1.mnuid
                LEFT JOIN seguranca.menu m3  ON m3.mnuidpai= m2.mnuid
                LEFT JOIN seguranca.menu m4  ON m4.mnuidpai= m3.mnuid
                LEFT JOIN seguranca.menu m5  ON m5.mnuidpai= m4.mnuid
                WHERE m1.mnuidpai IS NULL 
                    AND m1.mnustatus = 'A' 
                    AND M1.sisid = {$_SESSION['sisid']} 
                    AND (
                         TRIM(M1.mnulink) = TRIM('".$url."') OR 
                         TRIM(M2.mnulink) = TRIM('".$url."')  OR 
                         TRIM(M3.mnulink) = TRIM('".$url."')  OR 
                         TRIM(M4.mnulink) = TRIM('".$url."')  OR 
                         TRIM(M5.mnulink) = TRIM('".$url."')  
                    )                
                order by m1.mnuordem asc,
                m2.mnuordem,
                m3.mnuordem,
                m4.mnuordem,
                m5.mnuordem; ";

        $r = $db->carregar($sql);
        $r= $r[0];
        $r = is_array($r) ? $r : array();
        $arrRetorno =  array();
        foreach ($r as $key=>$value) {
            if(!empty($value))
                $arrRetorno[] = $value;


            $str_comp = explode('&', $r['link'.$key])[0];
            if($str_comp == $url)
                break;
        }
        return $arrRetorno;
    }

    public static function resolveAcaoUrl($url){
        $arrUrl = explode('&', $url);
	    if(strpos($url, 'acao=A')){
            $url = urldecode($arrUrl[0]);
        }else{
            $url .="&acao=A";
        }
	    return $url;
    }
}
