<?php
/******************************************************
 * Conexión a la base de datos y manejo del webhook
 * Versión mejorada con manejo de errores y logging
 ******************************************************/

// Habilitar registro de errores
ini_set('display_errors', 1);
ini_set('log_errors', 1);
error_reporting(E_ALL);

// Función para logging
function logMessage($message, $type = 'INFO') {
    $logFile = __DIR__ . '/webhook_log.txt';
    $timestamp = date('Y-m-d H:i:s');
    file_put_contents($logFile, "[$timestamp] [$type] $message" . PHP_EOL, FILE_APPEND);
}

// Credenciales para la conexión a la base de datos
$servername = "localhost";
$username = "u748235332_trauma2025";
$password = "*8tJIM12RG!";
$dbname = "u748235332_trauma2025";
$dbtable = "ttrabajo"; // Tabla donde se guardarán los datos

try {
    // Crear la conexión con la base de datos
    $mysqli = new mysqli($servername, $username, $password, $dbname);

    // Verificar si hubo algún error en la conexión
    if ($mysqli->connect_error) {
        throw new Exception("Conexión fallida: " . $mysqli->connect_error);
    }

    /******************************************************
     * Recepción y decodificación de los datos JSON
     ******************************************************/

    // Verificar que exista el parámetro rawRequest
    if (!isset($_REQUEST["rawRequest"])) {
        throw new Exception("Error: Falta el parámetro rawRequest.");
    }

    $fieldvalues = $_REQUEST["rawRequest"]; // Datos en formato JSON
    $obj = json_decode($fieldvalues, true); // Decodificar JSON a un arreglo asociativo

    if ($obj === null) {
        throw new Exception("Error: JSON inválido - " . json_last_error_msg());
    }

    // Verificar que exista el parámetro submissionID
    if (!isset($_REQUEST["submissionID"])) {
        throw new Exception("Error: Falta el parámetro submissionID.");
    }

    /******************************************************
     * Extracción y escape de los datos del JSON recibido
     ******************************************************/

    // Función para extraer y escapar datos de manera segura
    function getValueFromArray($array, $key, $subkey = null) {
        $mysqli = $GLOBALS['mysqli'];
        
        if ($subkey === null) {
            return isset($array[$key]) ? $mysqli->real_escape_string($array[$key]) : '';
        } else {
            return isset($array[$key][$subkey]) ? $mysqli->real_escape_string($array[$key][$subkey]) : '';
        }
    }

    $sid = $mysqli->real_escape_string($_REQUEST["submissionID"]);
    $titulo = getValueFromArray($obj, 'q3_titulo3');
    $archivo = getValueFromArray($obj, 'file');
    $consecutivo = getValueFromArray($obj, 'q16_codigoConsecutivo');
    $cod_tipo_competicion_propuesto = getValueFromArray($obj, 'q89_codigoTipo89');
    $cod_tipo_presentacion_propuesto = getValueFromArray($obj, 'q88_codigoTipo');
    $codigoIdiomaarea = getValueFromArray($obj, 'q109_codigoIdiomaarea109');
    $codigoAreaTematica = getValueFromArray($obj, 'q102_codigoIdiomaarea');
    $nombrecontacto = getValueFromArray($obj, 'q99_personaDe99', 'first');
    $apellidocontacto = getValueFromArray($obj, 'q99_personaDe99', 'last');
    $email = getValueFromArray($obj, 'q100_correoElectronico100');
    $introduccion = getValueFromArray($obj, 'q33_introduccion33');
    $metodos = getValueFromArray($obj, 'q34_metodos');
    $resultados = getValueFromArray($obj, 'q35_resultados');
    $conclusiones = getValueFromArray($obj, 'q36_conclusiones');
    $nroautores = getValueFromArray($obj, 'q12_numeroDe12');
    $pais = getValueFromArray($obj, 'q14_pais');
    $ciudad = getValueFromArray($obj, 'q15_estadociudad');

    // Autores e instituciones (10 campos)
    $titulo_autor1 = getValueFromArray($obj, 'q9_autor1ponente9', 'prefix');
    $autor1 = getValueFromArray($obj, 'q9_autor1ponente9', 'first');
    $apellido_autor1 = getValueFromArray($obj, 'q9_autor1ponente9', 'last');
    $email_autor1 = getValueFromArray($obj, 'q38_emailAutor38');
    $institucion1 = getValueFromArray($obj, 'q37_institucion');

    $titulo_autor2 = getValueFromArray($obj, 'q10_autor2', 'prefix');
    $autor2 = getValueFromArray($obj, 'q10_autor2', 'first');
    $apellido_autor2 = getValueFromArray($obj, 'q10_autor2', 'last');
    $email_autor2 = getValueFromArray($obj, 'q39_emailAutor39');
    $institucion2 = getValueFromArray($obj, 'q38_institucion');

    $titulo_autor3 = getValueFromArray($obj, 'q11_autor311', 'prefix');
    $autor3 = getValueFromArray($obj, 'q11_autor311', 'first');
    $apellido_autor3 = getValueFromArray($obj, 'q11_autor311', 'last');
    $email_autor3 = getValueFromArray($obj, 'q40_emailAutor40');
    $institucion3 = getValueFromArray($obj, 'q39_institucion');

    $titulo_autor4 = getValueFromArray($obj, 'q26_autor4', 'prefix');
    $autor4 = getValueFromArray($obj, 'q26_autor4', 'first');
    $apellido_autor4 = getValueFromArray($obj, 'q26_autor4', 'last');
    $email_autor4 = getValueFromArray($obj, 'q41_emailAutor');
    $institucion4 = getValueFromArray($obj, 'q40_institucion');

    $titulo_autor5 = getValueFromArray($obj, 'q27_autor5', 'prefix');
    $autor5 = getValueFromArray($obj, 'q27_autor5', 'first');
    $apellido_autor5 = getValueFromArray($obj, 'q27_autor5', 'last');
    $email_autor5 = getValueFromArray($obj, 'q42_emailAutor42');
    $institucion5 = getValueFromArray($obj, 'q41_institucion');

    $titulo_autor6 = getValueFromArray($obj, 'q28_autor6', 'prefix');
    $autor6 = getValueFromArray($obj, 'q28_autor6', 'first');
    $apellido_autor6 = getValueFromArray($obj, 'q28_autor6', 'last');
    $email_autor6 = getValueFromArray($obj, 'q43_emailAutor43');
    $institucion6 = getValueFromArray($obj, 'q42_institucion');

    $titulo_autor7 = getValueFromArray($obj, 'q29_autor7', 'prefix');
    $autor7 = getValueFromArray($obj, 'q29_autor7', 'first');
    $apellido_autor7 = getValueFromArray($obj, 'q29_autor7', 'last');
    $email_autor7 = getValueFromArray($obj, 'q44_emailAutor44');
    $institucion7 = getValueFromArray($obj, 'q43_institucion');

    $titulo_autor8 = getValueFromArray($obj, 'q30_autor8', 'prefix');
    $autor8 = getValueFromArray($obj, 'q30_autor8', 'first');
    $apellido_autor8 = getValueFromArray($obj, 'q30_autor8', 'last');
    $email_autor8 = getValueFromArray($obj, 'q45_emailAutor45');
    $institucion8 = getValueFromArray($obj, 'q44_institucion');

    $titulo_autor9 = getValueFromArray($obj, 'q31_autor931', 'prefix');
    $autor9 = getValueFromArray($obj, 'q31_autor931', 'first');
    $apellido_autor9 = getValueFromArray($obj, 'q31_autor931', 'last');
    $email_autor9 = getValueFromArray($obj, 'q46_emailAutor46');
    $institucion9 = getValueFromArray($obj, 'q45_institucion');

    $titulo_autor10 = getValueFromArray($obj, 'q32_autor10', 'prefix');
    $autor10 = getValueFromArray($obj, 'q32_autor10', 'first');
    $apellido_autor10 = getValueFromArray($obj, 'q32_autor10', 'last');
    $email_autor10 = getValueFromArray($obj, 'q47_emailAutor47');
    $institucion10 = getValueFromArray($obj, 'q46_institucion');

    /**Para generar el consecutivo completo**/
    $codigo = $codigoIdiomaarea.'-'.$consecutivo;

    /******************************************************
     * Verificación y actualización/inserción de datos
     ******************************************************/

    // Verificar si el registro ya existe
    $checkStmt = $mysqli->prepare("SELECT submission_id FROM $dbtable WHERE submission_id = ?");
    $checkStmt->bind_param("s", $sid);
    $checkStmt->execute();
    $result = $checkStmt->get_result();
    $checkStmt->close();

    if ($result->num_rows > 0) {
        // Actualizar los datos si ya existe
        logMessage("Actualizando registro con submission_id: $sid", "INFO");
        
        $updateQuery = "UPDATE $dbtable SET 
            titulo = ?, 
            archivo = ?, 
            consecutivo = ?, 
            cod_tipo_competicion_propuesto = ?, 
            cod_tipo_presentacion_propuesto = ?, 
            codigo = ?, 
            area_tematica = ?, 
            nombre_corresponsal = ?, 
            apellido_corresponsal = ?, 
            email = ?, 
            introduccion = ?, 
            metodos = ?, 
            resultados = ?, 
            conclusiones = ?, 
            nro_autores = ?, 
            pais = ?, 
            ciudad = ?, 
            autor1 = ?, apellido_autor1 = ?, inst_autor1 = ?, titulo_autor1 = ?, email_autor1 = ?, 
            autor2 = ?, apellido_autor2 = ?, inst_autor2 = ?, titulo_autor2 = ?, email_autor2 = ?, 
            autor3 = ?, apellido_autor3 = ?, inst_autor3 = ?, titulo_autor3 = ?, email_autor3 = ?, 
            autor4 = ?, apellido_autor4 = ?, inst_autor4 = ?, titulo_autor4 = ?, email_autor4 = ?, 
            autor5 = ?, apellido_autor5 = ?, inst_autor5 = ?, titulo_autor5 = ?, email_autor5 = ?, 
            autor6 = ?, apellido_autor6 = ?, inst_autor6 = ?, titulo_autor6 = ?, email_autor6 = ?, 
            autor7 = ?, apellido_autor7 = ?, inst_autor7 = ?, titulo_autor7 = ?, email_autor7 = ?, 
            autor8 = ?, apellido_autor8 = ?, inst_autor8 = ?, titulo_autor8 = ?, email_autor8 = ?, 
            autor9 = ?, apellido_autor9 = ?, inst_autor9 = ?, titulo_autor9 = ?, email_autor9 = ?, 
            autor10 = ?, apellido_autor10 = ?, inst_autor10 = ?, titulo_autor10 = ?, email_autor10 = ?
            WHERE submission_id = ?";

        $stmt = $mysqli->prepare($updateQuery);
        
        if (!$stmt) {
            throw new Exception("Error en la preparación de la consulta: " . $mysqli->error);
        }
        
        $stmt->bind_param("ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss", 
            $titulo, $archivo, $consecutivo, $cod_tipo_competicion_propuesto, 
            $cod_tipo_presentacion_propuesto, $codigo, $codigoAreaTematica, 
            $nombrecontacto, $apellidocontacto, $email, $introduccion, 
            $metodos, $resultados, $conclusiones, $nroautores, 
            $pais, $ciudad,
            $autor1, $apellido_autor1, $institucion1, $titulo_autor1, $email_autor1,
            $autor2, $apellido_autor2, $institucion2, $titulo_autor2, $email_autor2,
            $autor3, $apellido_autor3, $institucion3, $titulo_autor3, $email_autor3,
            $autor4, $apellido_autor4, $institucion4, $titulo_autor4, $email_autor4,
            $autor5, $apellido_autor5, $institucion5, $titulo_autor5, $email_autor5,
            $autor6, $apellido_autor6, $institucion6, $titulo_autor6, $email_autor6,
            $autor7, $apellido_autor7, $institucion7, $titulo_autor7, $email_autor7,
            $autor8, $apellido_autor8, $institucion8, $titulo_autor8, $email_autor8,
            $autor9, $apellido_autor9, $institucion9, $titulo_autor9, $email_autor9,
            $autor10, $apellido_autor10, $institucion10, $titulo_autor10, $email_autor10,
            $sid
        );
        
        if (!$stmt->execute()) {
            throw new Exception("Error al ejecutar la actualización: " . $stmt->error);
        }
        
        logMessage("Registro actualizado correctamente", "SUCCESS");
        $stmt->close();
        
    } else {
        // Insertar nuevos datos si no existe
        logMessage("Insertando nuevo registro con submission_id: $sid", "INFO");
        
        $insertQuery = "INSERT INTO $dbtable (
            submission_id, titulo, archivo, consecutivo, cod_tipo_competicion_propuesto, 
            cod_tipo_presentacion_propuesto, codigo, area_tematica, 
            nombre_corresponsal, apellido_corresponsal, email, introduccion, 
            metodos, resultados, conclusiones, nro_autores, 
            autor1, apellido_autor1, inst_autor1, titulo_autor1, email_autor1,
            autor2, apellido_autor2, inst_autor2, titulo_autor2, email_autor2,
            autor3, apellido_autor3, inst_autor3, titulo_autor3, email_autor3,
            autor4, apellido_autor4, inst_autor4, titulo_autor4, email_autor4,
            autor5, apellido_autor5, inst_autor5, titulo_autor5, email_autor5,
            autor6, apellido_autor6, inst_autor6, titulo_autor6, email_autor6,
            autor7, apellido_autor7, inst_autor7, titulo_autor7, email_autor7,
            autor8, apellido_autor8, inst_autor8, titulo_autor8, email_autor8,
            autor9, apellido_autor9, inst_autor9, titulo_autor9, email_autor9,
            autor10, apellido_autor10, inst_autor10, titulo_autor10, email_autor10,
            pais, ciudad
        ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
        
        $stmt = $mysqli->prepare($insertQuery);
        
        if (!$stmt) {
            throw new Exception("Error en la preparación de la consulta: " . $mysqli->error);
        }
        
        $stmt->bind_param("ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss", 
            $sid, $titulo, $archivo, $consecutivo, $cod_tipo_competicion_propuesto, 
            $cod_tipo_presentacion_propuesto, $codigo, $codigoAreaTematica, 
            $nombrecontacto, $apellidocontacto, $email, $introduccion, 
            $metodos, $resultados, $conclusiones, $nroautores, 
            $autor1, $apellido_autor1, $institucion1, $titulo_autor1, $email_autor1,
            $autor2, $apellido_autor2, $institucion2, $titulo_autor2, $email_autor2,
            $autor3, $apellido_autor3, $institucion3, $titulo_autor3, $email_autor3,
            $autor4, $apellido_autor4, $institucion4, $titulo_autor4, $email_autor4,
            $autor5, $apellido_autor5, $institucion5, $titulo_autor5, $email_autor5,
            $autor6, $apellido_autor6, $institucion6, $titulo_autor6, $email_autor6,
            $autor7, $apellido_autor7, $institucion7, $titulo_autor7, $email_autor7,
            $autor8, $apellido_autor8, $institucion8, $titulo_autor8, $email_autor8,
            $autor9, $apellido_autor9, $institucion9, $titulo_autor9, $email_autor9,
            $autor10, $apellido_autor10, $institucion10, $titulo_autor10, $email_autor10,
            $pais, $ciudad
        );
        
        if (!$stmt->execute()) {
            throw new Exception("Error al ejecutar la inserción: " . $stmt->error);
        }
        
        logMessage("Nuevo registro insertado correctamente", "SUCCESS");
        $stmt->close();
    }

    // Respuesta exitosa
    $response = [
        'status' => 'success',
        'message' => 'Operación completada con éxito',
        'submission_id' => $sid
    ];
    
    header('Content-Type: application/json');
    echo json_encode($response);

} catch (Exception $e) {
    // Registro del error
    logMessage($e->getMessage(), "ERROR");
    
    // Respuesta de error
    $response = [
        'status' => 'error',
        'message' => $e->getMessage()
    ];
    
    header('Content-Type: application/json');
    http_response_code(500);
    echo json_encode($response);
} finally {
    // Cerrar conexión si existe
    if (isset($mysqli) && $mysqli instanceof mysqli) {
        $mysqli->close();
    }
}
?>