<?php
require_once ROOT. 'sistema' . DS . 'control'. DS .'dbLdap.php';
class loginControlador extends Controlador
{
    private $atloginModelo;
    private $atParametrosModelo;
    private $atLogsModelo;
    private $atDbLdap;
    private $limiteErrores;

    public function __construct()
	{
		parent::__construct();
        $this->atloginModelo=$this->metCargarModelo('login');
        $this->atLogsModelo=$this->metCargarModelo('logs');
        $this->atParametrosModelo=$this->metCargarModelo('parametros');
        $this->atDbLdap=new conexLdap();
        Session::metCrear('ip',Session::metObtenerIp());
	}

	public function metIndex()
	{
        Session::metNoAccesoSiLogueo();
        $captcha = $this->metGenerarCodigoCaptcha();
        //$imagen = $this->metGenerarImagenCaptcha($captcha);
        $this->atVista->assign('captcha', $captcha);
        //$this->atVista->assign('imagen', $imagen);
        $this->atVista->metRenderizar('login','login');
	}

    /**
     * Actualizado por  : Jesús Millán, 24 sept 2018.
     * Descripción      : Permite al usuario validarse mediante el siace ó a través del LDAP para entrar al sistema. y registar los fallos de inicio de sesion para bloquear la cuenta.
     */
    public function metLoginCheck(){
        Session::metNoAccesoSiLogueo();
        $form=$this->metObtenerTexto('login');
	    //$captcha = $_POST['g-recaptcha-response'];
        $validarUsuario='';
        $bloqueado=FALSE;
        if(!lOGINLDAP){//Si entra, se loguéa a través del siace. lOGINLDAP: variable establecida en el config.
        
            
            if(!isset($_SESSION[$form['usuario']]['attempt'])){
                $_SESSION['attempt'] = 0;
            }
            if(isset($_SESSION[$form['usuario']]['attempt_again'])){
                $now = time();
                if($now >= $_SESSION[$form['usuario']]['attempt_again']){
                    //unset($_SESSION[$form['usuario']]['attempt']);
                    $_SESSION[$form['usuario']]['attempt']=0;
                    unset($_SESSION[$form['usuario']]['attempt_again']);
                }
            }
            if(isset($_SESSION[$form['usuario']]) &&isset($_SESSION[$form['usuario']]['attempt']) && $_SESSION[$form['usuario']]['attempt'] == 3 && $_SESSION[$form['usuario']]['usuario_bloqueado']==$form['usuario']){
                $_SESSION['error'] = 'Bloqueado';
//                $restante = $_SESSION[$form['usuario']]['attempt_again'] - time();
//                $m = date("i",$restante);
//                $Msj='Debe esperar 10 minutos para volver a intentar. Puede intentar en '.$m.' minutos';
                $Msj='Usuario esta Bloqueado. Por favor comuniquese con el Administrador del Sistema';
                $bloqueado=TRUE;
            }
            else{

                $estado=$this->atloginModelo->metValidarCuenta($form['usuario']);
                if(!$estado){
                     
                     $Msj='Usuario no registrado';

                }elseif($estado['num_estatus']==0){//validamos que el usuario no este bloqueado
                    
                    $Msj='Usuario esta Bloqueado. Por favor comuniquese con el Administrador del Sistema';
                    $bloqueado=TRUE;

                }elseif($form['captcha']!=$form['validacionCaptcha']){//validamos que el captcha ingresado sea correcto                 
                    $Msj='Codigó de validación incorrecto';                    
                    $this->atLogsModelo->metRegistrarLogs($estado['pk_num_seguridad_usuario'],4,'CODIGO DE VALIDACION INCORRECTO', Session::metObtener('ip'));


                }elseif ($form['password']=='') {

                    $Msj='Por favor introduzca su clave';

                }elseif(!$validarUsuario=$this->atloginModelo->metValidarUsuario($form['usuario'],$form['password'])){//validamos que el password ingresado sea correcto                    
                    
                    //verificamos la cantidad de fallos para bloquear la cuenta 
                    $limite=3;
                    $_SESSION[$form['usuario']]['attempt'] += 1;
                    $fallos['num_error_inicio_sesion'] = $_SESSION[$form['usuario']]['attempt'];
                    $this->atloginModelo->metRegistrarErrorClaveUsuario($form['usuario']);
                    
                    if($fallos['num_error_inicio_sesion'] >= $limite){
                        
                        $_SESSION[$form['usuario']]['attempt_again'] = time() + (10*60);
                        $_SESSION[$form['usuario']]['usuario_bloqueado'] = $form['usuario'];
                        $this->atloginModelo->metBloquearUsuario($form['usuario']);
                        $Msj='Usuario '.$form['usuario'].' Bloqueado. Por favor comuniquese con el Administrador del Sistema';
                        $bloqueado=TRUE;
                        
                         $this->atLogsModelo->metRegistrarLogs($estado['pk_num_seguridad_usuario'],5,'SE HA BLOQUEADO EL USUARIO, DESPUES DE 3 INTENTOS FALLIDOS DE CLAVE INCORRECTA', Session::metObtener('ip'), '(3) CONTRASEÑA INCORRECTA '.Hash::metObtenerHash($form['password']));
                    
                    }elseif($fallos['num_error_inicio_sesion']==($limite-1)){
                        
                        $this->atLogsModelo->metRegistrarLogs($estado['pk_num_seguridad_usuario'],3,'HA INTRODUCIDO LA CLAVE INCORRECTA', Session::metObtener('ip'), '(2) CONTRASEÑA INCORRECTA '.Hash::metObtenerHash($form['password']));
                        $Msj='Clave incorrecta, le queda 1 intento.';
                    
                    }elseif($fallos['num_error_inicio_sesion']<$limite){                    
                        $this->atLogsModelo->metRegistrarLogs($estado['pk_num_seguridad_usuario'],3,'HA INTRODUCIDO LA CLAVE INCORRECTA', Session::metObtener('ip'), '(1) CONTRASEÑA INCORRECTA '.Hash::metObtenerHash($form['password']));
                        $Msj='Clave incorrecta, le quedan '.($limite-$fallos['num_error_inicio_sesion']).' intentos.';
                    }

                    $_SESSION[$form['usuario']]['usuario_actual'] = $form['usuario'];
                } 
            }

        }else{//De lo contrario se loguéa en el LDAP.
            if($conex=$this->atDbLdap->metLdapConexion()) {
                //Se valida el usuario
                if ($login = $this->atDbLdap->matLdapVerificaUsuario($form['usuario'], $form['password'], $conex)) {
                    //Se extrae el número de cédula del usuario en el ldap.
                    $campos = array("pager");
                    if ($cedulaUser = $this->atDbLdap->metLdapBuscaDataUser($form['usuario'], $conex, $campos)[0]) {
                        //Se extrae los datos del usuario en el siace.
                        if (!$validarUsuario = $this->atloginModelo->metBuscaDataUsuario($cedulaUser)) {
                            $Msj = '¡Atención!, no se encontró sus datos como usuario del sistema';
                        }
                    } else {
                        $Msj = 'Disculpe, hubo un error de conexión con el LDAP';
                    }
                    $this->atDbLdap->metLdapCerrar($conex);
                } else {
                    $Msj = 'Usuario o Contraseña erróneos para LDAP';
                }
            }else{
                $Msj = 'No hay conexión con el LDAP';
            }
        }
        if($validarUsuario){
            ## borramos la cantidad de intentos fallidos registrados en la tabla a018
            $this->atloginModelo->metResetearErroresInicioSesion($form['usuario']);
            unset($_SESSION[$validarUsuario['ind_usuario']]['attempt']);
            unset($_SESSION[$validarUsuario['ind_usuario']]['attempt_again']);
            Session::metCrear('codigoUnico', Hash::metObtenerHash($validarUsuario['ind_usuario'].$validarUsuario['pk_num_seguridad_usuario'].Session::metObtenerIp()));
            Session::metCrear('usuario', $validarUsuario['ind_usuario']);
            Session::metCrear('idUsuario', $validarUsuario['pk_num_seguridad_usuario']);
            Session::metCrear('idEmpleado', $validarUsuario['pk_num_empleado']);
            Session::metCrear('idPersona', $validarUsuario['pk_num_persona']);
	        Session::metCrear('idDependencia', $validarUsuario['fk_a004_num_dependencia']);
            Session::metCrear('cedula_empleado', $validarUsuario['ind_cedula_documento']);
            Session::metCrear('idNomina',$validarUsuario['fk_nmb001_num_tipo_nomina']);
			Session::metCrear('cargo',$validarUsuario['ind_descripcion_cargo']);
            if($validarUsuario['ind_foto']!=null){
                Session::metCrear('imagenUsuario', BASE_URL . 'publico/imagenes/modRH/fotos/'.$validarUsuario['ind_foto']);
            }else{
                if($validarUsuario['cod_detalle']!='F'){
                    Session::metCrear('imagenUsuario', BASE_URL . 'publico/imagenes/TemaBasico/avatar/avatar-hombre.png');
                }else{
                    Session::metCrear('imagenUsuario', BASE_URL . 'publico/imagenes/TemaBasico/avatar/avatar-mujer.png');
                }
            }
            Session::metCrear('idEmpleado', $validarUsuario['pk_num_empleado']);
            if(!isset($validarUsuario['ind_nombre2']) || $validarUsuario['ind_nombre2']==''){
                $validarUsuario['ind_nombre2']=' ';
            }
            if(!isset($validarUsuario['ind_apellido1']) || $validarUsuario['ind_apellido1']==''){
                $validarUsuario['ind_apellido1']=' ';
            }
            if(!isset($validarUsuario['ind_apellido2']) || $validarUsuario['ind_apellido2']=='') {
                $validarUsuario['ind_apellido2']=' ';
            }
            Session::metCrear('nombreUsuario', $validarUsuario['ind_nombre1'].' '.$validarUsuario['ind_nombre2'][0].'. '.$validarUsuario['ind_apellido1'].' '.$validarUsuario['ind_apellido2'][0].'.');
            $parametros=$this->atParametrosModelo->metListarParametros(true);
            for($i=0;$i<count($parametros);$i++){
                Session::metCrear($parametros[$i]['ind_parametro_clave'], $parametros[$i]['ind_valor_parametro']);
            }
            Session::metCrear('tiempo', time());            
            $this->atloginModelo->metActualizazStatus($validarUsuario['ind_usuario'],Session::metObtener('ip'));
            $this->atLogsModelo->metRegistrarLogs(Session::metObtener('idUsuario'),1,'ACCESO CORRECTO', Session::metObtener('ip'));
            $arrayUsuario=array(
                'status'=>'valido','bloqueado'=>FALSE
            );
        }else{
            $arrayUsuario=array(
                'status'=>$Msj,'bloqueado'=>$bloqueado
            );
        }
        echo json_encode($arrayUsuario);
    }

    public function metLoginCerrarSesion()
    {
        $this->atLogsModelo->metRegistrarLogs(Session::metObtener('idUsuario'),2,'HA CERRADO LA SESIÓN CORRECTAMENTE', Session::metObtener('ip'));
        $this->atloginModelo->metActualizazStatus(Session::metObtener('usuario'),'');
        Session::metCerrarSesion();
        $this->metRedireccionar('login');
    }

    public function metGenerarCodigoCaptcha(){

        $captcha="";
        $paramentros="123456789ABCDEFGHIJKLMNPQRSTUVWXYZ";
        $maximo=strlen($paramentros)-1;

        for($i=0; $i<4; $i++){

            $captcha.=$paramentros{mt_rand(0,$maximo)};

        }

        return $captcha;
    }
    
    /**
     * Método para cargar vista formulario desbloquear clave.
     *
     * @return Response
     */
    ///*
    public function metForm()
    {
        ##  valores del formulario

        if (isset($_POST['user'])) {
            # code...
            $hola='hola';
            $resultado = $this->atloginModelo->metConsultarPreguntasSeguridad($_POST['user']);
            if ($resultado['pk_num_preguntas_secretas']!=NULL) {
                # code..
                $opcion='desbloquear';
            }else{
                $opcion='nuevo';
            }
        }


        if($opcion == 'desbloquear'){
            $form =[
                'metodo'=>'verificarRespuestas',
                'usuario'=>$_POST['user'],
                'pregunta'=>mt_rand(1,3),
                'num_pregunta1'=> $resultado['num_pregunta1'],
                'num_pregunta2'=> $resultado['num_pregunta2'],
                'num_pregunta3'=> $resultado['num_pregunta3'],
                'ind_respuesta1'=> $resultado['ind_respuesta1'],
                'ind_respuesta2'=> $resultado['ind_respuesta2'],
                'ind_respuesta3'=> $resultado['ind_respuesta3'],
                'num_estatus'=> $resultado['num_estatus'],
            ];
            $disabled =[
                'editar' => 'disabled',
                'ver' => 'disabled',
            ];
        }
        
        if($opcion == 'nuevo'){
            $form =[
                'metodo'=>'verificarUsuario',
                //'pregunta'=>mt_rand(1,3),
                'num_pregunta1'=>1,
                'num_pregunta2'=>2,
                'num_pregunta3'=>3,
            ];
            $disabled =[
                'editar' => 'disabled',
                'ver' => '',
            ];
        }

        ##  vista
        $this->atVista->assign('form', $form);
        $this->atVista->assign('disabled', $disabled);
        $this->atVista->metRenderizar('formulario','modales');
    }//*/


    public function metVerificarUsuario()
    {
        //$form=$this->metObtenerTexto('login');
        //$this->atloginModelo->metValidarCuenta($form['usuario']);
        $formAlphaNum=$this->metObtenerFormulas('form','alphaNum');
        if(!empty($formAlphaNum)) {
            //$validacion['name']='A:';
            foreach ($formAlphaNum as $tituloAlphaNum => $valorAlphaNum) {
                if (!empty($formAlphaNum[$tituloAlphaNum]) && $formAlphaNum[$tituloAlphaNum] != '') {
                    $validacion[$tituloAlphaNum] = $valorAlphaNum;
                    //$validacion['name'] .= ' ';$validacion['name'] .= $valorAlphaNum;
                } else {
                    $validacion[$tituloAlphaNum] = 'error';
                    //$validacion['name'] .= ' ';$validacion['name'] .= $tituloAlphaNum;
                }
            }
        }
        if(!$this->atloginModelo->metValidarCuenta($validacion['usuario'])){
            $validacion['status']='error';
        }

        echo json_encode($validacion);
        exit;        
        
    }

    public function metVerificarRespuestas()
    {
        //$validacion['usuario']=$_POST['user'];
        //$validacion['name']='A:';
        $validacion['estatus']='';
        $formAlphaNum=$this->metObtenerFormulas('form','alphaNum');
        if(!empty($formAlphaNum)) {
            //$validacion['name']='A:';
            foreach ($formAlphaNum as $tituloAlphaNum => $valorAlphaNum) {
                if (!empty($formAlphaNum[$tituloAlphaNum]) && $formAlphaNum[$tituloAlphaNum] != '') {
                    $validacion[$tituloAlphaNum] = $valorAlphaNum;
                    //$validacion['name'] .= ' ';$validacion['name'] .= $valorAlphaNum;
                } else {
                    $validacion[$tituloAlphaNum] = 'error';
                    //$validacion['name'] .= ' ';$validacion['name'] .= $tituloAlphaNum;
                }
            }
        }

        
        #encriptar las respuestas
            $validacion['ind_respuesta1']=Hash::metObtenerHash($validacion['ind_respuesta1']);
            $validacion['ind_respuesta2']=Hash::metObtenerHash($validacion['ind_respuesta2']);
            $validacion['ind_respuesta3']=Hash::metObtenerHash($validacion['ind_respuesta3']);
            if(!$this->atloginModelo->metConfirmarRespuesta($validacion)){
                $validacion['estatus']='error';
            }else{
                
                $validacion['estatus']='valido';
            }
        
        if( $validacion['ind_passwordNueva1']===$validacion['ind_passwordNueva2'] ){
            $validacion['cambio']='aprobado';
            $validacion['ind_passwordNueva1']=Hash::metObtenerHash($validacion['ind_passwordNueva1']);
            $validacion['ind_passwordNueva2']=Hash::metObtenerHash($validacion['ind_passwordNueva2']);
            $this->atloginModelo->metDesbloquearUsuario($validacion['usuario']);
            $this->atloginModelo->metCambiarPassword($validacion['usuario'],$validacion['ind_passwordNueva1']);

        }else{
            $validacion['cambio']='rechazado';
        }
        

        echo json_encode($validacion);
        exit;        
        
    }

    

    /**
      * Método para generar el png del captcha
      *
      * @param $texto     : texto a colocar en la imagen del catpcha
      * @return imagen    
      */
    ///*
    public function metGenerarImagenCaptcha($cadena)
    {
        header("Content-Type: image/png");
        //$cadena      = $_GET['texto'];
        $im          = @imagecreate(110, 45);
        $color_fondo = imagecolorallocate($im, 0, 0, 0);
        $color_texto = imagecolorallocate($im, 255, 255, 255);
        imagestring($im, 25, 35, 14, $cadena, $color_texto);
        imagepng($im);
        imagedestroy($im);

    }//*/

}
