<?php
namespace App\Http\Controllers;

use App\Custom\SQLConnection;
use App\Custom\Misc;

use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Request;

use PDO;

class WordpressController extends Controller {
    
    // -- Función que muestra el panel de administración en su estado inicial -- //
    public static function panel_admin(){
        $userId = Session::get('usuario')->user_id;
        $tablaUsuario = [];
        $clientes = [];
        
        // Validación de Usuario
        if (Misc::validar_entero($userId)){
            $tablaUsuario = SQLConnection::formulariosWP('','','','','','','', 'admin');
            $clientes = SQLConnection::backendStoreProcedure('LN_homonimia_led', array('lista_clientes',NULL,NULL), 'select');
            $tablaPlantilla = SQLConnection::formulariosWP('','','','','','','', 'plantillas');

            return view('/wordpress/panel_admin',compact('tablaUsuario', 'clientes', 'tablaPlantilla'));
        }
        else {
            $estado = 'NA';
            $nombre = '';
            return view('/wordpress/aviso', compact('estado', 'nombre')); 
        }
    }

    // -- Función de búsqueda de clientes (en este caso en la base de datos de LED) -- //
    public function respuesta() {
        $codigo_cliente = $_POST['codigo_cliente'];
        $cuit_cliete = $_POST['cuit_cliente'];
        $nombre_cliente = $_POST['nombre_cliente'];
        if (Misc::validar_entero($codigo_cliente))
        $resultado = SQLConnection::busquedaClientes($codigo_cliente,$cuit_cliete,$nombre_cliente);
        if(count($resultado) > 0) {            
            return $resultado;
        }
        return 'Sin coincidencias';
    }

    public static function script_python() {
        $nn = $_POST['nn'];
        shell_exec(escapeshellcmd("python3 /var/www/html/compartido/Wordpress/./main.py"));
        // try {
        //     shell_exec(escapeshellcmd("python3 /var/www/html/compartido/Wordpress/./main.py"));
        // } catch (\Throwable $th) {
        //     return $th->getMessage();
        // }
        
    }

    // -- Función que muestra el formulario para llenar -- //
    public static function formulario() {
        
        $tablaCron = [];
        $indice = 0;
        $userName = Session::get('usuario')->first_name.' '.Session::get('usuario')->last_name;
        $userForms = SQLConnection::formulariosWP('','',$userName,'','','','', 'nav');
        $userId = $userForms[0]->id_usuario;
        $tablaFide = SQLConnection::formulariosWP('','','','','','','', 'fidelitas');
        $indiceC = SQLConnection::formulariosWP('','','','','','','', 'ultimaEntrada');
        $tablaCron = SQLConnection::formulariosWP($userId,'','','','','','', 'consultaCron');
        if($indiceC != []){
            $indice = $indiceC[0]->indice;
        }
        
        // ---------------
        if (isset($_POST['_urlFormu'])) {
            $url = $_POST['_urlFormu'];
            $nombreForm = $_POST['_nombreFormu'];
            $idForm = $_POST['_idFormu'];

            if ($tablaCron == []){
                SQLConnection::formulariosWP($userId,$userName,$nombreForm,$idForm,$url,'','', 'cron'); 
            }
            else {
                foreach ($tablaCron as $reg){                
                    if ($reg->id_usuario != $userId or $tablaCron == []){
                        SQLConnection::formulariosWP($userId,$userName,$nombreForm,$idForm,$url,'','', 'cron');
                        break;
                    }
                }
            }
        }
        // ---------------
        $tablaCron = SQLConnection::formulariosWP($userId,'','','','','','', 'consultaCron');
        $link_form = '';
        $idFlag = 0;

        
        // ---------------
        if (isset($_GET['nombre'])) {            
            $nombreForm = $_GET['nombre'];
            $idForm = $_GET['id_form'];

            // Si encuentra match en BBDD de formularios llenos Muestra Aviso
            $nombreFormCH = str_replace('Ó','O', $nombreForm); 
            foreach ($tablaFide as $input) {
                if ($input->id_usuario == intval($userId) && $input->nombre_form == $nombreFormCH){
                    $estado = 'R';
                    $nombre = $nombreForm;
                    $idFlag = $input->id_entrada;             
                    SQLConnection::formulariosWP($userId, $idFlag,'','','','','','updateUsuario');
                    SQLConnection::formulariosWP($idForm, $estado, $userId,'','','','','updateEstado');

                    return view('/wordpress/aviso', compact('estado', 'nombre'));
                    break;
                }
            }
            // foreach ($tablaFide as $input) {
            //     if ($input->id_usuario == $userId && Misc::validar_entero($userId)){
            //         return view('/wordpress/aviso', compact('estado', 'nombre'));
            //     }
            // }
            // Si no muestra el formulario para llenar
            foreach ($userForms as $reg){
                if($nombreForm == $reg->nombre_formulario){
                    $link_form = $reg->link_formulario;
                    $idForm = $reg->id_formulario;
                }
            }

            return view('/wordpress/formulario', compact('link_form', 'nombreForm', 'idForm'));
        }        
        // -- En caso de error -- //
        else {
            if (isset(Session::get('usuario')->user_id)){
                $estado = 'N';
                $nombre = '';
                return view('/wordpress/aviso', compact('estado', 'nombre'));
            }
            else {
                // BAN
                $servidor = $_SERVER['REMOTE_ADDR'];
                $seccion = 'WordpressController';
                $nombre_funcion = 'formulario';
                $mensaje = 'Datos invalidos recibidos por este ip '.$servidor;
                SQLConnection::control_erores($seccion,$nombre_funcion,$mensaje);
            }
        }
    }

    // Función de aviso genérico, según los parámetros de estado muestra una notificación u otra. Si no recibe parametro se hardcodea unos para mostrar mensaje de error.
    public function aviso(){
        if (isset($_GET['aviso']) && ($_GET['aviso'] == 'A' || $_GET['aviso'] == 'P' || $_GET['aviso'] == 'R' || $_GET['aviso'] == 'F')) {
            $estado = $_GET['aviso'];
            $nombre = $_GET['nombre'];
        }
        // -- En caso de error -- //
        else {
            $estado = 'N';
            $nombre = '';
        }
        return view('/wordpress/aviso', compact('estado', 'nombre')); 
    }
    
    // -- Función que maneja acciones de ADMINISTRADOR y modificaciones de USUARIO en formulario pendiente -- //
    public static function datos() {
        // --------- USUARIO --------- //
        // Muestra el formulario seleccionado para usuario (PENDIENTE)
        $userName = Session::get('usuario')->first_name.' '.Session::get('usuario')->last_name;
        $userForms = SQLConnection::formulariosWP('','',$userName,'','','','', 'nav');
        $userId = 0;
        if ($userForms != []){
            $userId = $userForms[0]->id_usuario;
        }        
        $tablaFide = SQLConnection::formulariosWP('','','','','','','', 'fidelitas');
        $tablaUsuario = SQLConnection::formulariosWP('','','','','','','','usuario');
        $tablaPlantilla = SQLConnection::formulariosWP('','',$userId,'','','','','plantillas');
        $formPendiente = [];
        $opciones = [];
        // ---------------
        if (isset($_GET['nombre'])) {
            $nombreForm = $_GET['nombre'];
            $id_entrada = '0';
            $estado = '0';
            foreach ($tablaFide as $reg){
                if($reg->valor_campo == $userId and $nombreForm == $reg->nombre_form){
                    $id_entrada = $reg->id_entrada;
                    break;
                }
            }
            foreach ($tablaFide as $reg){ 
                if($reg->id_entrada == $id_entrada){
                    $reg->descripcion_campo = str_replace('Â','',$reg->descripcion_campo);
                    array_push($formPendiente, $reg);
                }
            }
            foreach ($formPendiente as $input) {
                if ($input->tipo_campo == 'opcion') {
                    $opcion = [];
                    $id_campo = str_replace('opcion_','',$input->id_campo);
                    $label = $input->descripcion_campo;
                    array_push($opcion, $id_campo);
                    array_push($opcion, $label);
                    array_push($opciones, $opcion);
                }
            }
            if ($formPendiente != []){
                $estado = SQLConnection::formulariosWP($userId,$nombreForm,'','','','','','getEstadoUsuario');
                return view('/wordpress/form_pendiente', compact('formPendiente','nombreForm','estado','opciones') );
            }
            else {
                $estado = 'N';
                $nombre = '';
                return view('/wordpress/aviso', compact('estado', 'nombre'));
            }
        }

        // Campo seleccionado para editar
        $nuevoVal = '';
        if (isset($_POST['cambios'])) {
            $nombreForm = '';
            $cambios = $_POST['cambios'];
            
            $contador = 0;
            for ($i = 0; $i < count($tablaFide); $i++){
                // Busca si hay match en id_campo
                if ($tablaFide[$i]->id_campo == $cambios[$contador][0]){ 
                                      
                    $nuevoVal = $cambios[$contador][2];
                    $nombreForm = $tablaFide[$i]->nombre_form;
                    $idForm = $cambios[$contador][3];
                    SQLConnection::formulariosWP($tablaFide[$i]->id_campo, $nuevoVal, $userId,$idForm,$nombreForm,'','','escribirF');
                    $contador = $contador+1;                    
                }
                // Cuando termina de realizar cambios sale del for
                if($contador >= count($cambios)){
                    break;
                }
            }
            // Cuando escribe Se cambia el estado del formulario a REVISION
            SQLConnection::formulariosWP($idForm, 'R', $userId,'','','','','updateEstado');

            $estado = 'R';
            $nombre = $nombreForm;  

            return view('/wordpress/aviso', compact('estado', 'nombre')); 
        }

        // --------- ADMINISTRADOR --------- //
        // Muestra un formulario seleccionado para ADMIN
        if (isset($_POST['nombreFormEstadoRyP'])) {           
            $formu = [];
            $nombreForm = $_POST['nombreFormEstadoRyP'];
            $idCliente = $_POST['idUsuarioEstadoRyP'];
            $formuSelect = [];
            // Validación id usuario
            if (Misc::validar_entero($userId)){
                $formuSelect = SQLConnection::formulariosWP('','',$idCliente,'','','','', 'formularioSel');
            }
            // busca match para cambiar estado
            foreach ($tablaFide as $reg){             
                if($nombreForm == $reg->nombre_form){
                    $reg->descripcion_campo = str_replace('Â','',$reg->descripcion_campo);
                    array_push($formu, $reg);
                }
            }
            if (count($formu) > 0){
                return $formu;
            }
            else{
                return 'Error en el formulario';
            }            
        }

        // Cuando ADMIN realice cambio de estado se escribe en base de datos
        if(isset($_POST['_idFormCambioEstado'])){
            $idFormCambioEstado = $_POST['_idFormCambioEstado'];
            $idUsuarioCambioEstado = $_POST['_idUsuarioCambioEstado'];
            $cambioEstado = $_POST['_cambioEstado'];
            if(Misc::validar_entero($idUsuarioCambioEstado) && ($cambioEstado == 'P' || $cambioEstado == 'R' || $cambioEstado == 'A')){
                SQLConnection::formulariosWP($idFormCambioEstado, $cambioEstado, $idUsuarioCambioEstado,'','','','','updateEstado');
            }
            else {
                return 'Error en datos enviados';
            }
            
        }

        // Cuando ADMIN crea un formulario nuevo y lo registra en BBDD
        if (isset($_POST['_nuevoIdForm'])){
            
            $idFormCrear = $_POST['_nuevoIdForm'];
            $nombreFormCrear = $_POST['_nuevoNombreForm'];
            $linkFormCrear = $_POST['_nuevoLinkForm'];
            $linkFormCrear = explode('/',$linkFormCrear);
            
            foreach ($tablaPlantilla as $reg){
                if($reg->id_formulario == $idFormCrear || $reg->nombre_formulario == $nombreFormCrear || $reg->link_formulario == end($linkFormCrear)){
                    return 'Este formulario ya existe';
                }
            }
            if (count($linkFormCrear) > 1){
                $linkFormCrear = end($linkFormCrear);
                SQLConnection::formulariosWP($idFormCrear, $nombreFormCrear, $linkFormCrear,'','','','','crearForm');
            }
            else {
                return 'Error creando formularios';
            }
        }

        // Cuando ADMIN asigne un formulario.
        if (isset($_POST['_codClienteAsign'])){
            
            $codClienteAsign = $_POST['_codClienteAsign'];
            $nombreClienteAsign = $_POST['_nombreClienteAsign'];
            $idClienteAsign = $_POST['_idClienteAsign'];
            $cuitClienteAsign = $_POST['_cuitClienteAsign'];
            $formAsignado = $_POST['_FormNameAsign'];
            $idFormAsignado = $_POST['_idFormAsign'];
            $linkFormAsign = $_POST['_linkFormAsign'];
            foreach ($tablaUsuario as $reg){
                if($reg->id_formulario == $idFormAsignado && $reg->id_usuario == $idClienteAsign){
                    return 'Este formulario ya fue asignado al cliente';
                }
            }
            if(strpos($linkFormAsign, '?') !== false && Misc::validar_entero($codClienteAsign) && Misc::validar_entero($idClienteAsign) && Misc::validar_entero($cuitClienteAsign)){
                SQLConnection::formulariosWP($idFormAsignado, $formAsignado, $idClienteAsign, $codClienteAsign, $nombreClienteAsign, $cuitClienteAsign,$linkFormAsign, 'asignarF');
            }
            else {
                return 'Error asignando cliente';
            }
        }

        // Error de Formulario
        else {
            $estado = 'N';
            $nombre = '';
            return view('/wordpress/aviso', compact('estado', 'nombre')); 
        }

        
    }

    
}