<?php 

namespace App\Http\Controllers;

use Session;
use Request;
use App\Custom\SQLConnection;

class MenuPermisosController extends Controller {
    
    // FUNCION QUE DEVUELVE LA VISTA DEL ABM DE PERMISOS
    public function panelPermisosUsuarios(){
        $permisos = self::listaPermisos();
        //        
        return view('configuracion-menu-permisos/panel_permisos_usuarios')->with(compact('permisos'));
    }

    // FUNCIÓN QUE DEVUELVE EL CONTENIDO DEL MODAL DE PERMISO
    public function modalAddPermiso(){
        $accion = Request::input('accion');
        $usuarios = self::listaUsuarios();

        $items = self::listaItemsMenus();
        $permisos = null;
        $plataformas = [Session::get('webdata')['id_menu_plataforma']];
        $usuario_mod = Request::input('permiso_sel') ?? null;
        //
        foreach( $items as $item => $valores ){
            if ( !$valores->mi_active ){
                unset($items[$item]);
            }
        }
        return view('configuracion-menu-permisos/modal_contenido_permisos')->with(compact('usuarios','plataformas','items','permisos','accion'));
    }

    // FUNCIÓN QUE CAMBIA EL ESTADO DEL PERMISO
    public function cambiarEstadoPermiso(){
        if( !is_null($_POST['estado']) && !empty($_POST['plataforma']) && !empty($_POST['user_id']) && !empty($_POST['id_menu']) && !empty($_POST['id_user_menu']) && ($_POST['estado'] == '1' || $_POST['estado'] == '0') ) {
            $nuevo_estado = Request::input('estado');
            $plataforma = Request::input('plataforma');
            $user_id = Request::input('user_id');
            $dependencia = Request::input('dependencia') ?? null;
            $id_menu_item = Request::input('id_menu');
            $id_user_menu = Request::input('id_user_menu');

            // Cambia el estado del permiso seleccionado
            $usuarios = SQLConnection::backendStoreProcedure('user_menu_acces_',array('UPD_USER_ITEM',$user_id,$plataforma,Session::get('usuario')->user_id,$id_menu_item,$nuevo_estado,$id_user_menu));

            SQLConnection::logTrazabilidad('Se modificó el permiso del usuario: '.$user_id,'MOD_PERMISSION',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado']);

            // Evalúa si tienen dependencias y determinar si hay que cambiar el estado de otros permisos
            $lista_permisos = SQLConnection::backendStoreProcedure('user_menu_acces_',array('LIST_BY_USERID',$user_id,Session::get('webdata')['id_menu_plataforma'],$user_id,null,null),'select');
            $posible_dependencia = null;

            // Si el estado es Activar, debe activar los permisos dependientes. Ej: CONFIGURACIÓN->PERMISOS | Si se activa PERMISOS se debe acivar CONFIGURACIÓN para que el usuario pueda acceder.
            // Si el estado es Desactivar, con el mismo ejemplo. Si desactiva CONFIGURACIÓN se desactiva automáticamente PERMISOS.
            if ($nuevo_estado == '1' && !empty($dependencia)) {
                foreach($lista_permisos as $permiso) {
                    if ($permiso->um_active == 0 && $permiso->id_menu_item == $dependencia){
                        // Primer Padre
                        $temp = SQLConnection::backendStoreProcedure('user_menu_acces_',array('UPD_USER_ITEM',$user_id,Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,$permiso->id_menu_item,$nuevo_estado,$permiso->id_user_menu));

                        SQLConnection::logTrazabilidad('Se modificó el permiso del usuario: '.$user_id,'MOD_PERMISSION',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado']);

                        $dependencia = $permiso->dependent_item ?? null;
                        break;
                    }
                }
                // Segundo Padre
                if (!empty($dependencia)){
                    foreach($lista_permisos as $permiso) {
                        if ($permiso->um_active == 0 && $permiso->id_menu_item == $dependencia){
                            $temp = SQLConnection::backendStoreProcedure('user_menu_acces_',array('UPD_USER_ITEM',$user_id,Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,$permiso->id_menu_item,$nuevo_estado,$permiso->id_user_menu));

                            SQLConnection::logTrazabilidad('Se modificó el permiso del usuario: '.$user_id,'MOD_PERMISSION',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado']);
                            
                            $dependencia = $permiso->dependent_item ?? null;
                            break;
                        }
                    }
                }
                // Tercer Padre
                if (!empty($dependencia)){
                    foreach($lista_permisos as $permiso) {
                        if ($permiso->um_active == 0 && $permiso->id_menu_item == $dependencia){
                            $temp = SQLConnection::backendStoreProcedure('user_menu_acces_',array('UPD_USER_ITEM',$user_id,Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,$permiso->id_menu_item,$nuevo_estado,$permiso->id_user_menu));

                            SQLConnection::logTrazabilidad('Se modificó el permiso del usuario: '.$user_id,'MOD_PERMISSION',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado']);
                            $dependencia = $permiso->dependent_item ?? null;
                            break;
                        }
                    }
                }
                // Cuarto Padre
                if (!empty($dependencia)){
                    foreach($lista_permisos as $permiso) {
                        if ($permiso->um_active == 0 && $permiso->id_menu_item == $dependencia){
                            $temp = SQLConnection::backendStoreProcedure('user_menu_acces_',array('UPD_USER_ITEM',$user_id,Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,$permiso->id_menu_item,$nuevo_estado,$permiso->id_user_menu));

                            SQLConnection::logTrazabilidad('Se modificó el permiso del usuario: '.$user_id,'MOD_PERMISSION',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado']);
                            $dependencia = $permiso->dependent_item ?? null;
                            break;
                        }
                    }
                }
            } elseif ($nuevo_estado == '0') {
                foreach ($lista_permisos as $item_menu) {
                    if ($item_menu->dependent_item != null && $item_menu->dependent_item == $id_menu_item) {
                        // $temp = SQLConnection::backendStoreProcedure('user_menu_acces_',array('UPD_USER_ITEM',$user_id,'IVBACK',Session::get('usuario')->user_id,$item_menu->id_menu_item,$nuevo_estado,$item_menu->id_user_menu));
                        break;
                    }
                }
            }

            return 1;
        } else {
            return 0;
        }
    }

    // FUNCIÓN QUE AGREGA UN NUEVO PERMISO
    public function addPermiso(){
   
          if ( !empty($_POST['user_id']) && !empty($_POST['item']) ) {            
              $plataforma = Session::get('webdata')['id_menu_plataforma'];
              $user_id = Request::input('user_id');
              $id_menu_item = null; //= Request::input('item');
              $lista_permisos = self::listaPermisos();
              $existe = null;
              $permisos = Request::input('item');
              //contador para ir sumando uno hasta que terminar de recorrer todos los permisos enviados a agregar
              $contadorPermisos = 0;
              foreach ($permisos as $value){
                  # code...
                    $contadorPermisos++;
                    $existe = null;
                    $id_menu_item=$value;
                    // Agrega el nuevo permiso seleccionado
                    for ( $j = 0; $j < count($lista_permisos); $j++ ) {
                        if ( $lista_permisos[$j]->id_menu_item == $id_menu_item && $user_id == $lista_permisos[$j]->user_id) {
                            $existe++;
                            break;
                        }
                    }
                    //
                    if ($existe == null) {
                        $temp = SQLConnection::backendStoreProcedure('user_menu_acces_',array('ADD_USER_ITEM',$user_id,Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,$id_menu_item,'1',null));
                        SQLConnection::logTrazabilidad('Se agregó nuevo permiso para usuario: '.$user_id,'ADD_PERMISSION',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado']);
                        $existe = null;
                    } else {
                        return 0;
                    }
                    // Evalúa si tiene permisos dependientes para agregarlos
                    $lista_items = self::listaItemsMenus();
                    $posible_dependencia = null;
                    for ($i = 0; $i <= 10; $i++){
                        foreach ($lista_items as $item_menu) {
                            if ($id_menu_item == $item_menu->id_menu_item && $item_menu->dependent_item != null){
                                $posible_dependencia = $item_menu->dependent_item;
                                break;
                            }
                        }
                        for ( $j = 0; $j < count($lista_permisos); $j++ ) {
                            if ( $lista_permisos[$j]->id_menu_item == $posible_dependencia && $user_id == $lista_permisos[$j]->user_id) {
                                $existe++;
                                break;
                            }
                        }
                        
                        if ($posible_dependencia != null && $existe == null){
                            $id_menu_item = $posible_dependencia;
                            $temp = SQLConnection::backendStoreProcedure('user_menu_acces_',array('ADD_USER_ITEM',$user_id,Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,$id_menu_item,'1',null));
                            SQLConnection::logTrazabilidad('Se agregó nuevo permiso para usuario: '.$user_id,'ADD_PERMISSION',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado']);
                            $posible_dependencia = null;    
                        } else {
                            break;
                        }
                    }
            }
              //
              return 1;
          } else {
              return 0;
          }
      }
  

    // =============================== //

    // FUNCIÓN QUE DEVUELVE LA VISTA DEL ABM DE LOS ITEMS DE MENÚ
    public function panelItemsMenu(){
        $items = self::listaItemsMenus();        
        //
        return view('configuracion-menu-permisos/panel_items_menu')->with(compact('items'));
    }

    // FUNCIÓN QUE DEVUELVE EL CONTENIDO DEL MODAL DE ITEMS
    public function modalAddModItem(){
        if (!empty($_POST['accion']) && ($_POST['accion'] == 'A' || $_POST['accion'] == 'M')){
            $accion = Request:: input('accion');
            $item_sel = (Request::input('item_sel') == '') ? null :  Request::input('item_sel');            
            $items = self::listaItemsMenus();            
            $plataformas = [Session::get('webdata')['id_menu_plataforma']];

            if ($accion == 'M') {
                foreach ($items as $it){
                    if ($item_sel == $it->id_menu_item){
                        $item_sel = $it;
                        break;
                    }
                }
            }
            return view('configuracion-menu-permisos/modal_contenido_item')->with(compact('items','plataformas','accion','item_sel'));
        }
    }

    // FUNCION QUE CAMBIA EL ESTADO DEL ITEM
    public function cambiarEstadoItem(){        
        if( !is_null($_POST['estado']) && !empty($_POST['plataforma']) && !empty($_POST['item_nombre']) && !empty($_POST['id_menu_item']) && ($_POST['estado'] == '1' || $_POST['estado'] == '0') ){
            $nuevo_estado = Request::input('estado');
            $plataforma = Request::input('plataforma');
            $item_nombre = Request::input('item_nombre');
            $id_menu_item = Request::input('id_menu_item');
            $dependencia = (Request::input('dependencia') == '') ? null : Request::input('dependencia');
            $ruta = (Request::input('ruta') == '') ? null : Request::input('ruta');
            //
            $temp = SQLConnection::backendStoreProcedure('menu_items_',array('UPD_MENU_ITEM',Session::get('webdata')['id_menu_plataforma'],$item_nombre,Session::get('usuario')->user_id,$dependencia,$ruta,$nuevo_estado,$id_menu_item));
            $lista_items = self::listaItemsMenus();
            $posible_dependencia = null;

            SQLConnection::logTrazabilidad('Se modificó el estado del item','MOD_ITEM',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado']);
            return 1;
        } else {
            return 0;
        }
    }

    // FUNCION QUE AGREGA UN NUEVO ITEM
    public function addModItem(){
        if( !empty($_POST['plataforma']) && !empty($_POST['nombre_item']) && !empty($_POST['accion']) && ($_POST['accion'] == 'A' || $_POST['accion'] == 'M')){
            $accion = Request::input('accion');
            $plataforma = Request::input('plataforma');
            $nombre_item = strtoupper(Request::input('nombre_item'));
            $dependencia = (Request::input('dependencia') == '') ? null : Request::input('dependencia');
            $ruta = (Request::input('ruta_item') == '') ? null : Request::input('ruta_item');
            $id_item_sel = trim(Request::input('id_item_sel'));
            $estado = Request::input('estado') == '' ? null : trim(Request::input('estado'));
            //
            if (!empty($ruta) && $ruta[0] != '/') {
                $ruta = '/' . $ruta;
            }
            $depe_ok = 0;
            $mod_ok = 0;
            $lista_items = self::listaItemsMenus();
            foreach ($lista_items as $item) {
                //if (!empty($dependencia) && $dependencia == $item->id_menu_item) {
                if ( !is_null($dependencia) && $dependencia == $item->id_menu_item ){
                    $depe_ok = 1;
                }
                /* if ( ($nombre_item == strtoupper($item->item_title) || $ruta == $item->routeaddr) && $accion == 'A'){
                    return 0;
                } */
                if ($id_item_sel == $item->id_menu_item){
                    $mod_ok = 1;
                }
            }
            //
            if ( is_null($dependencia) && $accion == 'A'|| ($depe_ok == 1 && $accion == 'A')) {
                $temp = SQLConnection::backendStoreProcedure('menu_items_',array('ADD_MENU_ITEM',$plataforma,$nombre_item,Session::get('usuario')->user_id,$dependencia,$ruta,'1',null));
                //
                SQLConnection::logTrazabilidad('Se agregó un nuevo item','ADD_ITEM',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado']);
            } elseif ( ( is_null($dependencia) && $accion == 'M' && $mod_ok == 1) || ($depe_ok == 1 && $accion == 'M' && $mod_ok == 1 ) ) {
                $temp = SQLConnection::backendStoreProcedure('menu_items_',array('UPD_MENU_ITEM',$plataforma,$nombre_item,Session::get('usuario')->user_id,$dependencia,$ruta,$estado,$id_item_sel));
                //
                SQLConnection::logTrazabilidad('Se modificó el item','MOD_ITEM',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,Session::get('webdata')['servicio_contratado']);
            } else {
                return 0;
            }            
            //
            return 1;
        } else {
            return 0;
        }
    }

    // =============================== //

    // FUNCIONES GENÉRICAS
    private function listaUsuarios(){
        //$usuarios = SQLConnection::backendStoreProcedure('LN_Blue',array('USERS_BACK',NULL,NULL));
        $usuarios = SQLConnection::backendStoreProcedure('LN_Blue',array('USERS_BACK',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,env('PLATAFORMA')));

        foreach($usuarios as $i => $user){
            if($user->estado_login == 'N'){
                unset($usuarios[$i]);
                continue;
            }
            //
            $user->pais = 'Argentina';
            //
            if(str_contains($user->email, ' ')){
                //
                $user->email = trim($user->email);
            } elseif (str_contains($user->email, "\t")){
                $user->email = str_replace("\t","",$user->email);
            }
        }
        //
        return $usuarios;
    }

    private function listaItemsMenus(){        
        $items = SQLConnection::backendStoreProcedure('menu_items_',array('LIST_ITEMS',Session::get('webdata')['id_menu_plataforma'],null,Session::get('usuario')->user_id));        
        //
        return $items;
    }

    private function listaPermisos(){        
        $permisos = SQLConnection::backendStoreProcedure('user_menu_acces_',array('ALL_USERS_MENU',null,Session::get('webdata')['id_menu_plataforma'],null,null,null));
        //
        return $permisos;
    }

    public function permisosDisponibles(){
        $usuario = Request::input('usuario');
        $permisos_disponibles = SQLConnection::backendStoreProcedure('user_menu_acces_',array('RESTO_BY_USERID',$usuario,Session::get('webdata')['id_menu_plataforma'],null,null,null));

        return $permisos_disponibles;
    }
}