<?php

// Helper encargado de detectar el módulo relacionado según el mensaje del usuario

require_once __DIR__ . '/../helpers/chatbot_helper.php';

// Helper encargado de conectarse a la API de Groq

require_once __DIR__ . '/../helpers/groq_helper.php';

class chatBotController {

    public function responder() {

        // Indicamos que la respuesta será JSON
        
        header('Content-Type: application/json');

        // Validar método HTTP
        // Solo se permiten peticiones POST

        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {

            echo json_encode([
                'success' => false
            ]);

            exit;
        }

        // Obtener mensaje enviado desde JS
        // trim() elimina espacios innecesarios

        $mensaje = trim($_POST['mensaje'] ?? '');

        // Validar mensaje vacío

        if (empty($mensaje)) {

            echo json_encode([
                'success' => false
            ]);

            exit;
        }

        // Limitar longitud máxima del mensaje para evitar abuso o consumo excesivo de tokens

        if (mb_strlen($mensaje) > 500) {

            echo json_encode([
                'success' => false,
                'error' => 'La consulta es demasiado larga.'
            ]);

            exit;
        }

        // Inicializar historial del chat en sesión si aún no existe

        if (!isset($_SESSION['chat_historial'])) {
            $_SESSION['chat_historial'] = [];
        }

        // Detectar automáticamente el módulo relacionado con la consulta

        $modulo = detectarModulo($mensaje);

        // Cache estática para evitar leer archivos en cada consulta

        static $docsCache = [];

        // Cargar documentación general solamente una vez

        if (!isset($docsCache['general'])) {

            $docsCache['general'] = file_get_contents(
                __DIR__ . '/../docs/general.txt'
            );
        }

        // Cargar documentación específica del módulo detectado

        if (!isset($docsCache[$modulo])) {

            $rutaModulo = __DIR__ . "/../docs/{$modulo}.txt";

            // Verificar si existe el archivo

            if (file_exists($rutaModulo)) {

                $docsCache[$modulo] = file_get_contents($rutaModulo);

            } else {

                // Si no existe, guardar vacío

                $docsCache[$modulo] = '';
            }
        }

        // Unir documentación general + documentación específica del módulo

        $contexto = $docsCache['general'] . "\n\n" . $docsCache[$modulo];

        // Prompt del sistema
        // Define comportamiento y restricciones de la IA

        $systemPrompt = "
            Sos el asistente interno del sistema ByteCenter.

            Tu función es ayudar a operadores y administradores
            utilizando únicamente la documentación proporcionada.

            REGLAS IMPORTANTES:

            - Respondé únicamente usando información presente en la documentación.

            - No inventes funcionalidades, botones, módulos,
            pantallas, acciones, permisos ni procesos.

            - No asumas comportamientos típicos de otros sistemas.

            - Si el usuario consulta sobre una funcionalidad del sistema que no aparece documentada, 
            indicá brevemente que no encontraste información específica sobre esa funcionalidad.

            - Nunca completes información faltante usando suposiciones.

            - Cuando exista un procedimiento documentado,
            explicalo paso a paso.

            - Utilizá exactamente los nombres de botones,
            módulos y acciones documentadas.

            - La documentación puede contener símbolos como:
            #, ##, ###, *, **

            - Esos símbolos son únicamente separadores internos
            de títulos y subtítulos.

            - Nunca escribas esos símbolos en la respuesta.

            - Respondé siempre en texto plano.

            - No uses markdown.

            - No uses encabezados markdown.

            - No uses listas markdown.

            - Para enumerar pasos, utilizá solamente:
            1.
            2.
            3.

            - Mantené respuestas claras, naturales y breves.

            EJEMPLOS DE RESPUESTAS INCORRECTAS:
            - 'Exportar clientes'
            - 'Venta rápida'
            - 'Dashboard'
            - 'Panel avanzado'
            - 'Modo express'
            - 'CSV'
            - 'Métricas automáticas'

            DOCUMENTACIÓN:
            $contexto
        ";

        // Recuperar últimos mensajes para mantener contexto conversacional

        $historial = array_slice(
            $_SESSION['chat_historial'],
            -10
        );

        // Array final enviado a la IA

        $messages = [];

        // Primer mensaje: prompt del sistema

        $messages[] = [
            'role' => 'system',
            'content' => $systemPrompt
        ];

        // Agregar historial previo

        foreach ($historial as $msg) {
            $messages[] = $msg;
        }

        // Agregar mensaje actual del usuario

        $messages[] = [
            'role' => 'user',
            'content' => $mensaje
        ];

        // Consultar API

        $resultado = consultarChatbot($messages);

        // Validar errores

        if (!$resultado['success']) {

            echo json_encode([
                'success' => false,
                'error' => $resultado['error']
            ]);

            exit;
        }

        // Obtener contenido de respuesta

        $respuesta = $resultado['content'];

        // Guardar mensaje usuario

        $_SESSION['chat_historial'][] = [
            'role' => 'user',
            'content' => $mensaje
        ];

        // Guardar respuesta IA

        $_SESSION['chat_historial'][] = [
            'role' => 'assistant',
            'content' => $respuesta
        ];

        // Limitar tamaño del historial para evitar exceso de tokens

        $_SESSION['chat_historial'] = array_slice(
            $_SESSION['chat_historial'],
            -20
        );

        // Respuesta final al frontend (JSON)

        echo json_encode([
            'success' => true,
            'respuesta' => $respuesta
        ]);

        exit;
    }
}