<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\abort;
use Illuminate\Support\Facades\Log;
use Carbon\Carbon;
use Illuminate\Support\Collection;

date_default_timezone_set('Europe/Paris');


class PoliclinicaChatbotController extends Controller
{
    const ACIERTO = 1;
    const FALLO = 0;
    const SI = 2;
    const NO = 3;
    const NUEVA_CITA = 1;
    const MODIFICAR_CITA = 2;
    const CANCELAR_CITA = 3;
    const CONSULTAR_CITA = 4;
    const ERROR = 5;

//ENVIAR LA LISTA TAMBIEN SI NO RESPONDE A ELLA
    public function modulo_chatbot_whatsapp(Request $request)
    {
                //MODULO CHATBOT
                //$this->pruebas();
                //Obtener parametros
                $parametros = $request->all();
		Log::info('param',['param'=>$parametros]);
                //Estructura del mensaje de respuesta http
                $respuesta = array(
                    'chat' => '',
                    'params' => $parametros,
                );
                $sender = '';
                if (isset($parametros["sender"])) {
                            $sender = $parametros["sender"];
                }
        //var_dump($parametros);
                $prefijo = substr($sender, 0, 3);
                $telefono = "";
                if ($prefijo == '+34') {
                    $telefono = substr($sender, 3, 10);
                } else {
                    $telefono = substr($sender, 0, 14);
                }
                
                
                
                $mensaje = array(
                    "tipo"      => (isset($parametros['type_message']) ? $parametros['type_message'] : null),
                    "telefono"  => $telefono,
                    "telefono_sin_format" => (isset($parametros['sender']) ? $parametros['sender'] : null),
                    "texto"     => (isset($parametros['content']['message']) ? $parametros['content']['message'] : null),
                    "message_id"  => (isset($parametros['content']['id']) ? $parametros['content']['id'] : null),
                    "reply_to"  => (isset($parametros['content']['reply_to']) ? $parametros['content']['reply_to'] : null),
                );


                //Funcionalidad principal
                /**
                    Inicio el mini chatbot
                */
               
                $this->chatbot($mensaje);
                return response('OK', 200);
    }


    private function chatbot($mensaje = array())
    {
        
        $telefono = $mensaje['telefono'];
            $telefono_sin_format = $mensaje['telefono_sin_format'];
            $texto = $mensaje['texto'];
            $tipoMensaje = $mensaje['tipo'];
            $reply_to = $mensaje['reply_to'];
            $id_bot = $this->getMensajeRespondido2($reply_to);
        if ($id_bot) {
            $id_bot = $id_bot->id_chatbot;
        }
        
        if ($tipoMensaje == "1") {
            $texto = $this->quitar_tildes($texto);
            $texto = strtolower($texto);
        }

        $datos = $this->obtenerEstadoBot($telefono);

        if ($id_bot && $datos['recordatorio'] == 1) {
            $datos = $this->obtenerEstadoBotPorId($id_bot);
        } else {
            $datos = $this->obtenerEstadoBot($telefono);
        }
        $recordatorio = $datos['recordatorio'];
        //AQUIIIIIIIIIII
        $estado = $datos['chatbot_preguntas_id'];
        $id_bot = $datos['id'];
        $formato = $datos['tipo_formato'];
        $wpp_id = $mensaje['message_id'];

        // Fix 8: paréntesis explícitos para evitar bug de precedencia (&&  antes que ||)
        if (($recordatorio === 1 && ($texto == "Aceptar cita" || $texto == "Modificar cita" || $texto == "Cancelar cita")) || ($texto == "Baja recordatorios" && $tipoMensaje == 11)) {
            //$this->local_log($id_bot, $estado, "Es una respuesta de asistencia");
            $mensaje_respondido = $this->getMensajeRespondido2($reply_to);
            Log::info($reply_to);
            Log::info(print_r($mensaje_respondido, true));
            // Fix 3: getMensajeRespondido2 devuelve null si el mensaje está caducado o fue reenviado
            if (!$mensaje_respondido) {
                Log::warning('[Chatbot] reply_to no encontrado en BD', ['reply_to' => $reply_to]);
                $this->enviarMensaje($telefono_sin_format, "Lo sentimos, no hemos podido procesar su respuesta. Por favor, contacte con la clínica.", $id_bot);
                $this->finalizarBot($id_bot, $telefono_sin_format, "Reply-to no encontrado en BD");
                return;
            }
            $id_bot = $mensaje_respondido->id_chatbot;
            $this->procesarMensajeRecordatorio($id_bot, $texto, $tipoMensaje, $telefono_sin_format, $datos['historia']);
            return;
        }
        $wpp_id = $mensaje['message_id'];
        $reply_to = $mensaje['reply_to'];
        $this->local_log($id_bot, $estado, "Nuevo mensaje: " . $texto);
        // $this->local_log($id_bot,$estado,"tipo: ".$mensaje['tipo']."-telefono: ".$mensaje['telefono']."-texto: ".$mensaje['texto']."-id del mensaje: ".$mensaje['message_id']."-reply_to: ".$mensaje['reply_to']);
        // $this->local_log($id_bot,$estado,'id del mensaje: '.$wpp_id.' - reply to: '.$reply_to);
       
        $id_mensaje = $this->idUltimoMensaje($id_bot);
        if ($id_mensaje) {
            // $this->local_log($id_bot,$estado,'id del ultimo mensaje: '.$id_mensaje->id_whatsapp);
        }
    

        //tengo que comprobar que la respuesta que me llega corresponde al mensaje que envie en la transicion anterior. Si no, habra que actualizar el estado con el mensaje correspondiente al que se respondió
        //obtengo el id del ultimo mensaje enviado
       // if($reply_to){
       //
       //     if($id_mensaje){
       //         if($reply_to != $id_mensaje->id_whatsapp){
       //             //Para el caso de crear citas, compruebo si ha sido ya creada y esta al finald el flujo. En ese punto no debo dejarle volver para atrás ya que podría crear varias citas de golpe
       //             $confirmada = $this->getConfirmadaBBDD($id_bot);
       //             if($confirmada == 1){
       //                 $this->enviarMensaje($telefono_sin_format,"Lo sentimos, no puede responder a un mensaje anterior tras haber realizado una cita.",$id_bot);
       //                 $this->finalizarBot($id_bot,$telefono_sin_format,"Respuesta a mensaje de otra conversación");
       //                 die;
       //             }
       //
       //             //$this->local_log($id_bot,$estado,"Respondo a otro mensaje");
       //
       //             //busco a que mensaje esta respondiendo para obtener dicho estado y llevar el bot a ese estado.
       //             $mensaje_respondido = $this->getMensajeRespondido($id_bot,$reply_to);
       //             //$this->local_log($id_bot,$estado,"Mensaje al que respondo: ".$mensaje_respondido->id);
       //             if($mensaje_respondido){
       //                 $estado = $mensaje_respondido->chatbot_preguntas_id;
       //                 $formato = $this->getFormatoFromId($estado);
       //                 $formato = $formato->tipo_formato;
       //             }else{
       //                 //$this->local_log($id_bot,$estado,"responde a mensaje de otra conversación, indicarselo al cliente y decirle que responda a lo que debe");
       //                 $this->enviarMensaje($telefono_sin_format,"Lo sentimos, no puede responder a un mensaje de la convesación anterior.",$id_bot);
       //                 $this->finalizarBot($id_bot,$telefono_sin_format,"Respuesta a mensaje de otra conversación");
       //                 die;
       //             }
       //         }else{
       //             //$this->local_log($id_bot,$estado,"Respondo al ultimo mensaje, el flujo sigue tal cual");
       //         }
       //     }
       // }


        switch ($formato) {
            case 'inicio':
                    //if( $telefono === '697302939'){
                    //    $mensaje = 'Bienvenido al servicio automatizado de gestión de citas médicas';
                    //    $this->enviarMensaje($telefono_sin_format,$mensaje,$id_bot,$estado);
                    //    $this->enviarMensaje($telefono_sin_format,"Por favor, indique los 8 digitos de su dni con la letra y sin espacios.",$id_bot,$estado);
                    //    $this->inicializarEstado($id_bot);
                    //    break;
                    //}
                    $thot = $this->obtenerMensaje(1);
                    $this->enviarMensaje($telefono_sin_format, $thot->texto, $id_bot, $estado);
                    $mensaje_proteccion_datos = "Si continúa usando esta APP, usted consiente al uso de WhatsApp para la gestión de comunicaciones de gestión administrativa y consultas, de citas y servicios prestados, incluyendo en su caso la transferencia internacional de datos fuera del espacio EEE. Disponemos de delegado de Protección de Datos con el que puede contactar en dpd@policlinicamadridparlasur.com. Podrá ejercer sus derechos de acceso, rectificación y otros según la información adicional y detallada sobre Protección de Datos en POLÍTICA DE PRIVACIDAD WEB - Policlinica Madrid Parla Sur (https://policlinicamadridparlasur.com/politica-privacidad/)";
                    //$mensaje_proteccion_datos = "Si continúa usando esta APP, usted consiente al uso de WhatsApp para la gestión de comunicaciones de gestión administrativa y consultas, de citas y servicios prestados, incluyendo en su caso la transferencia internacional de datos fuera del espacio EEE. Disponemos de Delegado de Protección de Datos con el que puede contactar en dpd@policlinicamadridparlasur.com. Podrá ejercer sus derechos de acceso, rectificación y otros según la información adicional y detallada sobre Protección de Datos en la política de privacidad.";
                    $this->enviarMensaje($telefono_sin_format, $mensaje_proteccion_datos, $id_bot, $estado);
                    $this->enviarMensaje($telefono_sin_format, "Por favor, indique los 8 digitos de su dni con la letra y sin espacios.", $id_bot, $estado);
                    $this->inicializarEstado($id_bot);
                break;
            //Acción: Por determinar
            //Llega: Respuesta dni
            //Envia: Lista acciones a seleccionar
            case 'recibo_dni':
                if ($tipoMensaje == 1 && $texto != "") {
                    //activity()->log('Formato correcto');
                    if ($this->validarDNI_NIE($texto)) {
                        $p = WebServiceController::damePaciente($texto);
                        if ($p) {
                            $paciente = $p->elpaciente;
                            if ($paciente->aseguradora) {
                                $id_aseguradora = $paciente->aseguradora;
                            } else {
                                $id_aseguradora = null;
                            }
                            $historia = $paciente->historia;
                            if ($id_aseguradora != '*') {
                                $aseguradora = WebServiceController::getAseguradora($id_aseguradora);
                                $aseguradora = $aseguradora->nombre;
                            } else {
                                $aseguradora = 'PRIVADO';
                            }

                            $this->guardarDatosPaciente($id_bot, $historia, $aseguradora, $id_aseguradora, $paciente->nombre, $paciente->apellido1, $paciente->apellido2);
                            //Avanzamos
                            $nuevoEstado = $this->siguienteTransicion($formato, self::ACIERTO);
                            $this->guardarRespuestaChatbot($id_bot, $nuevoEstado->campo, $texto, $nuevoEstado->campo_no_actualizar);
                            $thot = $this->obtenerMensaje($nuevoEstado->id);
                               
                            $opcionesLista = array(
                                array("text" => "Nueva cita"),
                                array("text" => "Cancelar cita"),
                                array("text" => "Modificar cita"),
                                array("text" => "Consultar cita")
                            );
                            $this->enviarLista($telefono_sin_format, $opcionesLista, $thot->texto, "Seleccione una de las siguientes opciones:", $id_bot, $nuevoEstado->id);
                            $this->actualizarEstadoChatbot($id_bot, $nuevoEstado->id, $nuevoEstado->formato);
                        } else {
                            //Notificamos al cliente que no existe un usuario para dicho dni. Se termina el bot y si vuelve a hablar se le manda el mensaje de bienvenida pidiendole el dni
                            $transicion = $this->siguienteTransicion($formato, self::FALLO);
                            $this->guardarRespuestaChatbot($id_bot, "dni", $texto, "");
                            $thot = $this->obtenerMensaje($transicion->id);
                            $this->enviarMensaje($telefono_sin_format, "Lo sentimos, su dni no se encuentra en nuestro sistema, por favor contacte con la clínica.", $id_bot, $transicion->id);
                            $this->finalizarBot($id_bot, $telefono_sin_format, "DNI no se encuentra en el sistema");
                            break;
                        }
                    } else {
                        $transicion = $this->siguienteTransicion($formato, self::FALLO);
                        $thot = $this->obtenerMensaje($transicion->id);
                        $this->enviarMensaje($telefono_sin_format, $thot->texto, $id_bot, $transicion->id);
                    }
                } elseif ($tipoMensaje != 1 && $texto != "") {
                    $transicion = $this->siguienteTransicion($formato, self::FALLO);
                    $thot = $this->obtenerMensaje($transicion->id);
                    $this->enviarMensaje($telefono_sin_format, $thot->texto, $id_bot, $transicion->id);
                } else {
                    $this->enviarMensaje($telefono_sin_format, "Ha ocurrido un error inesperado. Por favor, contacte con la clínica", $id_bot, 500);
                    $this->finalizarBot($id_bot, $telefono_sin_format, "DNI mal enviado");
                    break;
                }

                break;
            //Acción: Por determinar
            //Llega: Respuesta acción seleccionada
            //Envia: Depende de la acción
            case 'ofrezco_opciones':
                if ($tipoMensaje == 11 && $texto != "") {
                    switch ($texto) {
                        case 'Nueva cita':
                            $paciente = $this->getDatosPaciente($id_bot);
                            $transicion = $this->siguienteTransicion($formato, self::NUEVA_CITA);
                            if ($paciente->aseguradoras_opciones != null) {
                                $aseguradora = $paciente->aseguradoras_opciones;
                            } else {
                                $this->enviarMensaje($telefono_sin_format, "Lo sentimos, no dispone de ninguna aseguradora, por favor contacte con la clínica.", $id_bot, $transicion->id);
                                $this->finalizarBot($id_bot, $telefono_sin_format, "Paciente sin aseguradora");
                                break;
                            }
                            $this->guardarRespuestaChatbot($id_bot, $transicion->campo, $texto, $transicion->campo_no_actualizar);
                            $thot = $this->obtenerMensaje($transicion->id);
                            $opcionesLista = array(
                                array("text" => "Si"),
                                array("text" => "No"),
                            );
                            $mensaje = "¿Es " . $aseguradora . " su aseguradora?";
                            $this->enviarBoton($telefono_sin_format, $opcionesLista, "Boton:", $mensaje, $id_bot, $transicion->id);
                            $this->actualizarEstadoChatbot($id_bot, $transicion->id, $transicion->formato);
                            break;
                        case 'Modificar cita':
                            $transicion = $this->siguienteTransicion($formato, self::MODIFICAR_CITA);
                            $this->guardarRespuestaChatbot($id_bot, $transicion->campo, $texto, $transicion->campo_no_actualizar);
                            $opcionesLista = $this->obtenerCitasPaciente($id_bot);
                            if (empty($opcionesLista)) {
                                $this->enviarMensaje($telefono_sin_format, "Lo sentimos, no disponemos de citas para el dni indicado.", $id_bot);
                                $this->finalizarBot($id_bot, $telefono_sin_format, "Sin citas para operar");
                                break;
                            }

                            $thot = $this->obtenerMensaje($transicion->id);
                            $this->enviarLista($telefono_sin_format, $opcionesLista, "Lista de citas", $thot->texto, $id_bot, $transicion->id);
                            $this->actualizarEstadoChatbot($id_bot, $transicion->id, $transicion->formato);
                            break;
                        case 'Cancelar cita':
                            $transicion = $this->siguienteTransicion($formato, self::CANCELAR_CITA);
                            $this->guardarRespuestaChatbot($id_bot, $transicion->campo, $texto, $transicion->campo_no_actualizar);
                            $opcionesLista = $this->obtenerCitasPaciente($id_bot);
                            if (empty($opcionesLista)) {
                                $this->enviarMensaje($telefono_sin_format, "Lo sentimos, no disponemos de citas para el dni indicado.", $id_bot);
                                $this->finalizarBot($id_bot, $telefono_sin_format, "Sin citas para operar");
                                break;
                            }
                            $thot = $this->obtenerMensaje($transicion->id);
                              
                            $this->enviarLista($telefono_sin_format, $opcionesLista, "Lista de citas", $thot->texto, $id_bot, $transicion->id);
                            $this->actualizarEstadoChatbot($id_bot, $transicion->id, $transicion->formato);
                            break;
                        case 'Consultar cita':
                            $transicion = $this->siguienteTransicion($formato, self::CONSULTAR_CITA);
                            $this->guardarRespuestaChatbot($id_bot, $transicion->campo, $texto, $transicion->campo_no_actualizar);
                                
                            $thot = $this->obtenerMensaje($transicion->id);
                            $opcionesLista = $this->obtenerCitasPaciente($id_bot);
                            if (empty($opcionesLista)) {
                                $this->enviarMensaje($telefono_sin_format, "Lo sentimos, no disponemos de citas para el dni indicado.", $id_bot);
                                $this->finalizarBot($id_bot, $telefono_sin_format, "Sin citas para operar");
                                break;
                            }
                            $this->enviarLista($telefono_sin_format, $opcionesLista, "Lista de citas", $thot->texto, $id_bot, $transicion->id);
                            $this->actualizarEstadoChatbot($id_bot, $transicion->id, $transicion->formato);
                            break;
                        default:
                            $transicion = $this->siguienteTransicion($formato, self::ERROR);
                            $this->guardarRespuestaChatbot($id_bot, $transicion->campo, $texto, $transicion->campo_no_actualizar);
                                
                            $thot = $this->obtenerMensaje($transicion->id);
                            break;
                    }
                } elseif ($tipoMensaje != 11 && $texto != "") {
                    $transicion = $this->siguienteTransicion($formato, self::FALLO);
                    $thot = $this->obtenerMensaje($transicion->id);
                        
                    $opcionesLista = array(
                        array("text" => "Nueva cita"),
                        array("text" => "Cancelar cita"),
                        array("text" => "Modificar cita"),
                        array("text" => "Consultar cita")
                    );

                    $this->enviarLista($telefono_sin_format, $opcionesLista, "Seleccione: ", $thot->texto, $id_bot, $transicion->id);
                }
                break;
            //modificar cita
            //101
            case 'lista_citas_modificar':
                if ($tipoMensaje == 11 && $texto != "") {
                    //guardo los datos de la cita a modificar y la borro
                    $transicion = $this->siguienteTransicion($formato, self::ACIERTO);
                    // obtener los datos de la cita y cancelarla
                    $thot = $this->obtenerMensaje($transicion->id);
                    //obtener huecos y mostrarlos
                    $this->guardarCitaModificar($id_bot, $texto);

                    $ids = $this->getDatosModificar($id_bot, $texto);
                    // Fix 4: getDatosModificar devuelve null si la cita no se encuentra en citas_paciente
                    if (!$ids) {
                        $this->enviarMensaje($telefono_sin_format, "Lo sentimos, no podemos procesar la modificación de esta cita. Por favor, contacte con la clínica.", $id_bot);
                        $this->finalizarBot($id_bot, $telefono_sin_format, "Sin datos para modificar cita");
                        break;
                    }
                    $this->enviarMensaje($telefono_sin_format, "Buscando los huecos disponibles...", $id_bot);
                    $huecos = $this->obtenerFechas($ids->id_aseguradora, $ids->id_motivo, $ids->id_agenda);
                    if ($huecos) {
                        $n_huecos = $this->guardarHuecos($huecos, $id_bot);
                    } else {
                        $this->enviarMensaje($telefono_sin_format, "Lo sentimos, no tenemos huecos disponibles, por favor vuelva a intentarlo más tarde.", $id_bot);
                        $this->finalizarBot($id_bot, $telefono_sin_format, "Sin huecos disponibles");
                        break;
                    }
                    $h = $this->getHuecosBBDD($id_bot);
                    $opcionesLista = array();
                    foreach ($h as $hueco) {
                        array_push($opcionesLista, array("text" => $hueco->mensaje));
                    }
                    array_push($opcionesLista, array("text" => "Ninguno"));

                    $this->enviarLista($telefono_sin_format, $opcionesLista, "Seleccione:", $thot->texto, $id_bot, $transicion->id);
                    $this->actualizarEstadoChatbot($id_bot, $transicion->id, $transicion->formato);
                } elseif ($tipoMensaje != 11 && $texto != "") {
                    $transicion = $this->siguienteTransicion($formato, self::FALLO);
                        
                    $thot = $this->obtenerMensaje($transicion->id);
                    $this->enviarMensaje($telefono_sin_format, "Por favor, seleccione una de las citas de la lista.", $id_bot, $transicion->id);
                }
                break;
            case 'lista_huecos_modificar':
                if ($tipoMensaje == 11 && $texto != "") {
                    if ($texto == "Ninguno") {
                        $this->enviarMensaje($telefono_sin_format, "Lo sentimos, no disponemos de más huecos. Vuelva a intentarlo más tarde.", $id_bot);
                        $this->finalizarBot($id_bot, $telefono_sin_format, "Modificar cita incompleto");
                        break;
                    }
            // Comprobamos si recibimos algo parecido a una hora. sería conveniente
                    // comprobar el formato exacto "DD a las HH", pero por ahora comprobaremos
                    // si puede hacer split y obtener 2 partes
                    $partes = explode(" a las ", $texto);
                    if (count($partes) !== 2) {
                        $transicion = $this->siguienteTransicion($formato, self::FALLO);
                        $thot = $this->obtenerMensaje($transicion->id);
                        $this->enviarMensaje($telefono_sin_format, "Por favor, seleccione uno de los huecos de la lista.", $id_bot, $transicion->id);
                        break;
                    }
                        $transicion = $this->siguienteTransicion($formato, self::ACIERTO);
                        $thot = $this->obtenerMensaje($transicion->id);

                        // TODO: esto se sube arriba, borrarlo $partes = explode(" a las ", $texto);
                        $f_cita = $partes[0];
                        $h_cita = $partes[1];
                        $hueco = $this->reservarHueco($id_bot, $f_cita, $h_cita);
                    if (!$hueco->huecos->resultado) {
                        $this->enviarMensaje($telefono_sin_format, "Lo sentimos, no se ha podido modificar su cita. Vuelva a intentarlo de nuevo por favor.", $id_bot);
                        $this->finalizarBot($id_bot, $telefono_sin_format, "Modificar cita incompleto");
                        break;
                    }
                        $id_reserva = $hueco->huecos->resultado;

                        $this->guardarFechaCita($id_reserva, $texto, $id_bot);
                        $cita = $this->getDatosCita($id_bot);
                        $mensaje = "¿Está seguro que desea su cita para " . $cita->acto_medico . " en " . $cita->especialidad . " con el doctor " . $cita->doctor . " el día " . $texto . " ?";
                        $opcionesLista = array(
                            array("text" => "Si"),
                            array("text" => "No"),
                        );
                        $this->enviarBoton($telefono_sin_format, $opcionesLista, "Boton:", $mensaje, $id_bot, $transicion->id);
                        $this->actualizarEstadoChatbot($id_bot, $transicion->id, $transicion->formato);
                } elseif ($tipoMensaje != 11 && $texto != "") {
                    $transicion = $this->siguienteTransicion($formato, self::FALLO);
                    $thot = $this->obtenerMensaje($transicion->id);
                    $this->enviarMensaje($telefono_sin_format, "Por favor, seleccione uno de los huecos de la lista.", $id_bot, $transicion->id);
                }
                break;
            case 'confirmacion_modificacion':
                if ($tipoMensaje == 11 && $texto != "") {
                    if ($texto == "Si") {
                        $transicion = $this->siguienteTransicion($formato, self::SI);
                        $this->enviarMensaje($telefono_sin_format, "Modificando su cita...", $id_bot, $transicion->id);

                        $id_reserva = $this->getIdReservaBBDD($id_bot);
                        if ($this->crearCita($telefono_sin_format, $id_bot, $id_reserva) === false) { // Fix Fallo 6: crearCita devuelve false si falla (ya llamó a finalizarBot)
                            break;
                        }
                        $cancelada = $this->cancelarCita($id_bot);
                        if ($cancelada == true) {
                            $thot = $this->obtenerMensaje($transicion->id);
                            $this->guardarRespuestaChatbot($id_bot, "confirmada", 1, null);
                            $this->enviarMensaje($telefono_sin_format, $thot->texto, $id_bot, $transicion->id);
                            $newFormat = $this->getFormatoFromId($transicion->id);
    
                            $transicion = $this->siguienteTransicion($newFormat->tipo_formato, self::ACIERTO);
                            $thot = $this->obtenerMensaje($transicion->id);
                            $opcionesLista = array(
                            array("text" => "Si"),
                            array("text" => "No"),
                            );
                            $this->enviarBoton($telefono_sin_format, $opcionesLista, "Boton:", $thot->texto, $id_bot, $transicion->id);
                            $this->actualizarEstadoChatbot($id_bot, $transicion->id, $transicion->formato);
                        } else {
                            $this->enviarMensaje($telefono_sin_format, "Lo sentimos, no se ha podido cancelar su antigua cita, por favor contacte con la Clinica.", $id_bot);
                            $this->finalizarBot($id_bot, $telefono_sin_format, "Modificar cita incompleto");
                            break;
                        }
                    } elseif ($texto == "No") {
                        $transicion = $this->siguienteTransicion($formato, self::NO);
                        $this->actualizarObservacionBBDD($id_bot, "Modificar cita incompleto");
                        $thot = $this->obtenerMensaje($transicion->id);
                        $opcionesLista = array(
                            array("text" => "Si"),
                            array("text" => "No"),
                        );
                        $this->enviarBoton($telefono_sin_format, $opcionesLista, "Boton:", $thot->texto, $id_bot, $transicion->id);
                        $this->actualizarEstadoChatbot($id_bot, $transicion->id, $transicion->formato);
                    }
                } elseif ($tipoMensaje != 11 && $texto != "") {
                    $transicion = $this->siguienteTransicion($formato, self::FALLO);
                      
                    $thot = $this->obtenerMensaje($transicion->id);
                    $opcionesLista = array(
                        array("text" => "Si"),
                        array("text" => "No"),
                    );
                    $this->enviarBoton($telefono_sin_format, $opcionesLista, "Boton:", $thot->texto, $id_bot, $transicion->id);
                }
                break;
            //cancelar cita
            case 'lista_citas_cancelar':
                if ($tipoMensaje == 11 && $texto != "") {
                    //guardo los datos de la cita a cancelar y la borro
                    $transicion = $this->siguienteTransicion($formato, self::ACIERTO);
                    $mensaje = $this->getMensajeConfirmacionCancelacion($id_bot, $texto);
                    $thot = $this->obtenerMensaje($transicion->id);

                    $opcionesLista = array(
                        array("text" => "Si"),
                        array("text" => "No"),
                    );
                    $this->enviarBoton($telefono_sin_format, $opcionesLista, "Boton:", $mensaje, $id_bot, $transicion->id);
                    $this->actualizarEstadoChatbot($id_bot, $transicion->id, $transicion->formato);
                } elseif ($tipoMensaje != 11 && $texto != "") {
                    $transicion = $this->siguienteTransicion($formato, self::FALLO);
                        
                    $thot = $this->obtenerMensaje($transicion->id);
                    $this->enviarMensaje($telefono_sin_format, "Por favor, seleccione una de las citas de la lista.", $id_bot, $transicion->id);
                }
                break;
            case 'confirmacion_cancelacion':
                if ($tipoMensaje == 11 && $texto != "") {
                    if ($texto == "Si") {
                        $transicion = $this->siguienteTransicion($formato, self::SI);
                        $this->enviarMensaje($telefono_sin_format, "Cancelando su cita...", $id_bot, $transicion->id);
                        $thot = $this->obtenerMensaje($transicion->id);
                        $cancelada = $this->cancelarCita($id_bot);
                        if ($cancelada) {
                            $this->guardarRespuestaChatbot($id_bot, "confirmada", 1, null);
                            $this->enviarMensaje($telefono_sin_format, $thot->texto, $id_bot, $transicion->id);
                            $newFormat = $this->getFormatoFromId($transicion->id);
                            $transicion = $this->siguienteTransicion($newFormat->tipo_formato, self::ACIERTO);
                                
                            $thot = $this->obtenerMensaje($transicion->id);
                            $opcionesLista = array(
                                array("text" => "Si"),
                                array("text" => "No"),
                            );
                            $this->enviarBoton($telefono_sin_format, $opcionesLista, "Boton:", $thot->texto, $id_bot, $transicion->id);
                            $this->actualizarEstadoChatbot($id_bot, $transicion->id, $transicion->formato);
                        } else {
                            $this->enviarMensaje($telefono_sin_format, "Lo sentimos, no es posible borrar la cita, contacte con la Clinica.", $id_bot);
                            $this->finalizarBot($id_bot, $telefono_sin_format, "Cancelar cita incompleto");
                            break;
                        }
                    } elseif ($texto == "No") {
                        $transicion = $this->siguienteTransicion($formato, self::NO);
                        $this->actualizarObservacionBBDD($id_bot, "Modificar cita incompleto");
                        $thot = $this->obtenerMensaje($transicion->id);
                        $opcionesLista = array(
                            array("text" => "Si"),
                            array("text" => "No"),
                        );
                        $this->enviarBoton($telefono_sin_format, $opcionesLista, "Boton:", $thot->texto, $id_bot, $transicion->id);
                        $this->actualizarEstadoChatbot($id_bot, $transicion->id, $transicion->formato);
                    }
                } elseif ($tipoMensaje != 11 && $texto != "") {
                    $transicion = $this->siguienteTransicion($formato, self::FALLO);
                        
                    $thot = $this->obtenerMensaje($transicion->id);
                    $opcionesLista = array(
                        array("text" => "Si"),
                        array("text" => "No"),
                    );
                    $this->enviarBoton($telefono_sin_format, $opcionesLista, "Boton:", $thot->texto, $id_bot, $transicion->id);
                }
                break;
            case 'lista_citas_consultar':
                if ($tipoMensaje == 11 && $texto != "") {
                    $transicion = $this->siguienteTransicion($formato, self::ACIERTO);
                       
                    $thot = $this->obtenerMensaje($transicion->id);
                    $mensaje = $this->getMensajeConsultaCitas($id_bot, $texto);
                    $this->enviarMensaje($telefono_sin_format, "Estos son los datos de su cita: \\n\\n" . $mensaje, $id_bot, $transicion->id);
                    $newFormat = $this->getFormatoFromId($transicion->id);
                    $transicion = $this->siguienteTransicion($newFormat->tipo_formato, self::ACIERTO);
                        
                    $thot = $this->obtenerMensaje($transicion->id);
                    $opcionesLista = array(
                        array("text" => "Si"),
                        array("text" => "No"),
                    );
                    $this->enviarBoton($telefono_sin_format, $opcionesLista, "Boton:", $thot->texto, $id_bot, $transicion->id);
                    $this->actualizarEstadoChatbot($id_bot, $transicion->id, $transicion->formato);
                } elseif ($tipoMensaje != 11 && $texto != "") {
                    $transicion = $this->siguienteTransicion($formato, self::FALLO);
                       
                    $thot = $this->obtenerMensaje($transicion->id);
                    $this->enviarMensaje($telefono_sin_format, "Por favor, seleccione una de las citas de la lista.", $id_bot, $transicion->id);
                }
                break;
            //Acción: Nueva cita
            //Llega: Respuesta aseguradora seleccionada
            //Envia: Lista especialidad a seleccionar
            case 'lista_aseguradoras':
                if ($tipoMensaje == 11 && $texto != "") {
                    if ($texto == "Si") {
                        $opcionesLista = $this->obtenerEspecialidadesAMostrar1($id_bot);
                
                        array_push($opcionesLista, array("text" => "Mostrar mas opciones"));
                        $transicion = $this->siguienteTransicion($formato, self::ACIERTO);
                        $this->guardarRespuestaChatbot($id_bot, $transicion->campo, $texto, $transicion->campo_no_actualizar);
                           
                        $thot = $this->obtenerMensaje($transicion->id);
                        $this->enviarLista($telefono_sin_format, $opcionesLista, "Lista de especialidades", $thot->texto, $id_bot, $transicion->id);
                        $this->actualizarEstadoChatbot($id_bot, $transicion->id, $transicion->formato);
                    } else {
                        $this->enviarMensaje($telefono_sin_format, "Lo sentimos, no podemos continuar con la gestión. Por favor contacte con la clínica.", $id_bot, 999);
                        $this->finalizarBot($id_bot, $telefono_sin_format, "Aseguradora no coincide");
                        break;
                    }
                } elseif ($tipoMensaje != 11 && $texto != "") {
                    $transicion = $this->siguienteTransicion($formato, self::FALLO);
                        
                    $thot = $this->obtenerMensaje($transicion->id);
                    $this->enviarMensaje($telefono_sin_format, $thot->texto, $id_bot, $transicion->id);
                }
                break;
            //Acción: Nueva cita
            //Llega: Respuesta especialidad seleccionada
            //Envia: Lista acto_medico a seleccionar
            case 'lista_especialidades':
                if ($tipoMensaje == 11 && $texto != "") {
                    if ($texto == "Mostrar mas opciones") {
                        $opcionesLista = $this->obtenerEspecialidadesAMostrar2($id_bot);
                        array_push($opcionesLista, array("text" => "Ninguna"));
                        $transicion = $this->siguienteTransicion('lista_especialidades', self::ACIERTO);
                        $thot = $this->obtenerMensaje(4);
                        $this->enviarLista($telefono_sin_format, $opcionesLista, "Lista de especialidades", $thot->texto, $id_bot, $transicion->id);
                        $this->actualizarEstadoChatbot($id_bot, 4, $transicion->formato);
                        break;
                    }
                    if ($texto == "Ninguna") {
                        $this->enviarMensaje($telefono_sin_format, "Lo sentimos, no disponemos de más especialidades. Vuelva a intentarlo más tarde.", $id_bot);
                        $this->finalizarBot($id_bot, $telefono_sin_format, "Nueva cita incompleto");
                        break;
                    }

                    $id_especialidad = $this->getIdEspecialidad($texto);
                    if ($id_especialidad == null) {
                        $this->enviarMensaje($telefono_sin_format, "Lo sentimos, no podemos crear citas para esa especialidad. Por favor contacte con la clínica.", $id_bot);
                        $this->finalizarBot($id_bot, $telefono_sin_format, "Nueva cita incompleto");
                        break;
                    }
                    $paciente = $this->getDatosPaciente($id_bot);
                    $id_aseguradora = $paciente->id_aseguradora;
                    $motivos = $this->guardarInfoAgendas($id_especialidad, $id_aseguradora, $id_bot, $telefono_sin_format, $formato, $texto);
                    if (empty($motivos)) { // Fix Fallo 6: guardarInfoAgendas devuelve [] si no hay agendas (ya llamó a finalizarBot)
                        break;
                    }
                    //en $motivos tengo un array con todos los motivos a mostrar.
                    $opcionesLista = array();
                    $cont = 0;
                    $actos = array();
                    foreach ($motivos as $element) {
                        if ($cont < 9) {
                            $opcionesLista[] = array("text" => $element);
                        } else {
                            array_push($actos, $element);
                        }
                        $cont++;
                    }

                    if ($cont >= 9) {
                        array_push($opcionesLista, array("text" => "Mostrar mas opciones"));
                        $this->guardarActosBBDD($id_bot, $actos);
                    } else {
                        array_push($opcionesLista, array("text" => "Ninguno"));
                    }


                    $transicion = $this->siguienteTransicion($formato, self::ACIERTO);
                    $this->guardarRespuestaChatbot($id_bot, $transicion->campo, $texto, $transicion->campo_no_actualizar);
                    $thot = $this->obtenerMensaje($transicion->id);
                    //var_dump($opcionesLista);

                    $this->enviarLista($telefono_sin_format, $opcionesLista, "Lista de actos médicos", $thot->texto, $id_bot, $transicion->id);
                    $this->actualizarEstadoChatbot($id_bot, $transicion->id, $transicion->formato);
                } elseif ($tipoMensaje != 11 && $texto != "") {
                    $transicion = $this->siguienteTransicion($formato, self::FALLO);
                        
                    $thot = $this->obtenerMensaje($transicion->id);
                    $this->enviarMensaje($telefono_sin_format, "Por favor, seleccione una de las especialidades de la lista.", $id_bot, $transicion->id);
                }
                break;
            //Acción: Nueva cita
            //Llega: Respuesta acto_medico seleccionada
            //Envia: Lista doctor a seleccionar
            case 'lista_acto_medico':
                if ($tipoMensaje == 11 && $texto != "") {
                    if ($texto == "Ninguno") {
                        $this->enviarMensaje($telefono_sin_format, "Lo sentimos, no disponemos de más actos médicos. Vuelva a intentarlo más tarde.", $id_bot);
                        $this->finalizarBot($id_bot, $telefono_sin_format, "Nueva cita incompleto");
                        break;
                    }
                    if ($texto == "Mostrar mas opciones") {
                        $actos = $this->getActosBBDD($id_bot);

                        $cont = 0;
                        $sobrantes = array();
                        foreach ($actos as $element) {
                            if ($cont < 9) {
                                $opcionesLista[] = array("text" => $element);
                            } else {
                                array_push($sobrantes, $element);
                            }
                            $cont++;
                        }

                        if ($cont >= 9) {
                            array_push($opcionesLista, array("text" => "Mostrar mas opciones"));
                            //var_dump($sobrantes);
                            $this->guardarActosBBDD($id_bot, $sobrantes);
                        } else {
                            array_push($opcionesLista, array("text" => "Ninguno"));
                        }


                        $this->enviarLista($telefono_sin_format, $opcionesLista, "Lista de actos médicos", "Seleccione el acto médico de la cita:", $id_bot, 5);
                        break;
                    }
                    $transicion = $this->siguienteTransicion($formato, self::ACIERTO);
                    $this->guardarRespuestaChatbot($id_bot, $transicion->campo, $texto, $transicion->campo_no_actualizar);
                        
                    $thot = $this->obtenerMensaje($transicion->id);
                    $doctores = $this->getDoctoresFromActoMedico($id_bot, $texto);
                    if ($doctores == null) {
                        $this->enviarMensaje($telefono_sin_format, "Lo sentimos, no disponemos de agendas para la especialidad seleccionada.", $id_bot);
                        $this->finalizarBot($id_bot, $telefono_sin_format, "Sin agendas disponibles");
                        break;
                    }
                    $opcionesLista = array();
                        
                    foreach ($doctores as $element) {
                        if ($element === 'DRA. NOELIA PILAR DEGANO GONZALEZ') {
                            $element = 'DRA DEGANO (GINECOLOGÍA)';
                        }
                        $opcionesLista[] = array("text" => $element);
                    }
                    array_push($opcionesLista, array("text" => "Ninguno"));

                    $this->enviarLista($telefono_sin_format, $opcionesLista, "Lista de doctores", $thot->texto, $id_bot, $transicion->id);
                    $this->actualizarEstadoChatbot($id_bot, $transicion->id, $transicion->formato);
                } elseif ($tipoMensaje != 11 && $texto != "") {
                    $transicion = $this->siguienteTransicion($formato, self::FALLO);
                       
                    $thot = $this->obtenerMensaje($transicion->id);
                    $this->enviarMensaje($telefono_sin_format, "Por favor, seleccione uno de los actos médicos de la lista.", $id_bot, $transicion->id);
                }
                break;
            //Acción: Nueva cita
            //Llega: Respuesta doctor seleccionado
            //Envia: Lista cita a seleccionar
            case 'lista_doctores':
                if ($tipoMensaje == 11 && $texto != "") {
                    if ($texto == "Ninguno") {
                        $this->enviarMensaje($telefono_sin_format, "Lo sentimos, no disponemos de más doctores. Vuelva a intentarlo más tarde.", $id_bot);
                        $this->finalizarBot($id_bot, $telefono_sin_format, "Nueva cita incompleto");
                        break;
                    }
                    //obtener el id_agenda del texto recibido
                        
                    $transicion = $this->siguienteTransicion($formato, self::ACIERTO);
                    $this->guardarRespuestaChatbot($id_bot, $transicion->campo, $texto, $transicion->campo_no_actualizar);
                        
                    $id_aseguradora = $this->getIdAseguradora($id_bot);
                    $md = $this->getActoMedico($id_bot);
                    $ids = $this->getIdDoctorYMotivo($id_bot, $md->acto_medico, $md->doctor);
                    $this->guardarIdAgendaMotivo($id_bot, $ids->id_agenda, $ids->id_motivo, $ids->comentario);
                    $this->enviarMensaje($telefono_sin_format, "Buscando los huecos...", $id_bot);
                    $huecos = $this->obtenerFechas($id_aseguradora, $ids->id_motivo, $ids->id_agenda);
                    if ($huecos) {
                        $n_huecos = $this->guardarHuecos($huecos, $id_bot);
                    } else {
                        $this->enviarMensaje($telefono_sin_format, "Lo sentimos, no tenemos huecos disponibles, por favor vuelva a intentarlo más tarde.", $id_bot);
                        $this->finalizarBot($id_bot, $telefono_sin_format, "Sin huecos disponibles");
                        break;
                    }
                    $h = $this->getHuecosBBDD($id_bot);
                    $opcionesLista = array();
                    foreach ($h as $hueco) {
                        array_push($opcionesLista, array("text" => $hueco->mensaje));
                    }
                    array_push($opcionesLista, array("text" => "Ninguno"));

                    $thot = $this->obtenerMensaje($transicion->id);

                    $this->enviarLista($telefono_sin_format, $opcionesLista, "Lista de huecos", $thot->texto, $id_bot, $transicion->id);
                        
                    $this->actualizarEstadoChatbot($id_bot, $transicion->id, $transicion->formato);
                } elseif ($tipoMensaje != 11 && $texto != "") {
                    $transicion = $this->siguienteTransicion($formato, self::FALLO);
                        
                    $thot = $this->obtenerMensaje($transicion->id);
                    $this->enviarMensaje($telefono_sin_format, "Por favor, seleccione uno de los doctores de la lista.", $id_bot, $transicion->id);
                }
                break;
            //Acción: Nueva cita
            //Llega: respuesta a selección de cita
            //Envia: mensaje confirmacion de cita
            case 'seleccion_cita':
                if ($tipoMensaje == 11 && $texto != "") {
                    if ($texto == "Ninguno") {
                        $this->enviarMensaje($telefono_sin_format, "Lo sentimos, vuelva a intentarlo más tarde.", $id_bot);
                        $this->finalizarBot($id_bot, $telefono_sin_format, "Nueva cita incompleto");
                        break;
                    }
            // Comprobamos si recibimos algo parecido a una hora. sería conveniente
                    // comprobar el formato exacto "DD a las HH", pero por ahora comprobaremos
                    // si puede hacer split y obtener 2 partes
                    $partes = explode(" a las ", $texto);
                    if (count($partes) !== 2) {
                        $transicion = $this->siguienteTransicion($formato, self::FALLO);
                        $thot = $this->obtenerMensaje($transicion->id);
                        $this->enviarMensaje($telefono_sin_format, "Por favor, seleccione uno de los huecos de la lista.", $id_bot, $transicion->id);
                        break;
                    }

                    $transicion = $this->siguienteTransicion($formato, self::ACIERTO);
                    $this->guardarRespuestaChatbot($id_bot, $transicion->campo, $texto, $transicion->campo_no_actualizar);
                    // TODO: borrarlo, subido arriba $partes = explode(" a las ", $texto);
                    $f_cita = $partes[0];
                    $h_cita = $partes[1];
                    $hueco = $this->reservarHueco($id_bot, $f_cita, $h_cita);
                    if (!$hueco->huecos->resultado) {
                        $this->enviarMensaje($telefono_sin_format, "Lo sentimos, no se ha podido realizar su cita. Vuelva a intentarlo de nuevo por favor.", $id_bot);
                        $this->finalizarBot($id_bot, $telefono_sin_format, "Reserva caducada");
                        break;
                    }
                    $id_reserva = $hueco->huecos->resultado;

                    $this->guardarFechaCita($id_reserva, $texto, $id_bot);

                    $cita = $this->getDatosCita($id_bot);

                    $mensaje = "¿Está seguro que desea su cita para " . $cita->acto_medico . " en " . $cita->especialidad . " con el doctor " . $cita->doctor . " el día " . $texto . " ?";

                        
                    $thot = $this->obtenerMensaje($transicion->id);
                    $opcionesLista = array(
                        array("text" => "Si"),
                        array("text" => "No"),
                    );
                    $this->enviarBoton($telefono_sin_format, $opcionesLista, "Boton:", $mensaje, $id_bot, $transicion->id);
                        
                    $this->actualizarEstadoChatbot($id_bot, $transicion->id, $transicion->formato);
                } elseif ($tipoMensaje != 11 && $texto != "") {
                    $transicion = $this->siguienteTransicion($formato, self::FALLO);
                    $thot = $this->obtenerMensaje($transicion->id);
                    $this->enviarMensaje($telefono_sin_format, "Por favor, seleccione uno de los huecos de la lista.", $id_bot, $transicion->id);
                }
                break;
            //Llega: respuesta lista si/no confirmar cita o no
            //Envia:
                    //si: su cita ha sido creada con exito
                        // Desea realizar otra gestión?
                    //no: vuelve al estado 4 (pide aseguradoras)
            case 'confirmacion_cita':
                if ($tipoMensaje == 11 && $texto != "") {
                    if ($texto == "Si") {
                        $id_reserva = $this->getIdReservaBBDD($id_bot);
                        if ($this->crearCita($telefono_sin_format, $id_bot, $id_reserva) === false) { // Fix Fallo 6: crearCita devuelve false si falla (ya llamó a finalizarBot)
                            break;
                        }
                        $transicion = $this->siguienteTransicion($formato, self::SI);
                        $this->guardarRespuestaChatbot($id_bot, $transicion->campo, 1, $transicion->campo_no_actualizar);
                            
                        $thot = $this->obtenerMensaje($transicion->id);
                        $comentario = $this->obtenerComentarioBBDD($id_bot);
                       // if($comentario != '' && $comentario != null){
                            //$mensaje_formateado = str_replace("\n\n", "\\n\\n", $comentario);
                            //$mensaje_formateado = str_replace("\n", "\\n", $comentario);
                            //$this->enviarMensaje($telefono_sin_format,$thot->texto." \\n\\nRECUERDE: \\n\\n".$mensaje_formateado,$id_bot,$transicion->id);
                       // }else{
                       //     $this->enviarMensaje($telefono_sin_format,$thot->texto,$id_bot,$transicion->id);
                       // }

                	$this->enviarMensaje($telefono_sin_format,$thot->texto,$id_bot,$transicion->id);

                        $this->actualizarEstadoChatbot($id_bot, $transicion->id, $transicion->formato);
                            
                        $transicion = $this->siguienteTransicion($transicion->formato, self::ACIERTO);
                        //enviar siguiente mensaje por si quiere seguir o no:
                        $thot = $this->obtenerMensaje($transicion->id);
                        $opcionesLista = array(
                            array("text" => "Si"),
                            array("text" => "No"),
                        );
                        $this->enviarBoton($telefono_sin_format, $opcionesLista, "Boton:", $thot->texto, $id_bot, $transicion->id);
                        $this->actualizarEstadoChatbot($id_bot, $transicion->id, $transicion->formato);
                    } elseif ($texto == "No") {
                        $transicion = $this->siguienteTransicion($formato, self::NO);
                        $this->guardarRespuestaChatbot($id_bot, $transicion->campo, $texto, $transicion->campo_no_actualizar);
                        $this->actualizarObservacionBBDD($id_bot, "Nueva cita incompleto");
                        $thot = $this->obtenerMensaje($transicion->id);
                        $this->enviarMensaje($telefono_sin_format, $thot->texto, $id_bot, $transicion->id);
                        $this->actualizarEstadoChatbot($id_bot, $transicion->id, $transicion->formato);
                            
                        $transicion = $this->siguienteTransicion($transicion->formato, self::ACIERTO);
                        //enviar siguiente mensaje por si quiere seguir o no:
                        $thot = $this->obtenerMensaje($transicion->id);
                        $opcionesLista = array(
                            array("text" => "Si"),
                            array("text" => "No"),
                        );
                        $this->enviarBoton($telefono_sin_format, $opcionesLista, "Boton:", $thot->texto, $id_bot, $transicion->id);
                        $this->actualizarEstadoChatbot($id_bot, $transicion->id, $transicion->formato);
                    }
                } elseif ($tipoMensaje != 11 && $texto != "") {
                    $transicion = $this->siguienteTransicion($formato, self::FALLO);
                        
                    $thot = $this->obtenerMensaje($transicion->id);
                    $opcionesLista = array(
                        array("text" => "Si"),
                        array("text" => "No"),
                    );
                    $this->enviarBoton($telefono_sin_format, $opcionesLista, "Boton:", $thot->texto, $id_bot, $transicion->id);
                }
                break;
            case 'pregunta_nueva_gestion':
                if ($tipoMensaje == 11 && $texto != "") {
                    if ($texto == "Si") {
                        $transicion = $this->siguienteTransicion($formato, self::SI);
                            
                        $thot = $this->obtenerMensaje($transicion->id);
                        //$this->enviarMensaje($telefono_sin_format,$thot->texto,$id_bot,$transicion->id);
                        $this->enviarMensaje($telefono_sin_format, "Por favor, indique los 8 digitos de su dni con la letra y sin espacios.", $id_bot, $transicion->id);
                        $this->actualizarEstadoChatbot($id_bot, $transicion->id, $transicion->formato);
                        $this->finalizarChatBot($id_bot);
                        $datos = $this->crearRegistro($telefono);
                        $estado = $datos['chatbot_preguntas_id'];
                        $id_bot = $datos['id'];
                            
                        $this->inicializarEstado($id_bot);
                    } elseif ($texto == "No") {
                        $transicion = $this->siguienteTransicion($formato, self::NO);
                            
                        $thot = $this->obtenerMensaje($transicion->id);
                        $this->enviarMensaje($telefono_sin_format, $thot->texto, $id_bot, $transicion->id);
                        $this->actualizarEstadoChatbot($id_bot, 4, $transicion->formato);
                        $this->finalizarChatBot($id_bot);
                    }
                } elseif ($tipoMensaje != 11 && $texto != "") {
                    $transicion = $this->siguienteTransicion($formato, self::FALLO);
                        
                    $thot = $this->obtenerMensaje($transicion->id);
                    $opcionesLista = array(
                        array("text" => "Si"),
                        array("text" => "No"),
                    );
                    $this->enviarBoton($telefono_sin_format, $opcionesLista, "Boton:", $thot->texto, $id_bot, $transicion->id);
                }
                break;
            default:
                break;
        }
    }

    private function log($id_bot, $wpp_id, $reply_to, $texto, $telefono, $estado)
    {
        DB::table('chatbot_log')->insert([
            'estado' => $estado,
            'emisor' => $telefono,
            'mensaje' => $texto,
            'id_whatsapp' => $wpp_id,
            'id_chatbot' => $id_bot,
            'reply_to' => $reply_to,
        ]);
    }

    private function local_log($id_bot, $estado, $texto)
    {
        DB::table('log')->insert([
            'estado' => $estado,
            'id_bot' => $id_bot,
            'mensaje' => $texto,
        ]);
    }


    private function quitar_tildes($cadena)
    {
        $cadBuscar = array("á", "Á", "é", "É", "í", "Í", "ó", "Ó", "ú", "Ú");
        $cadPoner = array("a", "A", "e", "E", "i", "I", "o", "O", "u", "U");
        $cadena = str_replace($cadBuscar, $cadPoner, $cadena);
        return $cadena;
    }

    private function enviarMensaje($telefono_sin_format, $texto, $id_bot, $estado = 500)
    {
        $this->local_log($id_bot, 0, "Envio el siguiente mensaje: " . $texto);
        //$this->local_log($id_bot,$estado,"ENVIO MENSAJE");

        try {
            $whatsapp = new WhatsappController();
            $aa =  $whatsapp->enviarWhatsapp($telefono_sin_format, $texto);
        //echo "Hola estoy saliendo de enviarWhatsApp\n El valor es : " . json_encode($aa);
            $response_array = json_decode($aa, true);

            // Verificar si la decodificación fue exitosa
            if ($response_array !== null) {
                // Verificar si el campo 'id' está presente en la respuesta
                if (isset($response_array['id'])) {
                    // Guardar el valor del campo 'id'
            //echo "Entro porque sí hay ID______________________\n";
                    $id = $response_array['id'];

                    // Ahora $id contiene el valor del campo 'id'
                    //$this->local_log($id_bot,999,"El id del mensaje enviado es: ".$id);
                    $this->guardarIdMensaje($id, $id_bot, $estado);
                } else {
                    //$this->local_log($id_bot,999,"No hay campo id en el mensaje enviado");
            //echo "No hay id\n";
                }
            } else {
                //$this->local_log($id_bot,999,"Error al decodificar el json o al enviar el mensaje");
            }
            return $aa;
        } catch (\Exception $e) {
                //print "[LOG] Error en la llamada a whatsapp\n";
                //print "Error: " . $e->getMessage();
        }
    }

    private function enviarBoton($telefono_sin_format, $opcionesLista, $titulo, $texto, $id_bot, $estado)
    {
        $this->local_log($id_bot, 0, "Envio botones si/no: " . $texto);

        try {
            $whatsapp = new WhatsappController();
            $aa =  $whatsapp->enviarBotonesWhatsapp($telefono_sin_format, $opcionesLista, $titulo, $texto);
            $response_array = json_decode($aa, true);

            // Verificar si la decodificación fue exitosa
            if ($response_array !== null) {
                // Verificar si el campo 'id' está presente en la respuesta
                if (isset($response_array['id'])) {
                    // Guardar el valor del campo 'id'
                    $id = $response_array['id'];
                    // Ahora $id contiene el valor del campo 'id'
                    //$this->local_log($id_bot,999,"El id del mensaje enviado es: ".$id);
                    $this->guardarIdMensaje($id, $id_bot, $estado);
                } else {
                    //$this->local_log($id_bot,999,"No hay campo id en el mensaje enviado");
                }
            } else {
                //$this->local_log($id_bot,999,"Error al decodificar el json o al enviar el mensaje");
            }
            return $aa;
            //$this->local_log($id_bot,999,"Respuesta de thot: ".$aa);
        } catch (\Exception $e) {
                //print "[LOG] Error en la llamada a whatsapp\n";
                //print "Error: " . $e->getMessage();
        }
    }

    private function enviarLista($telefono_sin_format, $opcionesLista, $titulo, $texto, $id_bot, $estado)
    {
        $this->local_log($id_bot, 0, "Envio la siguiente lista: " . $titulo);


        try {
            $whatsapp = new WhatsappController();
            $aa =  $whatsapp->enviarListaWhatsapp($telefono_sin_format, $opcionesLista, $titulo, $texto);
            $response_array = json_decode($aa, true);

            // Verificar si la decodificación fue exitosa
            if ($response_array !== null) {
                // Verificar si el campo 'id' está presente en la respuesta
                if (isset($response_array['id'])) {
                    // Guardar el valor del campo 'id'
                    $id = $response_array['id'];
                    // Ahora $id contiene el valor del campo 'id'
                    //$this->local_log($id_bot,999,"El id del mensaje enviado es: ".$id);
                    $this->guardarIdMensaje($id, $id_bot, $estado);
                } else {
                    //$this->local_log($id_bot,999,"No hay campo id en el mensaje enviado");
                }
            } else {
                //$this->local_log($id_bot,999,"Error al decodificar el json o al enviar el mensaje");
            }
            return $aa;
            //$this->local_log($id_bot,999,"Respuesta de thot: ".$aa);
        } catch (\Exception $e) {
                //print "[LOG] Error en la llamada a whatsapp\n";
                //print "Error: " . $e->getMessage();
        }
    }

    public static function guardarIdMensaje($wpp_id, $ticket, $estado)
    {
        try {
            DB::table('chatbot_opciones_seleccionadas')->insert([
                'id_whatsapp' => $wpp_id,
                'id_chatbot' => $ticket,
                'chatbot_preguntas_id' => $estado,
            ]);
        } catch (\Exception $e) {
            //print "[LOG] Error en la llamada a base de datos\n";
            //print "Error: " . $e->getMessage();
        }
    }

    private function getDatosCita($id_bot)
    {
        $parametros = DB::table('chatbot')
            ->selectRaw("especialidad,doctor,acto_medico")
                ->where('id', '=', $id_bot)
                ->first();
            return $parametros;
    }

    private function idUltimoMensaje($id_bot)
    {
            $parametros = DB::table('chatbot_opciones_seleccionadas')
            ->selectRaw('id_whatsapp')
                ->where('id_chatbot', '=', $id_bot)
                ->orderBy('created_at', 'desc')
                ->first();
            return $parametros;
    }

    private function getMensajeRespondido2($reply_to)
    {
        try {
            $parametros = DB::table('chatbot_opciones_seleccionadas')
                ->selectRaw("id,id_chatbot,chatbot_preguntas_id,opciones")
                ->where('id_whatsapp', '=', $reply_to)
                ->first();
            return $parametros;
        } catch (\Exception $e) {
            //print "[LOG] Error en la llamada a base de datos\n";
            //print "Error: " . $e->getMessage();
        }
    }

    private function getMensajeRespondido($id_bot, $reply_to)
    {
        try {
            $parametros = DB::table('chatbot_opciones_seleccionadas')
                ->selectRaw("id,chatbot_preguntas_id,opciones")
                ->where('id_chatbot', '=', $id_bot)
                ->where('id_whatsapp', '=', $reply_to)
                ->first();
            return $parametros;
        } catch (\Exception $e) {
            //print "[LOG] Error en la llamada a base de datos\n";
            //print "Error: " . $e->getMessage();
        }
    }

    private function getActosBBDD($id_bot)
    {
        $parametros = null; // Fix 7: inicializar antes del try para evitar variable indefinida si la query falla
        try {
            $parametros = DB::table('chatbot')
                ->select('actos')
                ->where('id', "=", $id_bot)
                ->where('finalizado', '=', 0)
                ->first();
        } catch (\Exception $e) {
            //print "[LOG] Error en la llamada a base de datos\n";
            //print "Error: " . $e->getMessage();
        }

        if (!$parametros) {
            return [];
        }

        $array_actos = explode(",", $parametros->actos);
        return $array_actos;
        if (count($array_actos) > 9) {
            $limite = 9;
        } else {
            $limite = count($array_actos);
        }

        $opcionesLista = array();
       
        for ($i = 0; $i < $limite; $i++) {
            $opcionesLista[] = array("text" => $array_actos[$i]);
            unset($array_actos[$i]);
        }
        $array_actos = array_values($array_actos);

        if (count($array_actos) >= 9) {
            $newActos = implode(", ", $array_actos);
            $this->guardarActosBBDD($id_bot, $newActos);
            array_push($opcionesLista, array("text" => "Mostrar mas opciones"));
        } else {
            array_push($opcionesLista, array("text" => "Ninguno"));
        }
        return $opcionesLista;
    }

    private function guardarActosBBDD($id_bot, $actos)
    {
        $textoSeparadoPorComas = implode(', ', $actos);

        try {
            DB::table('chatbot')
                ->where('id', "=", $id_bot)
                ->where('finalizado', '=', 0)
                ->limit(1)
                ->update([
                    'actos' => $textoSeparadoPorComas,
                ]);
        } catch (\Exception $e) {
            //print "[LOG] Error en la llamada a base de datos\n";
            //print "Error: " . $e->getMessage();
        }
    }
    
    private function getEstadoFormato($formato)
    {
        try {
            $parametros = DB::table('chatbot_preguntas')
            ->selectRaw("id")
                ->where('tipo_formato', '=', $formato)
                ->first();
            return $parametros;
        } catch (\Exception $e) {
            // //print "[LOG] Error en la llamada a base de datos\n";
            // //print "Error: " . $e->getMessage();
        }
    }

    private function getFormatoFromId($id)
    {
        try {
            $parametros = DB::table('chatbot_preguntas')
            ->selectRaw("tipo_formato")
                ->where('id', '=', $id)
                ->first();
            return $parametros;
        } catch (\Exception $e) {
            //print "[LOG] Error en la llamada a base de datos\n";
            //print "Error: " . $e->getMessage();
        }
    }

    private function siguienteTransicion($formato, $respuesta)
    {
        $estado = $this->getEstadoFormato($formato);
        
        try {
            $parametros = DB::table('chatbot_transiciones')
            ->selectRaw("chatbot_preguntas_destino_id as id, campo_actualizar as campo, chatbot_preguntas.tipo_formato as formato, campo_no_actualizar as campo_no_actualizar")
            ->join('chatbot_preguntas', 'chatbot_transiciones.chatbot_preguntas_destino_id', '=', 'chatbot_preguntas.id')
                ->where('chatbot_preguntas_id', '=', $estado->id)
                ->where('respuesta', '=', $respuesta)
                ->first();
            return $parametros;
        } catch (\Exception $e) {
            //print "[LOG] Error en la llamada a base de datos\n";
            //print "Error: " . $e->getMessage();
        }
    }

    private function actualizarEstadoChatbot($ticket, $estado, $formato)
    {
        try {
            DB::table('chatbot')
                ->where('id', "=", $ticket)
                ->where('finalizado', '=', 0)
                ->limit(1)
                ->update([
                    'chatbot_preguntas_id' => $estado,
                ]);
        } catch (\Exception $e) {
            //print "[LOG] Error en la llamada a base de datos\n";
            //print "Error: " . $e->getMessage();
        }
    }

    private function actualizarObservacionBBDD($id_chatbot, $observacion)
    {
        try {
            DB::table('chatbot')
                ->where('id', "=", $id_chatbot)
                ->where('finalizado', '=', 0)
                ->where('observaciones', '=', null)
                ->limit(1)
                ->update([
                    'observaciones' => $observacion,
                ]);
        } catch (\Exception $e) {
            //print "[LOG] Error en la llamada a base de datos\n";
            //print "Error: " . $e->getMessage();
        }
    }

    private function finalizarBot($id_chatbot, $telefono_sin_format, $observacion)
    {
        $this->actualizarObservacionBBDD($id_chatbot, $observacion);
        $opcionesLista = array(
            array("text" => "Si"),
            array("text" => "No"),
        );
        $this->enviarBoton($telefono_sin_format, $opcionesLista, "Boton:", "¿Desea realizar una nueva gestión?", $id_chatbot, 402);
        $this->actualizarEstadoChatbot($id_chatbot, 10, null);
    }

    private function finalizarChatBot($ticket)
    {
        $this->actualizarObservacionBBDD($ticket, "Finalizado correctamente");

        try {
            DB::table('chatbot')
                ->where('id', "=", $ticket)
                ->where('finalizado', '=', 0)
                ->limit(1)
                ->update([
                    'finalizado' => 1,
                ]);
        } catch (\Exception $e) {
            //print "[LOG] Error en la llamada a base de datos\n";
            //print "Error: " . $e->getMessage();
        }
    }


    private function validarDNI_NIE($dni)
    {
        // Expresión regular para DNI o NIE
        $patron = '/^[XYZ]?\d{7,8}[A-Z]$/i';
        // Verificar si el documento coincide con el patrón
        if (preg_match($patron, $dni)) {
            return true; // El formato es válido
        } else {
            return false; // El formato no es válido
        }
    }

    private function inicializarEstado($ticket)
    {
        try {
            DB::table('chatbot')
                ->where('id', "=", $ticket)
                ->where('finalizado', '=', 0)
                ->limit(1)
                ->update([
                    'chatbot_preguntas_id' => 1,
                ]);
        } catch (\Exception $e) {
            //print "[LOG] Error en la llamada a base de datos\n";
            //print "Error: " . $e->getMessage();
        }
    }

    private function obtenerMensaje($transicion)
    {
        try {
            $parametros = DB::table('chatbot_preguntas')
            ->selectRaw("texto,tipo_formato")
                ->where('id', '=', $transicion)
                ->first();
            return $parametros;
        } catch (\Exception $e) {
            //print "[LOG] Error en la llamada a base de datos\n";
            //print "Error: " . $e->getMessage();
        }
    }

    private function guardarListaEspecialidades($id_bot, $especialidades)
    {
        DB::table('chatbot')
                ->where('id', "=", $id_bot)
                ->where('finalizado', '=', 0)
                ->limit(1)
                ->update([
                    'lista_especialidades' => $especialidades,
                ]);
    }

    private function guardarRespuestaChatbot($id, $campo, $respuesta, $no_actualizar)
    {

        if ($no_actualizar) {
            $no_actualizar = explode(',', $no_actualizar);
            foreach ($no_actualizar as $c) {
                DB::table('chatbot')
                    ->where('id', "=", $id)
                    ->where('finalizado', '=', 0)
                    ->limit(1)
                    ->update([
                        $c => null,
                    ]);
            }
        }
        if ($campo) {
            try {
                DB::table('chatbot')
                    ->where('id', "=", $id)
                    ->where('finalizado', '=', 0)
                    ->update([
                        $campo => $respuesta,
                    ]);
            } catch (\Exception $e) {
                // print "[LOG] Error en la llamada a base de datos\n";
                // print "Error: " . $e->getMessage();
            }
        }
    }

    private function obtenerEstadoBot($telefono)
    {
        try {
            // Fallo 2 — SQL crudo reemplazado por Query Builder parametrizado (OWASP A03)
            $resultado = DB::table('chatbot as c')
                ->select('c.id', 'c.chatbot_preguntas_id', 'c.telefono', 'cp.tipo_formato', 'c.recordatorio', 'c.historia')
                ->join('chatbot_preguntas as cp', 'cp.id', '=', 'c.chatbot_preguntas_id')
                ->where('c.telefono', $telefono)
                ->where('c.finalizado', 0)
                ->orderByDesc('c.id')
                ->first();
            if ($resultado) {
                $datos = (array) $resultado;
            } else {
                $datos = $this->crearRegistro($telefono);
            }
            return $datos;
        } catch (\Exception $e) {
            //print "[LOG] Error en la llamada a base de datos\n";
            //print "Error: " . $e->getMessage();
        }
    }

    private function crearRegistro($telefono)
    {
        try {
            DB::table('chatbot')->insert([
                'telefono' => $telefono,
                'chatbot_preguntas_id' => 0,
                'finalizado' => 0
            ]);

            // Fallo 2 — SQL crudo reemplazado por Query Builder parametrizado (OWASP A03)
            $result = DB::table('chatbot as c')
                ->select('c.id', 'c.chatbot_preguntas_id', 'c.telefono', 'cp.tipo_formato', 'c.recordatorio')
                ->join('chatbot_preguntas as cp', 'cp.id', '=', 'c.chatbot_preguntas_id')
                ->where('c.telefono', $telefono)
                ->orderByDesc('c.id')
                ->first();
            if ($result) {
                $datos['id'] = $result->id;
                $datos['chatbot_preguntas_id'] = $result->chatbot_preguntas_id;
                $datos['telefono'] = $result->telefono;
                $datos['tipo_formato'] = $result->tipo_formato;
                $datos['recordatorio'] = $result->recordatorio;
                return $datos;
            } else {
                abort(404, "El registro no se creó correctamente.\n");
            }
        } catch (\Exception $e) {
            //print "[LOG] Error en la llamada a base de datos\n";
            //print "Error: " . $e->getMessage();
        }
    }

    private function guardarDatosPaciente($id_chatbot, $historia, $aseguradora, $id_aseguradora, $nombre, $apellido1, $apellido2)
    {
        DB::table('chatbot')
                ->where('id', "=", $id_chatbot)
                ->where('finalizado', '=', 0)
                ->limit(1)
                ->update([
                    'historia' => $historia,
                    'aseguradoras_opciones' => $aseguradora,
                    'id_aseguradora' => $id_aseguradora,
                    'nombre' => $nombre,
                    'apellido1' => $apellido1,
                    'apellido2' => $apellido2
                ]);
    }

    private function guardarFechaCita($id_reserva, $texto, $id_chatbot)
    {
        $this->local_log(1, 1, "Id de la reserva: " . $id_reserva);

        //var_dump($id_reserva);
        DB::table('chatbot')
        ->where('id', "=", $id_chatbot)
        ->where('finalizado', '=', 0)
        ->limit(1)
        ->update([
            'fecha_cita' => $texto,
            'id_reserva' => $id_reserva
        ]);
    }

    private function guardarIdAgendaMotivo($id_chatbot, $id_agenda, $id_motivo, $comentario)
    {
        DB::table('chatbot')
        ->where('id', "=", $id_chatbot)
        ->where('finalizado', '=', 0)
        ->limit(1)
        ->update([
            'id_agenda' => $id_agenda,
            'id_motivo' => $id_motivo,
            'comentario' => $comentario
        ]);
    }

    private function getIdAgendaMotivo($id_chatbot)
    {
        try {
            $parametros = DB::table('chatbot')
            ->selectRaw("id_agenda,id_motivo")
                ->where('id', '=', $id_chatbot)
                ->first();
            return $parametros;
        } catch (\Exception $e) {
            // print "[LOG] Error en la llamada a base de datos\n";
            // print "Error: " . $e->getMessage();
        }
    }

    private function getIdReservaBBDD($id_bot)
    {
        try {
            $parametros = DB::table('chatbot')
            ->selectRaw("id_reserva")
                ->where('id', '=', $id_bot)
                ->first();
            return $parametros->id_reserva;
        } catch (\Exception $e) {
            // print "[LOG] Error en la llamada a base de datos\n";
            // print "Error: " . $e->getMessage();
        }
    }

    private function getDatosPaciente($id_bot)
    {
        try {
            $parametros = DB::table('chatbot')
            ->selectRaw("historia,aseguradoras_opciones,id_aseguradora,nombre,apellido1,apellido2,telefono")
                ->where('id', '=', $id_bot)
                ->first();
            return $parametros;
        } catch (\Exception $e) {
            // print "[LOG] Error en la llamada a base de datos\n";
            // print "Error: " . $e->getMessage();
        }
    }

    private function obtenerComentarioBBDD($id_bot)
    {
        try {
            $parametros = DB::table('chatbot')
            ->selectRaw("comentario")
                ->where('id', '=', $id_bot)
                ->first();
            return $parametros->comentario;
        } catch (\Exception $e) {
            // print "[LOG] Error en la llamada a base de datos\n";
            // print "Error: " . $e->getMessage();
        }
    }

    private function getEspecialidades($id_bot)
    {
        try {
            $parametros = DB::table('chatbot')
            ->selectRaw("lista_especialidades")
                ->where('id', '=', $id_bot)
                ->first();
            return $parametros;
        } catch (\Exception $e) {
            // print "[LOG] Error en la llamada a base de datos\n";
            // print "Error: " . $e->getMessage();
        }
    }


    private function obtenerEspecialidadesAMostrar1($id_bot)
    {
        $especialidades = WebServiceController::dameEspecialidades();
        
        $opcionesLista = array();
        foreach ($especialidades as $especialidad) {
            if (!empty($especialidad->texto)) {
                if (strlen($especialidad->texto) > 21) {
                    $especialidad->texto = substr($especialidad->texto, 0, 21) . '...';
                }
                $opcionesLista[] = $especialidad->texto;
            }
        }
       
        $textoSeparadoPorComas = implode(', ', $opcionesLista);
                        
        $this->guardarListaEspecialidades($id_bot, $textoSeparadoPorComas);
        
        $especialidades = $this->getEspecialidades($id_bot);

        $array_especialidades = explode(",", $especialidades->lista_especialidades);
        
        if (count($array_especialidades) > 9) {
            $limite = 9;
        } else {
            $limite = count($array_especialidades);
        }

        $opcionesLista = array();
       
        for ($i = 0; $i < $limite; $i++) {
            $opcionesLista[] = array("text" => $array_especialidades[$i]);
            unset($array_especialidades[$i]);
        }
        $array_especialidades = array_values($array_especialidades);
       

        $newEspecialidades = implode(", ", $array_especialidades);
        $this->guardarListaEspecialidades($id_bot, $newEspecialidades);
        return $opcionesLista;
    }

    private function obtenerEspecialidadesAMostrar2($id_bot)
    {
        
        $especialidades = $this->getEspecialidades($id_bot);
        $array_especialidades = explode(",", $especialidades->lista_especialidades);
        
        if (count($array_especialidades) > 9) {
            $limite = 9;
        } else {
            $limite = count($array_especialidades);
        }

        $opcionesLista = array();
       
        for ($i = 0; $i < $limite; $i++) {
            $opcionesLista[] = array("text" => $array_especialidades[$i]);
        }
        $array_especialidades = array_values($array_especialidades);

        $newEspecialidades = implode(", ", $array_especialidades);
        $this->guardarListaEspecialidades($id_bot, $newEspecialidades);
        return $opcionesLista;
    }





    private function getIdEspecialidad($alias)
    {
        try {
            $parametros = DB::table('lista_especialidades')
            ->selectRaw("id_especialidad")
                ->where('alias', 'like', "$alias")
                ->first();
            return $parametros->id_especialidad;
        } catch (\Exception $e) {
            // print "[LOG] Error en la llamada a base de datos\n";
            // print "Error: " . $e->getMessage();
        }
    }



    private function crearCita($telefono_sin_format, $id_chatbot, $id_cita)
    {
        //Llama al webService para confirmar el hueco del id indicado y crear la cita
        $datos = WebServiceController::dameCita($id_cita);
        if ($datos) {
            // if($datos->textoError == "No encuentro la cita"){
            //     $this->enviarMensaje($telefono_sin_format,"Lo sentimos, no se ha podido crear su cita. Vuelva a intentarlo más tarde.",$id_chatbot);
            //     $this->finalizarBot($id_chatbot,$telefono_sin_format,"Reserva caducada");
            //     die;
            // }
            $respuesta = (string) $datos->datos->token;
            if ($respuesta == "-60") {
                $this->enviarMensaje($telefono_sin_format, "Lo sentimos, el hueco seleccionado ya no está disponible. Vuelva a intentarlo más tarde.", $id_chatbot);
                $this->finalizarBot($id_chatbot, $telefono_sin_format, "Reserva caducada");
                return false; // Fix Fallo 6: die reemplazado por return false
            }
            $resultado = (int) $datos->Resultado;
            if ($resultado == 0) {
                return true;
            } else {
                $this->enviarMensaje($telefono_sin_format, "Lo sentimos, el hueco seleccionado ya no está disponible. Vuelva a intentarlo más tarde.", $id_chatbot);
                $this->finalizarBot($id_chatbot, $telefono_sin_format, "Reserva caducada");
                return false; // Fix Fallo 6: die reemplazado por return false
            }
        } else {
            $this->enviarMensaje($telefono_sin_format, "Lo sentimos, el hueco seleccionado ya no está disponible Vuelva a intentarlo más tarde.", $id_chatbot);
            $this->finalizarBot($id_chatbot, $telefono_sin_format, "Reserva caducada");
            return false; // Fix Fallo 6: die reemplazado por return false
        }
    }

    private function getIdFromHueco($texto, $id_chatbot)
    {
        $parametros = null; // Fix 7: inicializar antes del try para evitar variable indefinida si la query falla
        try {
            $parametros = DB::table('chatbot_huecos_ofertados')
            ->selectRaw("id_reserva")
                ->where('id_chatbot', '=', $id_chatbot)
                ->where('mensaje', '=', $texto)
                ->first();
        } catch (\Exception $e) {
            // print "[LOG] Error en la llamada a base de datos\n";
            // print "Error: " . $e->getMessage();
        }
        return $parametros;
    }

    private function getHuecosBBDD($id_chatbot)
    {
        $parametros = DB::table('chatbot_huecos_ofertados')
            ->selectRaw("fecha,hora,mensaje")
                ->where('id_chatbot', '=', $id_chatbot)
                ->get();
            return $parametros;
    }

    private function getIdAgenda($id_chatbot, $doctor)
    {
        try {
            $parametros = DB::table('doctores_tmp')
            ->selectRaw("id_agenda")
                ->where('nombre', 'like', "%$doctor%")
                ->where('id_chatbot', '=', $id_chatbot)
                ->first();
            return $parametros->id_agenda;
        } catch (\Exception $e) {
            // print "[LOG] Error en la llamada a base de datos\n";
            // print "Error: " . $e->getMessage();
        }
    }

    private function obtenerFechas($compania, $motivoConsulta, $idAgenda)
    {
        $this->local_log(1, 1, "Voy a obtener los huecos");
        $email = "";
        $horaInicio = "08:00";
        $horaFin = "21:00";
        $fechaInicio = date("d-m-Y");
        $fechaFin = date("d-m-Y", strtotime($fechaInicio . "+ 90 days"));
        $huecos = WebServiceController::dameHuecos($horaInicio, $horaFin, $fechaInicio, $fechaFin, $email, $idAgenda, $compania, $motivoConsulta);

        if ($huecos) {
            $this->local_log(1, 1, "Huecos obtenidos");
            return $huecos;
        } else {
            return false;
        }
    }
    private function getFranjaHorarios()
    {
        try {
            $query = "SELECT * FROM chatbot_configuracion";
            $datos = DB::select($query);
            if (!(collect($datos)->isEmpty())) {
                $datos = $datos[0];
                return $datos;
            } else {
                abort(404, "No se encontraron franjas de horarios en chatbot_configuracion.\n");
            }
        } catch (\Exception $e) {
            // print "[LOG] Error en la llamada a base de datos\n";
            // print "Error: " . $e->getMessage();
        }
    }

    private function mismoRangoHorario($fecha1, $fecha2)
    {
        $hora1 = Carbon::parse($fecha1);
        $hora2 = Carbon::parse($fecha2);
        $horarios = $this->getFranjaHorarios();
        
        if (($hora1->hour >= $horarios->h_inicio_manana && $hora1->hour < $horarios->h_fin_manana) && ($hora2->hour >= $horarios->h_inicio_manana && $hora2->hour < $horarios->h_fin_manana)) {
            return true;
        } elseif (($hora1->hour >= $horarios->h_inicio_tarde && $hora1->hour < $horarios->h_fin_tarde ) && ($hora2->hour >= $horarios->h_inicio_tarde && $hora2->hour < $horarios->h_fin_tarde )) { // Fix Fallo 9: era $hora1 en la última comparación, debe ser $hora2
            return true;
        } else {
            return false;
        }
    }

    private function guardarHuecos($huecos, $id_chatbot)
    {
 
    //antes de guardar los huecos, comprobar que no haya huecos ya, por los casos en los que el cliente vuelve para atras
        DB::table('chatbot_huecos_ofertados')->where('id_chatbot', $id_chatbot)->delete();
        $it = 0;
        $n_huecos = 0;
        $f_cita = $huecos[$it]['FCITA'];

        $h_cita = $huecos[$it]['HCITA'];


        //$hueco = $this->reservarHueco($id_chatbot,$huecos,$f_cita, $h_cita);
        $this->guardarHuecoBBDD($f_cita, $h_cita, $id_chatbot, $n_huecos);
        while ($n_huecos < 4 && $it < count($huecos) - 1) {
            $f_cita_aux = $huecos[$it]['FCITA'];
            $f_cita = $huecos[$it + 1]['FCITA'];

            $h_cita_aux = $huecos[$it]['HCITA'];
            $h_cita = $huecos[$it + 1]['HCITA'];


            $fecha1 = $f_cita_aux;

            $fecha2 = $f_cita;

            if ($fecha1 == $fecha2 && !$this->mismoRangoHorario($h_cita_aux, $h_cita)) {
                //$hueco = $this->reservarHueco($id_chatbot,$huecos,$f_cita, $h_cita);
                $it++;
                $n_huecos++;
                $this->guardarHuecoBBDD($f_cita, $h_cita, $id_chatbot, $n_huecos);
            } elseif ($fecha1 != $fecha2) {
                //$hueco = $this->reservarHueco($id_chatbot,$huecos,$f_cita, $h_cita);
                $it++;
                $n_huecos++;

                $this->guardarHuecoBBDD($f_cita, $h_cita, $id_chatbot, $n_huecos);
            } else {
                $it++;
            }
        }
        return $n_huecos + 1;
    }

    private function guardarHuecoBBDD($f_cita, $h_cita, $id_chatbot, $n_hueco)
    {
      
        $mensaje = $f_cita . " a las " . $h_cita;
        
        //$id_reserva = $hueco->huecos->resultado;
        try {
            DB::table('chatbot_huecos_ofertados')->insert([
                'id_chatbot' => $id_chatbot,
                'fecha' => $f_cita,
                'hora' => $h_cita,
                'n_hueco' => $n_hueco,
                'mensaje' => $mensaje
            ]);
        } catch (\Exception $e) {
            // print "[LOG] Error en la llamada a base de datos\n";
            // print "Error: " . $e->getMessage();
        }
    }

    public function reservarHueco($id_chatbot, $fechaInicio, $horaInicio)
    {
        $this->local_log(1, 1, "Voy a reservar hueco");
        $paciente = $this->getDatosPaciente($id_chatbot);
        $ids = $this->getIdAgendaMotivo($id_chatbot);

        $nombre = (string) $paciente->nombre;
        $apellido1 = (string) $paciente->apellido1;
        $apellido2 = (string) $paciente->apellido2;
        $telefono = (string) $paciente->telefono;

        $historia = (string) $paciente->historia;
        $compania = (string) $paciente->id_aseguradora;
        $idAgenda = (string) $ids->id_agenda;
        $motivo = (string) $ids->id_motivo;
        $email = "";
        $notas = "";
       
        $hueco = WebServiceController::dameHueco($horaInicio, $horaInicio, $fechaInicio, $fechaInicio, $nombre, $apellido1, $apellido2, $telefono, $email, $notas, $idAgenda, $compania, $motivo, $historia);
        $this->local_log(1, 1, "Hueco reservado");
        return $hueco;
    }

    private function guardarInfoAgendas($id_especialidad, $id_aseguradora, $id_chatbot, $telefono_sin_format, $formato, $texto)
    {
        $datos = WebServiceController::dameAgendas($id_especialidad, $id_aseguradora);
        //$datos[0] = "Error, no se han encontrado agendas ";
        if ($datos[0] == "Error, no se han encontrado agendas ") {
            $transicion = $this->siguienteTransicion($formato, self::FALLO);
            $this->guardarRespuestaChatbot($id_chatbot, "especialidad", $texto, $transicion->campo_no_actualizar);
            $this->enviarMensaje($telefono_sin_format, "Lo sentimos, no disponemos de agendas para la especialidad seleccionada.", $id_chatbot);
            $this->finalizarBot($id_chatbot, $telefono_sin_format, "Sin agendas disponibles");
            return []; // Fix Fallo 6: die reemplazado por return []
        }
        
       
        
        DB::table('doctores_tmp')->where('id_chatbot', $id_chatbot)->delete();
        DB::table('motivos_tmp')->where('id_chatbot', $id_chatbot)->delete();
        foreach ($datos->agendas as $agenda) {
            try {
                if (strlen($agenda->profesional) > 21) {
                    $agenda->profesional = substr($agenda->profesional, 0, 21) . '...';
                }
                DB::table('doctores_tmp')->insert([
                    'id_agenda' => $agenda->Id,
                    'nombre' => $agenda->profesional,
                    'id_chatbot' => $id_chatbot
                ]);
            } catch (\Exception $e) {
                // print "[LOG] Error en la llamada a base de datos\n";
                // print "Error: " . $e->getMessage();
            }
            $motivos = WebServiceController::dameMotivosConsulta(strval($agenda->Id));
            foreach ($motivos->motivos as $motivo) {
                if (strlen($motivo->motivoCita) > 21) {
                    $motivo->motivoCita = substr($motivo->motivoCita, 0, 21) . '...';
                }
                try {
                    DB::table('motivos_tmp')->insert([
                    'id_motivo' => $motivo->id,
                    'motivo' => $motivo->motivoCita,
                    'id_agenda' => $motivo->idAgenda,
                    'id_chatbot' => $id_chatbot,
                    'comentario' => $motivo->comenta
                    ]);
                } catch (\Exception $e) {
                    // print "[LOG] Error en la llamada a base de datos\n";
                    // print "Error: " . $e->getMessage();
                }
            }
        }

        try {
            $resultados = DB::table('motivos_tmp')
                ->select("motivo")
                    ->distinct()
                    ->where('id_chatbot', '=', $id_chatbot)
                    ->get();
        } catch (\Exception $e) {
            // print "[LOG] Error en la llamada a base de datos\n";
            // print "Error: " . $e->getMessage();
        }
        $motivos = $resultados->map(function ($item) {
            return $item->motivo;
        });
       

        $motivosArray = $motivos->toArray();
        return $motivosArray;
    }

    private function getActoMedico($id_chatbot)
    {
        try {
            $resultados = DB::table('chatbot')
                ->select('doctor', 'acto_medico')
                    ->where('id', '=', $id_chatbot)
                    ->first();

         
            return $resultados;
        } catch (\Exception $e) {
            // print "[LOG] Error en la llamada a base de datos\n";
            // print "Error: " . $e->getMessage();
        }
    }

    private function getIdDoctorYMotivo($id_chatbot, $motivo, $doctor)
    {
        try {
            $resultados = DB::table('motivos_tmp as mt')
                ->select('mt.id_motivo', 'mt.id_agenda', 'mt.comentario')
                    ->join('doctores_tmp as dt', 'dt.id_agenda', '=', 'mt.id_agenda')
                    ->where('mt.id_chatbot', '=', $id_chatbot)
                    ->where('mt.motivo', '=', $motivo)
                    ->where('dt.nombre', '=', $doctor)
                    ->first();

         
            return $resultados;
        } catch (\Exception $e) {
            Log::error('[Chatbot] Error al obtener datos de motivo y agenda', ['error' => $e->getMessage()]);
        }
    }

    private function getIdAseguradora($id_chatbot)
    {
        try {
            $resultados = DB::table('chatbot')
                ->select('id_aseguradora')
                    ->where('id', '=', $id_chatbot)
                    ->first();

            return $resultados->id_aseguradora;
        } catch (\Exception $e) {
            // print "[LOG] Error en la llamada a base de datos\n";
            // print "Error: " . $e->getMessage();
        }
    }

    private function getConfirmadaBBDD($id_chatbot)
    {
        try {
            $resultados = DB::table('chatbot')
                ->select('confirmada')
                    ->where('id', '=', $id_chatbot)
                    ->first();

            return $resultados->confirmada;
        } catch (\Exception $e) {
            // print "[LOG] Error en la llamada a base de datos\n";
            // print "Error: " . $e->getMessage();
        }
    }

    private function getDoctoresFromActoMedico($id_chatbot, $acto)
    {
        //var_dump($acto);
        try {
            $resultados = DB::table('motivos_tmp as mt')
                ->select('dt.nombre', 'mt.id_agenda')
                    ->join('doctores_tmp as dt', 'dt.id_agenda', '=', 'mt.id_agenda')
                    ->where('mt.id_chatbot', '=', $id_chatbot)
                    ->where('mt.motivo', '=', $acto)
                    ->where('dt.id_chatbot', '=', $id_chatbot)
                    ->get();

           
            $doctores = $resultados->map(function ($item) {
                return $item->nombre;
            });
        

            $doctoresArray = $doctores->toArray();
            return $doctoresArray;
        } catch (\Exception $e) {
            // print "[LOG] Error en la llamada a base de datos\n";
            // print "Error: " . $e->getMessage();
        }
    }

    private function obtenerCitasPaciente($id_chatbot)
    {
        $resultado = DB::table('chatbot')
                ->select('historia')
                    ->where('id', '=', $id_chatbot)
                    ->first();

        $historia = $resultado->historia;
        $citas = WebServiceController::dameCitasPaciente($historia);

        // Fix Fallo 10: array_filter sobre SimpleXMLElement sobrescribía $citas como array plano,
        // rompiendo el acceso posterior a ->cita. El filtrado se hace ahora dentro del foreach con continue.
        // Guard por si Axon devuelve respuesta vacía o sin citas.
        // Fix Fallo 11: eliminar registros anteriores para evitar duplicados si el paciente consulta varias veces
        DB::table('citas_paciente')->where('id_chatbot', $id_chatbot)->delete();
        $resultado = array();
        if (!$citas || !isset($citas->cita)) {
            return $resultado;
        }
        foreach ($citas->cita as $cita) {
            // Fix Fallo 10: filtro de citas nocturnas movido aquí desde array_filter
            if ((int)explode(":", $cita->hora)[0] >= 21) {
                continue;
            }
            // Obtener los datos de la cita
            $fecha = $cita->fecha;
            //$codigoagenda = $cita->codigoagenda;
            $nombreagenda = $cita->nombreagenda;
            $nombreagenda_col = $cita->nombreagenda_col;
            //$paciente = $cita->paciente;
            $apellido1 = $cita->apellido1;
            $apellido2 = $cita->apellido2;
            $nombre = $cita->nombre;
            $compania = $cita->compania;
            $hora = $cita->hora;
            $duracion = $cita->duracion;
            $motivo = $cita->motivo;
            $historia = $cita->historia;
            $codigocit = $cita->codigocit;
            $codigoweb = $cita->codigoweb;
            $compacodigo = $cita->compacodigo;
            $codinet = $cita->codinet;
            $motinet = $cita->motinet;
            $especialidad = $cita->especialidad;
            $partes = explode("/", $fecha);
            $dia = $partes[0];
            $mes = $partes[1];
            $mensaje = $dia . "/" . $mes . " " . $hora . " " . $especialidad;
            if (strlen($mensaje) > 21) {
                $mensaje = mb_substr($mensaje, 0, 21) . '...';
            }
        //echo "Estee es el mensaje que me manda : " . $mensaje . "\n";
                    
            array_push($resultado, array("text" => $mensaje));

        //echo "este es el resultado : " . json_encode($resultado);
            // Insertar los datos en la tabla citas_paciente
            DB::table('citas_paciente')->insert([
                'id_chatbot' => $id_chatbot,
                'fecha' => $fecha,
                'nombre_agenda' => $nombreagenda_col,
                'apellido1' => $apellido1,
                'apellido2' => $apellido2,
                'nombre' => $nombre,
                'aseguradora' => $compania,
                'hora' => $hora,
                'duracion' => $duracion,
                'motivo' => $motivo,
                'historia' => $historia,
                'codigocit' => $codigocit,
                'codigoweb' => $codigoweb,
                'id_aseguradora' => $compacodigo,
                'id_agenda' => $codinet,
                'id_motivo' => $motinet,
                'especialidad' => $especialidad,
                'mensaje' => $mensaje,
            ]);
        }
        return $resultado;
    }

    private function getMensajeConfirmacionCancelacion($id_chatbot, $mensaje)
    {
        $datos = DB::table('citas_paciente')
                ->selectRaw("aseguradora,fecha,hora,nombre_agenda,motivo,especialidad,codigocit,codigoweb")
                    ->where('id_chatbot', '=', $id_chatbot)
                    ->where('mensaje', '=', $mensaje)
                    ->first();
        
        $mensaje = "¿Está seguro que desea cancelar la cita de " . $datos->motivo . " para " . $datos->especialidad . " con el doctor " . $datos->nombre_agenda . " el dia " . $datos->fecha . " a las " . $datos->hora . " ?";
        $fecha_cita = $datos->fecha . " a las " . $datos->hora;
        try {
            DB::table('chatbot')
                ->where('id', "=", $id_chatbot)
                ->where('finalizado', '=', 0)
                ->update([
                    'aseguradora' => $datos->aseguradora,
                    'especialidad' => $datos->especialidad,
                    'doctor' => $datos->nombre_agenda,
                    'acto_medico' => $datos->motivo,
                    'fecha_cita' => $fecha_cita,
                    'codigocit' => $datos->codigocit,
                    'codigoweb' => $datos->codigoweb
                ]);
        } catch (\Exception $e) {
            //print "[LOG] Error en la llamada a base de datos\n";
            //print "Error: " . $e->getMessage();
        }
            return $mensaje;
    }

    private function cancelarCita($id_chatbot)
    {
        $datos = DB::table('chatbot')
                ->selectRaw("codigocit,codigoweb")
                    ->where('id', '=', $id_chatbot)
                    ->where('finalizado', '=', 0)
                    ->first();

        $resultado = WebServiceController::cancelaCita($datos->codigocit, $datos->codigoweb);
    //print "Este es el resultado : $resultado \n";
        
        return $resultado;
    }

    private function getMensajeConsultaCitas($id_chatbot, $texto)
    {
        try {
            $datos = DB::table('citas_paciente')
                ->selectRaw("fecha,hora,nombre,apellido1,apellido2,nombre_agenda,motivo,especialidad,aseguradora,duracion")
                    ->where('id_chatbot', '=', $id_chatbot)
                    ->where('mensaje', '=', $texto)
                    ->first();

            $fecha_cita = $datos->fecha . " a las " . $datos->hora;

            DB::table('chatbot')
                ->where('id', "=", $id_chatbot)
                ->where('finalizado', '=', 0)
                ->update([
                    'aseguradora' => $datos->aseguradora,
                    'especialidad' => $datos->especialidad,
                    'doctor' => $datos->nombre_agenda,
                    'acto_medico' => $datos->motivo,
                    'fecha_cita' => $fecha_cita
                ]);
        } catch (\Exception $e) {
                    // print "[LOG] Error en la llamada a base de datos\n";
                    // print "Error: " . $e->getMessage();
        }
        $mensaje = "Paciente: " . $datos->nombre . " " . $datos->apellido1 . " " . $datos->apellido2 . " \\nAseguradora: " . $datos->aseguradora . " \\nEspecialidad: " . $datos->especialidad . " \\nMotivo: " . $datos->motivo . " \\nDoctor: " . $datos->nombre_agenda . " \\nFecha: " . $datos->fecha . " \\nHora: " . $datos->hora . " \\nDuración: " . $datos->duracion;

        return $mensaje;
    }

    private function getDatosModificar($id_chatbot, $texto)
    {
        $datos = null; // Fix 7: inicializar antes del try para evitar variable indefinida si la query falla
        try {
            $datos = DB::table('citas_paciente')
                ->selectRaw("id_aseguradora,id_agenda,id_motivo")
                    ->where('id_chatbot', '=', $id_chatbot)
                    ->where('mensaje', '=', $texto)
                    ->first();
        } catch (\Exception $e) {
                    // print "[LOG] Error en la llamada a base de datos\n";
                    // print "Error: " . $e->getMessage();
        }
        return $datos;
    }

    private function getOpcionBBDD($id_chatbot)
    {
        $datos = DB::table('chatbot')
                ->selectRaw("opcion")
                    ->where('id', '=', $id_chatbot)
                    ->where('finalizado', '=', 0)
                    ->first();
        return $datos->opcion;
    }

    private function guardarCitaModificar($id_chatbot, $texto)
    {

        //guardar los datos de la cita que se va a modificar, la cual ya se, en la tabla chatbot
        try {
            $datos = DB::table('citas_paciente')
                ->selectRaw("id_aseguradora,id_agenda,id_motivo,aseguradora,especialidad,nombre_agenda,motivo,fecha,hora,codigocit,codigoweb")
                    ->where('id_chatbot', '=', $id_chatbot)
                    ->where('mensaje', '=', $texto)
                    ->first();
        } catch (\Exception $e) {
                    // print "[LOG] Error en la llamada a base de datos\n";
                    // print "Error: " . $e->getMessage();
        }
        $fecha_cita = $datos->fecha . " a las " . $datos->hora;

        try {
            DB::table('chatbot')
                ->where('id', "=", $id_chatbot)
                ->where('finalizado', '=', 0)
                ->update([
                    'aseguradora' => $datos->aseguradora,
                    'especialidad' => $datos->especialidad,
                    'doctor' => $datos->nombre_agenda,
                    'acto_medico' => $datos->motivo,
                    'fecha_cita' => $fecha_cita,
                    'id_agenda' => $datos->id_agenda,
                    'id_motivo' => $datos->id_motivo,
                    'codigocit' => $datos->codigocit,
                    'codigoweb' => $datos->codigoweb
                ]);
        } catch (\Exception $e) {
            //print "[LOG] Error en la llamada a base de datos\n";
            //print "Error: " . $e->getMessage();
        }

        //esos datos los guardo en mi tabla chatbot
    }

    private function procesarMensajeRecordatorio($id_bot, $texto, $tipoMensaje, $telefono_sin_format, $historia)
    {
        
            $cita = $this->getDatosCitaRecordatorio($id_bot);
            $id_cita = $cita->codigocit;
        //echo "Este es el idCIta___________ " . $id_cita . "\n";
       // Log::info('id_bot',['bot'=>$id_bot]);
      //  Log::info('id_cita',['cita'=>$id_cita]);
        if ($texto == "Aceptar cita") {
            //llamo a webservice indicando que si
            $datos = WebServiceController::confirmarAsistencia("CNF", $id_cita);
            //var_dump($datos);
            if ($datos->Resultado == 0) {
                $this->guardarMensajeRespondido($id_bot, 1);
                $this->enviarMensaje($telefono_sin_format, "Muchas gracias por su respuesta, su asistencia ha sido confirmada.", $id_bot);
            } else {
                $this->guardarMensajeRespondido($id_bot, -1);
                $this->enviarMensaje($telefono_sin_format, "Lo sentimos, ha habido un error a la hora de confirmar su asistencia. Por favor, contacte con la clínica.", $id_bot);
            }
        } elseif ($texto == "Cancelar cita") {
         //   Log::info('entro');
            //llamo a webservice indicando que no
                  $datos = WebServiceController::confirmarAsistencia("CANCELA", $id_cita);
                  //var_dump($datos);

            if ($datos->Resultado == 0) {
                $cancelar = $this->cancelarCita($id_bot);
                if ($cancelar) {
                    $this->guardarMensajeRespondido($id_bot, 0);
                              $this->enviarMensaje($telefono_sin_format, "Muchas gracias por su respuesta, su cita ha sido cancelada.", $id_bot);
                }
            } else {
                $this->guardarMensajeRespondido($id_bot, -2);
                $this->enviarMensaje($telefono_sin_format, "Lo sentimos, ha habido un error a la hora de cancelar su cita. Por favor, contacte con la clínica.", $id_bot);
            }
        } elseif ($texto == "Modificar cita") {
            $this->modificarRecordatorio($id_bot);
            $transicion = $this->siguienteTransicion('lista_citas_modificar', self::ACIERTO);
                    // obtener los datos de la cita y cancelarla
            $thot = $this->obtenerMensaje($transicion->id);
            $ids = $this->getDatosModificarRecordatorio($id_bot, $cita->acto_medico);
            if (!$ids) {
                $this->enviarMensaje($telefono_sin_format, "Lo sentimos, no podemos procesar la modificación de esta cita. Por favor, contacte con la clínica.", $id_bot);
                $this->finalizarBot($id_bot, $telefono_sin_format, "Sin datos para modificar cita desde recordatorio");
                return;
            }
            $this->enviarMensaje($telefono_sin_format, "Buscando los huecos disponibles...", $id_bot);
            $huecos = $this->obtenerFechas($ids->id_aseguradora, $ids->id_motivo, (int)$ids->id_agenda);
            if ($huecos) {
                $n_huecos = $this->guardarHuecos($huecos, $id_bot);
            } else {
                $this->enviarMensaje($telefono_sin_format, "Lo sentimos, no tenemos huecos disponibles, por favor vuelva a intentarlo más tarde.", $id_bot);
                $this->finalizarBot($id_bot, $telefono_sin_format, "Sin huecos disponibles");
                return;
            }
            $h = $this->getHuecosBBDD($id_bot);
            $opcionesLista = array();
            foreach ($h as $hueco) {
                array_push($opcionesLista, array("text" => $hueco->mensaje));
            }
            array_push($opcionesLista, array("text" => "Ninguno"));

            $this->enviarLista($telefono_sin_format, $opcionesLista, "Seleccione:", $thot->texto, $id_bot, $transicion->id);
            $this->actualizarEstadoChatbot($id_bot, $transicion->id, $transicion->formato);
        } elseif ($texto == "Baja recordatorios") {
            $result = WebServiceController::permisosSMSPaciente($historia, 0);
            if ($result == 1) {
                $this->enviarMensaje($telefono_sin_format, "Se ha dado de baja con éxito.", $id_bot);
            } else {
                $this->enviarMensaje($telefono_sin_format, "Ha habido un error al darse de baja, por favor contacte con la clínica.", $id_bot);
            }
            $this->finalizarChatBot($id_bot);
        } else {
            $opcionesLista = array(
                array("text" => "Aceptar cita"),
                array("text" => "Cancelar cita"),
                array("text" => "Modificar cita"),
                array("text" => "Baja recordatorios")
            );
            $mensaje = "Por favor, responda a una de las opciones";
            $this->enviarLista($telefono_sin_format, $opcionesLista, "Seleccione una de las siguientes opciones:", $mensaje, $id_bot, 0);
        }
    }

    private function getDatosModificarRecordatorio($id_bot, $consulta)
    {
        $datos = null;
        try {
            $datos = DB::table('chatbot')
                ->selectRaw("chatbot.id_aseguradora,chatbot.id_agenda,his_medicos_pruebas.activity_lid as id_motivo")
                ->join('his_medicos_pruebas', 'chatbot.id_agenda', '=', 'his_medicos_pruebas.resource_lid')
                    ->where('chatbot.id', '=', $id_bot)
                    ->whereRaw('his_medicos_pruebas.activity_name COLLATE utf8mb3_general_ci = ?', [$consulta])
                    ->first();
        } catch (\Exception $e) {
            Log::error('[Chatbot] Error al obtener datos para modificar recordatorio', ['error' => $e->getMessage()]);
        }
        return $datos;
    }


    private function modificarRecordatorio($id_bot)
    {
        try {
            DB::table('chatbot')
            ->where('id', "=", $id_bot)
            ->where('finalizado', '=', 0)
            ->limit(1)
            ->update([
                'chatbot_preguntas_id' => 101,
                'recordatorio' => 0,
            ]);
        } catch (\Exception $e) {
                // print "[LOG] Error en la llamada a base de datos\n";
                // print "Error: " . $e->getMessage();
        }
    }

    private function getDatosCitaRecordatorio($id_bot)
    {
        $datos = DB::table('chatbot')
                ->selectRaw("codigocit,id_aseguradora,acto_medico,id_agenda")
                    ->where('id', '=', $id_bot)
                    ->where('finalizado', '=', 0)
                    ->first();
        return $datos;
    }

    private function guardarMensajeRespondido($id_bot, $respuesta)
    {
        DB::table('chatbot')
        ->where('id', "=", $id_bot)
        ->where('finalizado', '=', 0)
        ->limit(1)
        ->update([
            'observaciones' => "respondido",
            'confirmada' => $respuesta,
            'finalizado' => 1
        ]);
    }

    private function obtenerEstadoBotPorId($id_bot)
    {
        /*$datos = DB::table('chatbot as c')
            ->join('chatbot_preguntas as cp', 'cp.id', '=', 'c.chatbot_preguntas_id')
            ->select('c.id', 'c.chatbot_preguntas_id', 'c.telefono', 'cp.tipo_formato', 'c.recordatorio', 'c.historia', 'c.idioma')
            ->where('c.id', '=', $id_bot)
            ->where('c.finalizado', '=', 0)
            ->first();*/
        $datos = DB::table('chatbot as c')
            ->join('chatbot_preguntas as cp', 'cp.id', '=', 'c.chatbot_preguntas_id')
            ->select('c.id', 'c.chatbot_preguntas_id', 'c.telefono', 'cp.tipo_formato', 'c.recordatorio', 'c.historia')
            ->where('c.id', '=', $id_bot)
            ->where('c.finalizado', '=', 0)
            ->first();
        return (array) $datos;
    }
}
