<?php

/*
Función encargada de comunicarse con la API de Groq

Recibe: 
- Un array con todos los mensajes de contexto: system, historial y mensaje actual del usuario

Devuelve:
- success -> true/false
- content -> respuesta del modelo
- error -> mensaje de error en caso de fallo
*/

function consultarChatbot($mensajes) {

    /* 
    DATA

    Arma el cuerpo JSON que será enviado a la API

    model:
    - Modelo de IA a utilizar

    messages:
    - Conversación completa

    temperature:
    - Nivel de creatividad
    - Mientras mas bajo, más preciso y menos inventa
    */

    $data = [
        'model' => 'llama-3.1-8b-instant',

        'messages' => $mensajes,

        'temperature' => 0.2
    ];

    /*
    HEADERS HTTP

    Content-Type:
    - Indicamos que enviamos JSON

    Authorization:
    - Token Bearer con la API KEY
    - Se obtiene desde el archivo .env cargado en $_ENV
    */

    $headers = [
        'Content-Type: application/json',
        'Authorization: Bearer ' . $_ENV['GROQ_API_KEY']
    ];

    /*
    INICIALIZAR CURL

    cURL permite realizar solicitudes HTTP desde PHP
    */

    $ch = curl_init();

    /*
    CONFIGURACIÓN CURL

    CURLOPT_URL
    - Endpoint oficial de Groq
    
    CURLOPT_RETURNTRANSFER
    - Hace que la respuesta se devuelva como string
    - Si no estuviera, la imprimiría directamente
    
    CURLOPT_POST
    - Indicamos que la petición será POST
    
    CURLOPT_HTTPHEADER
    - Enviamos headers HTTP
    
    CURLOPT_POSTFIELDS
    - Enviamos el body JSON
    */

    curl_setopt_array($ch, [

        CURLOPT_URL => 'https://api.groq.com/openai/v1/chat/completions',

        CURLOPT_RETURNTRANSFER => true,

        CURLOPT_POST => true,

        CURLOPT_HTTPHEADER => $headers,

        CURLOPT_POSTFIELDS => json_encode($data)
    ]);

    /*
    EJECUTAR CONSULTA

    - Se realiza la petición HTTP a Groq
    */

    $response = curl_exec($ch);

    /*
    ERROR CURL
    
    Detecta errores de conexión reales
    */

    if (curl_errno($ch)) {

        $error = curl_error($ch);

        curl_close($ch);

        return [
            'success' => false,
            'error' => $error
        ];
    }

    /*
    HTTP STATUS CODE

    Obtenemos el código HTTP de la respuesta
    */

    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    /*
    CERRAR cURL

    Liberamos recursos
    */

    curl_close($ch);

    /*
    RATE LIMIT
    
    Groq limita la cantidad de tokens por minuto

    429 = demasiadas consultas o contexto muy grande
    */

    if ($httpCode === 429) {

        return [
            'success' => false,
            'error' => 'Límite temporal alcanzado. Esperá unos segundos.'
        ];
    }

    /*
    OTROS ERRORES HTTP
    
    Si la respuesta no fue 200, devolvemos error (200 -> OK)
    */

    if ($httpCode !== 200) {

        return [
            'success' => false,
            'error' => "HTTP ERROR {$httpCode}: {$response}"
        ];
    }

    /* 
    DECODIFICAR JSON

    Convertimos la respuesta JSON de Groq en array PHP
    */

    $resultado = json_decode($response, true);

    /* 
    RESPUESTA FINAL

    choices[0]['message']['content']

    Es donde Groq devuelve el texto generado
    */

    return [
        'success' => true,

        'content' => $resultado['choices'][0]['message']['content'] ?? 'Sin respuesta.'
    ];
}