<?php 
error_reporting(E_ALL & ~E_NOTICE); 
extract($_REQUEST, EXTR_PREFIX_ALL, "P");
extract($_REQUEST, EXTR_PREFIX_ALL, "G");

// Start session at the beginning of the file
session_start();
error_reporting(E_ALL & ~E_NOTICE); 
require_once 'utils_database.php';
require_once 'abstract_scientific.php';
require_once 'certificate_generator.php';
require 'vendor/autoload.php';
require_once "session_check.php";

// Extract request variables with prefix
$prefix = "P";
foreach ($_REQUEST as $key => $value) {
    $varname = $prefix . '_' . $key;
    $$varname = $value;
}


?>


<?php
// Incluimos el archivo de utilidades de la base de datos


// Verificamos si hay una solicitud de exportación
$export = isset($_GET['export']) ? $_GET['export'] : '';


/**
 * Función para exportar datos a Excel usando PhpSpreadsheet
 * 
 * @param array $trabajos Lista de trabajos a exportar
 * @param array $trabajosPorPais Trabajos agrupados por país
 * @param array $mejoresTrabajos Los 3 mejores trabajos
 * @param int $totalTrabajos Total de trabajos
 * @param float $promedioGeneral Promedio general de calificaciones
 * @param array $cantidadPorPais Cantidad de trabajos por país
 * 
 */
 
 /**
 * Función para exportar datos a Excel con formato mejorado para informe detallado por competiciones
 * 
 * @param array $tipos_competicion Tipos de competición disponibles
 * @param array $tipos_presentacion Tipos de presentación disponibles
 * @param array $evaluadores Lista de evaluadores
 */
/**
 * Función para exportar datos a Excel con formato mejorado para informe detallado por competiciones
 * 
 * @param array $tipos_competicion Tipos de competición disponibles
 * @param array $tipos_presentacion Tipos de presentación disponibles
 * @param array $evaluadores Lista de evaluadores
 */
/**
 * Función para exportar datos a Excel con formato mejorado para informe detallado por competiciones
 * 
 * @param array $tipos_competicion Tipos de competición disponibles
 * @param array $tipos_presentacion Tipos de presentación disponibles
 * @param array $evaluadores Lista de evaluadores
 */
function exportarExcelDetalladoPorCompeticiones($tipos_competicion, $tipos_presentacion, $evaluadores) {
    // Evitar cualquier salida previa que pueda corromper el archivo
    if (ob_get_length()) ob_end_clean();
    
    // Configurar límites para manejar archivos grandes
    ini_set('memory_limit', '1024M'); // Aumentar límite de memoria
    set_time_limit(600); // 10 minutos de tiempo de ejecución
    
    // Iniciar buffer de salida limpio
    ob_start();
    
    try {
        // Verificar que las clases de PhpSpreadsheet estén disponibles
        if (!class_exists('\\PhpOffice\\PhpSpreadsheet\\Spreadsheet')) {
            throw new Exception('Excel library is missing');
        }
        
        // Crear el objeto Spreadsheet con configuración optimizada
        $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
        $spreadsheet->getProperties()
            ->setCreator('Dashboard Resúmenes Científicos')
            ->setLastModifiedBy('Sistema de Evaluación')
            ->setTitle('Informe Detallado por Competiciones')
            ->setSubject('Reporte Detallado de Trabajos por Competición');
        
        // Crear conexión a la base de datos
        $conn = Activarmysql();
        if (!$conn) {
            throw new Exception('Error de conexión a la base de datos');
        }
        
        // Definir estilos globales (manteniendo los mismos estilos que tenías)
        $headerStyle = [
            'font' => [
                'bold' => true,
                'color' => ['rgb' => 'FFFFFF'],
                'size' => 12,
            ],
            'fill' => [
                'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID,
                'startColor' => ['rgb' => '2C3E50'],
            ],
            'alignment' => [
                'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
                'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER,
            ],
            'borders' => [
                'allBorders' => [
                    'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
                    'color' => ['rgb' => '9AA0A7'],
                ],
            ],
        ];
        
        $subHeaderStyle = [
            'font' => [
                'bold' => true,
                'color' => ['rgb' => 'FFFFFF'],
                'size' => 11,
            ],
            'fill' => [
                'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID,
                'startColor' => ['rgb' => '34495E'],
            ],
            'alignment' => [
                'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
                'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER,
            ],
            'borders' => [
                'allBorders' => [
                    'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
                    'color' => ['rgb' => '9AA0A7'],
                ],
            ],
        ];
        
        $titleStyle = [
            'font' => [
                'bold' => true,
                'size' => 16,
                'color' => ['rgb' => '2C3E50'],
            ],
            'alignment' => [
                'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
            ],
        ];
        
        $subtitleStyle = [
            'font' => [
                'bold' => true,
                'size' => 14,
                'color' => ['rgb' => '34495E'],
            ],
            'alignment' => [
                'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
            ],
        ];
        
        $dataRowStyle = [
            'borders' => [
                'allBorders' => [
                    'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
                    'color' => ['rgb' => 'D5DBDB'],
                ],
            ],
        ];
        
        // Estilos para calificaciones
        $calificacionExcelente = [
            'font' => ['bold' => true, 'color' => ['rgb' => 'FFFFFF']],
            'fill' => ['fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID, 'startColor' => ['rgb' => '2ECC71']],
            'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER],
        ];
        
        $calificacionBueno = [
            'font' => ['bold' => true, 'color' => ['rgb' => 'FFFFFF']],
            'fill' => ['fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID, 'startColor' => ['rgb' => '3498DB']],
            'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER],
        ];
        
        $calificacionRegular = [
            'font' => ['bold' => true, 'color' => ['rgb' => 'FFFFFF']],
            'fill' => ['fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID, 'startColor' => ['rgb' => 'F39C12']],
            'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER],
        ];
        
        $calificacionDeficiente = [
            'font' => ['bold' => true, 'color' => ['rgb' => 'FFFFFF']],
            'fill' => ['fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID, 'startColor' => ['rgb' => 'E74C3C']],
            'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER],
        ];
        
        // Paletas de colores optimizadas (reduciendo la cantidad para evitar problemas)
        $paisColores = [
            'E3F2FD', 'BBDEFB', '90CAF9', '64B5F6', '42A5F5', // Azules
            'E8F5E9', 'C8E6C9', 'A5D6A7', '81C784', '66BB6A', // Verdes
            'FFF3E0', 'FFE0B2', 'FFCC80', 'FFB74D', 'FFA726', // Naranjas
            'F3E5F5', 'E1BEE7', 'CE93D8', 'BA68C8', 'AB47BC', // Morados
        ];
        
        $tipoPresentacionColores = [
            'FFEBEE', 'FFCDD2', 'EF9A9A', 'E57373', 'EF5350', // Rojos
            'FCE4EC', 'F8BBD0', 'F48FB1', 'F06292', 'EC407A', // Rosas
            'F3E5F5', 'E1BEE7', 'CE93D8', 'BA68C8', 'AB47BC', // Morados
        ];
        
        $evaluadorColores = [
            'E0F2F1', 'B2DFDB', '80CBC4', '4DB6AC', '26A69A', // Verde azulado
            'E0F7FA', 'B2EBF2', '80DEEA', '4DD0E1', '26C6DA', // Cian
            'E1F5FE', 'B3E5FC', '81D4FA', '4FC3F7', '29B6F6', // Azul claro
        ];
        
        $areaColores = [
            'FFF9C4', 'FFF59D', 'FFF176', 'FFEE58', 'FFEB3B', // Amarillos
            'DCEDC8', 'C5E1A5', 'AED581', '9CCC65', '8BC34A', // Verde lima
            'FFE0B2', 'FFCC80', 'FFB74D', 'FFA726', 'FF9800', // Naranja
            'D1C4E9', 'B39DDB', '9575CD', '7E57C2', '673AB7'  // Violeta
        ];
        
        // Crear una hoja resumen
        $resumenSheet = $spreadsheet->getActiveSheet();
        $resumenSheet->setTitle('Resumen General');
        
        // Título del informe en la hoja resumen
        $resumenSheet->setCellValue('A1', 'INFORME DETALLADO POR COMPETICIONES');
        $resumenSheet->mergeCells('A1:G1');
        $resumenSheet->getStyle('A1')->applyFromArray($titleStyle);
        
        $resumenSheet->setCellValue('A2', 'Reporte completo de trabajos evaluados por tipo de competición');
        $resumenSheet->mergeCells('A2:G2');
        $resumenSheet->getStyle('A2')->applyFromArray($subtitleStyle);
        
        $resumenSheet->setCellValue('A3', 'Fecha de generación: ' . date('d/m/Y H:i:s'));
        $resumenSheet->mergeCells('A3:G3');
        
        // Tabla resumen de competiciones
        $resumenSheet->setCellValue('A5', 'RESUMEN DE COMPETICIONES');
        $resumenSheet->mergeCells('A5:G5');
        $resumenSheet->getStyle('A5')->applyFromArray($subtitleStyle);
        
        // Encabezados para la tabla de resumen
        $resumenSheet->setCellValue('A7', 'CÓDIGO');
        $resumenSheet->setCellValue('B7', 'TIPO DE COMPETICIÓN');
        $resumenSheet->setCellValue('C7', 'TOTAL TRABAJOS');
        $resumenSheet->setCellValue('D7', 'PAÍSES REPRESENTADOS');
        $resumenSheet->setCellValue('E7', 'CALIFICACIÓN PROMEDIO');
        $resumenSheet->setCellValue('F7', 'MEJOR TRABAJO');
        $resumenSheet->setCellValue('G7', 'CALIFICACIÓN');
        
        $resumenSheet->getStyle('A7:G7')->applyFromArray($headerStyle);
        
        // Contador de fila para resumen
        $resumenRow = 8;
        
        // Contador para el total general
        $totalTrabajos = 0;
        $sumaPuntajes = 0;
        
        // Limitar la cantidad de tipos de competición a procesar para evitar corrupción
        $maxSheets = 10; // Reducido de 30 a 10 para evitar problemas
        $sheetCount = 0;
        
        // Procesar cada tipo de competición
        $competicionIndex = 0;
        $codigos_procesados = []; // Para evitar duplicados
        
        foreach ($tipos_competicion as $codigo => $tipo) {
            // Evitar procesar el mismo código más de una vez
            if (in_array($codigo, $codigos_procesados)) {
                continue;
            }
            $codigos_procesados[] = $codigo;
            
            // Limitar el número de hojas
            if ($sheetCount >= $maxSheets) {
                // Agregar mensaje en resumen sobre el límite
                $resumenSheet->setCellValue('A' . ($resumenRow + 2), "AVISO: Se ha limitado el informe a {$maxSheets} tipos de competición para garantizar la integridad del archivo.");
                $resumenSheet->mergeCells('A' . ($resumenRow + 2) . ':G' . ($resumenRow + 2));
                break;
            }
            
            try {
                // Consulta SQL optimizada
                $sql = "SELECT 
                        t.id,
                        t.codigo,
                        t.cod_tipo_competicion_propuesto,
                        t.cod_tipo_presentacion_propuesto,
                        t.cod_tipo_presentacion_aprobado,
                        t.titulo,
                        t.pais,
                        t.inst_autor1 AS institucion,
                        t.evaluador1,
                        t.evaluador2,
                        t.evaluador3,
                        t.area_tematica AS cod_area_tematica,
                        t.nro_autores,
                        t.email,
                        t.nombre_corresponsal,
                        t.apellido_corresponsal,
                        t.titulo_autor1,
                        t.apellido_autor1,
                        t.autor1,
                        t.titulo_autor2,
                        t.apellido_autor2,
                        t.autor2,
                        t.titulo_autor3,
                        t.apellido_autor3,
                        t.autor3,
                        t.titulo_autor4,
                        t.apellido_autor4,
                        t.autor4,
                        t.titulo_autor5,
                        t.apellido_autor5,
                        t.autor5,
                        t.titulo_autor6,
                        t.apellido_autor6,
                        t.autor6,
                        a.descripcion AS area_tematica,
                        (t.calificacion1_1 + t.calificacion1_2 + t.calificacion1_3 + 
                         t.calificacion1_4 + t.calificacion1_5 + t.calificacion1_6) AS calificacion_evaluador1,
                        (t.calificacion2_1 + t.calificacion2_2 + t.calificacion2_3 + 
                         t.calificacion2_4 + t.calificacion2_5 + t.calificacion2_6) AS calificacion_evaluador2,
                        (t.calificacion3_1 + t.calificacion3_2 + t.calificacion3_3 + 
                         t.calificacion3_4 + t.calificacion3_5 + t.calificacion3_6) AS calificacion_evaluador3,
                        ROUND(
                            (
                                (t.calificacion1_1 + t.calificacion1_2 + t.calificacion1_3 + 
                                 t.calificacion1_4 + t.calificacion1_5 + t.calificacion1_6) +
                                (t.calificacion2_1 + t.calificacion2_2 + t.calificacion2_3 + 
                                 t.calificacion2_4 + t.calificacion2_5 + t.calificacion2_6) +
                                (t.calificacion3_1 + t.calificacion3_2 + t.calificacion3_3 + 
                                 t.calificacion3_4 + t.calificacion3_5 + t.calificacion3_6)
                            ) / 3, 2
                        ) AS promedio_calificacion
                    FROM 
                        ttrabajo t
                    LEFT JOIN 
                        tarea a ON t.area_tematica = a.codigo
                    WHERE 
                        t.cod_tipo_competicion_propuesto = ?
                        AND t.calificacion1_fecha IS NOT NULL
                        AND t.calificacion2_fecha IS NOT NULL
                        AND t.calificacion3_fecha IS NOT NULL
                    ORDER BY 
                        promedio_calificacion DESC, pais ASC
                    LIMIT 300"; // Limitar a 300 registros por tipo de competición
                
                $stmt = $conn->prepare($sql);
                $stmt->bind_param("s", $codigo);
                $stmt->execute();
                $result = $stmt->get_result();
                
                $trabajos = [];
                $paises = [];
                $sumaCalificaciones = 0;
                $mejorTrabajo = null;
                $mejorCalificacion = 0;
                
                if ($result->num_rows > 0) {
                    while($row = $result->fetch_assoc()) {
                        $trabajos[] = $row;
                        
                        // Contabilizar países únicos
                        if (!in_array($row['pais'], $paises)) {
                            $paises[] = $row['pais'];
                        }
                        
                        // Sumar calificaciones para promedio
                        $sumaCalificaciones += floatval($row['promedio_calificacion']);
                        
                        // Verificar si es el mejor trabajo
                        if (floatval($row['promedio_calificacion']) > $mejorCalificacion) {
                            $mejorCalificacion = floatval($row['promedio_calificacion']);
                            $mejorTrabajo = $row;
                        }
                    }
                }
                
                $cantidadTrabajos = count($trabajos);
                $totalTrabajos += $cantidadTrabajos;
                $sumaPuntajes += $sumaCalificaciones;
                
                // Si no hay trabajos para esta competición, continuar con la siguiente
                if ($cantidadTrabajos == 0) {
                    $stmt->close();
                    continue;
                }
                
                // Calcular promedio de calificaciones
                $promedioCalificacion = ($cantidadTrabajos > 0) ? number_format($sumaCalificaciones / $cantidadTrabajos, 2) : 0;
                
                // Llenar la fila en la tabla resumen
                $resumenSheet->setCellValue('A' . $resumenRow, $codigo);
                $resumenSheet->setCellValue('B' . $resumenRow, $tipo['nombre']);
                $resumenSheet->setCellValue('C' . $resumenRow, $cantidadTrabajos);
                $resumenSheet->setCellValue('D' . $resumenRow, count($paises));
                $resumenSheet->setCellValue('E' . $resumenRow, $promedioCalificacion);
                
                // Información del mejor trabajo si existe
                if ($mejorTrabajo) {
                    // Truncar título para evitar exceder límites de celda
                    $tituloCorto = (strlen($mejorTrabajo['titulo']) > 30) ? 
                        mb_substr($mejorTrabajo['titulo'], 0, 30, 'UTF-8') . '...' : 
                        $mejorTrabajo['titulo'];
                    
                    $resumenSheet->setCellValue('F' . $resumenRow, $mejorTrabajo['codigo'] . ': ' . $tituloCorto);
                    $resumenSheet->setCellValue('G' . $resumenRow, $mejorTrabajo['promedio_calificacion']);
                } else {
                    $resumenSheet->setCellValue('F' . $resumenRow, 'N/A');
                    $resumenSheet->setCellValue('G' . $resumenRow, 'N/A');
                }
                
                // Aplicar estilo alternado a las filas
                if ($competicionIndex % 2 == 0) {
                    $resumenSheet->getStyle('A' . $resumenRow . ':G' . $resumenRow)->getFill()
                        ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
                        ->getStartColor()->setRGB('F9F9F9');
                }
                
                $resumenSheet->getStyle('A' . $resumenRow . ':G' . $resumenRow)->applyFromArray($dataRowStyle);
                $resumenSheet->getStyle('G' . $resumenRow)->getNumberFormat()->setFormatCode('0.00');
                
                // Incrementar contador de fila
                $resumenRow++;
                $competicionIndex++;
                
                // Sanitizar el nombre de la hoja
                $sheetName = sanitizeSheetName($tipo['nombre']);
                
                // Crear una hoja para cada tipo de competición
                $sheet = new \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet($spreadsheet, $sheetName);
                $spreadsheet->addSheet($sheet);
                $sheetCount++;
                
                // Título de la hoja
                $sheet->setCellValue('A1', 'COMPETICIÓN: ' . strtoupper($tipo['nombre']));
                $sheet->mergeCells('A1:R1'); // Ajustado para incluir todas las columnas
                $sheet->getStyle('A1')->applyFromArray($titleStyle);
                
                $sheet->setCellValue('A2', 'Código de competición: ' . $codigo);
                $sheet->mergeCells('A2:R2'); // Ajustado para incluir todas las columnas
                $sheet->getStyle('A2')->applyFromArray($subtitleStyle);
                
                $sheet->setCellValue('A3', 'Total de trabajos: ' . $cantidadTrabajos . ' | Países: ' . count($paises) . ' | Promedio: ' . $promedioCalificacion);
                $sheet->mergeCells('A3:R3'); // Ajustado para incluir todas las columnas
                
                // Encabezados de las columnas con las nuevas columnas añadidas
                $sheet->setCellValue('A5', 'CÓDIGO');
                $sheet->setCellValue('B5', 'TÍTULO');
                $sheet->setCellValue('C5', 'PAÍS');
                $sheet->setCellValue('D5', 'INSTITUCIÓN');
                $sheet->setCellValue('E5', 'TIPO COMPETICIÓN');
                $sheet->setCellValue('F5', 'TIPO PRESENTACIÓN');
                $sheet->setCellValue('G5', 'PRESENTADOR');
                $sheet->setCellValue('H5', 'EMAIL');
                $sheet->setCellValue('I5', 'NRO. AUTORES');
                $sheet->setCellValue('J5', 'TODOS LOS AUTORES'); // Añadida
                $sheet->setCellValue('K5', 'ÁREA TEMÁTICA');
                $sheet->setCellValue('L5', 'EVALUADOR 1');
                $sheet->setCellValue('M5', 'CALIF. 1');
                $sheet->setCellValue('N5', 'EVALUADOR 2');
                $sheet->setCellValue('O5', 'CALIF. 2');
                $sheet->setCellValue('P5', 'EVALUADOR 3');
                $sheet->setCellValue('Q5', 'CALIF. 3');
                $sheet->setCellValue('R5', 'PROMEDIO');
                
                $sheet->getStyle('A5:R5')->applyFromArray($headerStyle);
                
                // Establecer filtros para la tabla
                $sheet->setAutoFilter('A5:Q5');
                
                // Ajustar alto de la fila de encabezados
                $sheet->getRowDimension(5)->setRowHeight(30);
                
                // Almacenar información para colorear después
                $paisesEncontrados = [];
                $tiposPresentacionEncontrados = [];
                $evaluadoresEncontrados = [];
                $areasEncontradas = [];
                $filaPorPais = [];
                $filaPorTipoPresentacion = [];
                $filaPorEvaluador1 = [];
                $filaPorEvaluador2 = [];
                $filaPorEvaluador3 = []; // Añadida
                $filaPorArea = [];
                
                // Limitar la cantidad de filas por hoja para evitar sobrecarga
                $maxFilasPorHoja = 300; // Reducido de 1000 a 300
                $trabajosCount = count($trabajos);
                $trabajosProcesados = min($trabajosCount, $maxFilasPorHoja);
                
                if ($trabajosCount > $maxFilasPorHoja) {
                    $sheet->setCellValue('A4', "AVISO: Se muestran solo los primeros {$maxFilasPorHoja} trabajos de un total de {$trabajosCount} para evitar problemas de rendimiento.");
                    $sheet->mergeCells('A4:R4'); // Ajustado para incluir todas las columnas
                }
                
                // Llenar la tabla con los trabajos
                $row = 6;
                $startDataRow = $row; // Guardar la primera fila de datos para aplicar estilos después
                
                for ($i = 0; $i < $trabajosProcesados; $i++) {
                    $trabajo = $trabajos[$i];
                    
                    // Preparar el tipo de presentación
                    $tipoPresentacion = "No definido";
                    if (!empty($trabajo['cod_tipo_presentacion_aprobado']) && isset($tipos_presentacion[$trabajo['cod_tipo_presentacion_aprobado']])) {
                        $tipoPresentacion = $tipos_presentacion[$trabajo['cod_tipo_presentacion_aprobado']]['nombre'];
                    } else if (!empty($trabajo['cod_tipo_presentacion_propuesto']) && isset($tipos_presentacion[$trabajo['cod_tipo_presentacion_propuesto']])) {
                        $tipoPresentacion = $tipos_presentacion[$trabajo['cod_tipo_presentacion_propuesto']]['nombre'];
                    }
                    
                    // Nombres de evaluadores
                    $evaluador1 = isset($evaluadores[$trabajo['evaluador1']]) ? $evaluadores[$trabajo['evaluador1']] : "No asignado";
                    $evaluador2 = isset($evaluadores[$trabajo['evaluador2']]) ? $evaluadores[$trabajo['evaluador2']] : "No asignado";
                    $evaluador3 = isset($evaluadores[$trabajo['evaluador3']]) ? $evaluadores[$trabajo['evaluador3']] : "No asignado"; // Añadido
                    
                    // Calificaciones
                    $calif1 = $trabajo['calificacion_evaluador1'];
                    $calif2 = $trabajo['calificacion_evaluador2'];
                    $calif3 = $trabajo['calificacion_evaluador3']; // Añadida
                    $promedio = $trabajo['promedio_calificacion'];
                    
                    // Sanitizar textos para evitar problemas de codificación
                    $tituloTrabajo = sanitizeText($trabajo['titulo']);
                    $institucion = sanitizeText($trabajo['institucion']);
                    
                    // Preparar el nombre del presentador/corresponsal
                    $nombre = sanitizeText($trabajo['nombre_corresponsal']);
                    $apellido = sanitizeText($trabajo['apellido_corresponsal']);
                    $presentador = trim($nombre . ' ' . $apellido);
                    
                    // Verificar el área temática y proporcionar un valor por defecto si es necesario
                    $areaDescripcion = !empty($trabajo['area_tematica']) ? sanitizeText($trabajo['area_tematica']) : 'NO ESPECIFICADA';
                    
                    // Generar la lista de todos los autores
                    $autores = [];
                    for ($j = 1; $j <= 10; $j++) {
                        if (!empty($trabajo["titulo_autor{$j}"]) || !empty($trabajo["autor{$j}"]) || !empty($trabajo["apellido_autor{$j}"])) {
                            $nombre = sanitizeText($trabajo["autor{$j}"]);
                            $apellido = sanitizeText($trabajo["apellido_autor{$j}"]);
                            $tituloAutor = sanitizeText($trabajo["titulo_autor{$j}"]);
                            
                            $autorCompleto = trim($tituloAutor . ' ' . $nombre . ' ' . $apellido);
                            if (!empty($autorCompleto)) {
                                $autores[] = $autorCompleto;
                            }
                        }
                    }
                    $todosAutores = implode(", ", $autores);
                    
                    // Limitar longitud para evitar desbordamientos
                    $todosAutores = mb_substr($todosAutores, 0, 32000, 'UTF-8');
                    
                    // Convertir a mayúsculas los campos solicitados
                    $tituloTrabajo = strtoupper($tituloTrabajo);
                    $institucion = strtoupper($institucion);
                    $areaDescripcion = strtoupper($areaDescripcion);
                    
                    // Llenar datos con las columnas actualizadas
                    $sheet->setCellValue('A' . $row, $trabajo['codigo']);
                    $sheet->setCellValue('B' . $row, $tituloTrabajo);
                    $sheet->setCellValue('C' . $row, $trabajo['pais']);
                    $sheet->setCellValue('D' . $row, $institucion);
                    $sheet->setCellValue('E' . $row, $tipo['nombre']); // Tipo de competición
                    $sheet->setCellValue('F' . $row, $tipoPresentacion);
                    $sheet->setCellValue('G' . $row, $presentador);
                    $sheet->setCellValue('H' . $row, $trabajo['email']);
                    $sheet->setCellValue('I' . $row, $trabajo['nro_autores']);
                    $sheet->setCellValue('J' . $row, $todosAutores); // Todos los autores
                    $sheet->setCellValue('K' . $row, $areaDescripcion);
                    $sheet->setCellValue('L' . $row, $evaluador1);
                    $sheet->setCellValue('M' . $row, $calif1);
                    $sheet->setCellValue('N' . $row, $evaluador2);
                    $sheet->setCellValue('O' . $row, $calif2);
                    $sheet->setCellValue('P' . $row, $evaluador3); // Evaluador 3
                    $sheet->setCellValue('Q' . $row, $calif3); // Calificación 3
                    $sheet->setCellValue('R' . $row, $promedio);
                    
                    // Aplicar formato de número para calificaciones
                    $sheet->getStyle('M' . $row)->getNumberFormat()->setFormatCode('0.00');
                    $sheet->getStyle('O' . $row)->getNumberFormat()->setFormatCode('0.00');
                    $sheet->getStyle('Q' . $row)->getNumberFormat()->setFormatCode('0.00'); // Para calificación 3
                    $sheet->getStyle('R' . $row)->getNumberFormat()->setFormatCode('0.00');
                    
                    // Aplicar estilo a la calificación promedio según su valor
                    $calificacion = floatval($promedio);
                    if ($calificacion >= 90) {
                        $sheet->getStyle('R' . $row)->applyFromArray($calificacionExcelente);
                    } elseif ($calificacion >= 75) {
                        $sheet->getStyle('R' . $row)->applyFromArray($calificacionBueno);
                    } elseif ($calificacion >= 60) {
                        $sheet->getStyle('R' . $row)->applyFromArray($calificacionRegular);
                    } else {
                        $sheet->getStyle('R' . $row)->applyFromArray($calificacionDeficiente);
                    }
                    
                    // Aplicar bordes a toda la fila
                    $sheet->getStyle('A' . $row . ':R' . $row)->applyFromArray($dataRowStyle);
                    
                    // Almacenar información para colorear después
                    
                    // Para países
                    if (!isset($paisesEncontrados[$trabajo['pais']])) {
                        $paisesEncontrados[$trabajo['pais']] = count($paisesEncontrados) % count($paisColores);
                    }
                    $filaPorPais[$row] = $trabajo['pais'];
                    
                    // Para tipos de presentación
                    if (!isset($tiposPresentacionEncontrados[$tipoPresentacion])) {
                        $tiposPresentacionEncontrados[$tipoPresentacion] = count($tiposPresentacionEncontrados) % count($tipoPresentacionColores);
                    }
                    $filaPorTipoPresentacion[$row] = $tipoPresentacion;
                    
                    // Para evaluadores
                    if ($evaluador1 != "No asignado") {
                        if (!isset($evaluadoresEncontrados[$evaluador1])) {
                            $evaluadoresEncontrados[$evaluador1] = count($evaluadoresEncontrados) % count($evaluadorColores);
                        }
                        $filaPorEvaluador1[$row] = $evaluador1;
                    }
                    
                    if ($evaluador2 != "No asignado") {
                        if (!isset($evaluadoresEncontrados[$evaluador2])) {
                            $evaluadoresEncontrados[$evaluador2] = count($evaluadoresEncontrados) % count($evaluadorColores);
                        }
                        $filaPorEvaluador2[$row] = $evaluador2;
                    }
                    
                    if ($evaluador3 != "No asignado") {
                        if (!isset($evaluadoresEncontrados[$evaluador3])) {
                            $evaluadoresEncontrados[$evaluador3] = count($evaluadoresEncontrados) % count($evaluadorColores);
                        }
                        $filaPorEvaluador3[$row] = $evaluador3;
                    }
                    
                    // Para áreas temáticas
                    if (!empty($areaDescripcion) && $areaDescripcion != "NO ESPECIFICADA") {
                        if (!isset($areasEncontradas[$areaDescripcion])) {
                            $areasEncontradas[$areaDescripcion] = count($areasEncontradas) % count($areaColores);
                        }
                        $filaPorArea[$row] = $areaDescripcion;
                    }
                    
                    // Incrementar la fila
                    $row++;
                    
                    // Liberar memoria periódicamente
                    if ($row % 50 == 0) {
                        gc_collect_cycles();
                    }
                }
                
                // Aplicar colores a los elementos de manera eficiente
                // Colorear países
                foreach ($filaPorPais as $fila => $pais) {
                    try {
                        $colorIndex = $paisesEncontrados[$pais];
                        $colorCode = $paisColores[$colorIndex];
                        
                        $sheet->getStyle('C' . $fila)->getFill()
                            ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
                            ->getStartColor()->setRGB($colorCode);
                    } catch (Exception $e) {
                        // Ignorar errores de estilo
                        continue;
                    }
                }
                
                // Colorear tipos de presentación
                foreach ($filaPorTipoPresentacion as $fila => $tipo) {
                    try {
                        $colorIndex = $tiposPresentacionEncontrados[$tipo];
                        $colorCode = $tipoPresentacionColores[$colorIndex];
                        
                        $sheet->getStyle('F' . $fila)->getFill()
                            ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
                            ->getStartColor()->setRGB($colorCode);
                    } catch (Exception $e) {
                        continue;
                    }
                }
                
                // Colorear evaluadores
                foreach ($filaPorEvaluador1 as $fila => $evaluador) {
                    try {
                        $colorIndex = $evaluadoresEncontrados[$evaluador];
                        $colorCode = $evaluadorColores[$colorIndex];
                        
                        $sheet->getStyle('L' . $fila)->getFill()
                            ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
                            ->getStartColor()->setRGB($colorCode);
                    } catch (Exception $e) {
                        continue;
                    }
                }
                
                foreach ($filaPorEvaluador2 as $fila => $evaluador) {
                    try {
                        $colorIndex = $evaluadoresEncontrados[$evaluador];
                        $colorCode = $evaluadorColores[$colorIndex];
                        
                        $sheet->getStyle('N' . $fila)->getFill()
                            ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
                            ->getStartColor()->setRGB($colorCode);
                    } catch (Exception $e) {
                        continue;
                    }
                }
                
                foreach ($filaPorEvaluador3 as $fila => $evaluador) {
                    try {
                        $colorIndex = $evaluadoresEncontrados[$evaluador];
                        $colorCode = $evaluadorColores[$colorIndex];
                        
                        $sheet->getStyle('P' . $fila)->getFill()
                            ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
                            ->getStartColor()->setRGB($colorCode);
                    } catch (Exception $e) {
                        continue;
                    }
                }
                
                // Colorear áreas temáticas
                foreach ($filaPorArea as $fila => $area) {
                    try {
                        $colorIndex = $areasEncontradas[$area];
                        $colorCode = $areaColores[$colorIndex];
                        
                        $sheet->getStyle('K' . $fila)->getFill()
                            ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
                            ->getStartColor()->setRGB($colorCode);
                    } catch (Exception $e) {
                        continue;
                    }
                }
                
                // Colorear tipo competición (misma fila, mismo color)
                foreach ($filaPorPais as $fila => $pais) {
                    try {
                        // Usar un color constante para el tipo de competición en esta hoja
                        $sheet->getStyle('E' . $fila)->getFill()
                            ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
                            ->getStartColor()->setRGB('D6EAF8'); // Azul claro constante
                    } catch (Exception $e) {
                        continue;
                    }
                }
                
                // Ajustar el ancho de las columnas
                $sheet->getColumnDimension('A')->setWidth(15);      // Código
                $sheet->getColumnDimension('B')->setWidth(40);      // Título
                $sheet->getColumnDimension('C')->setWidth(15);      // País
                $sheet->getColumnDimension('D')->setWidth(25);      // Institución
                $sheet->getColumnDimension('E')->setWidth(20);      // Tipo Competición
                $sheet->getColumnDimension('F')->setWidth(20);      // Tipo Presentación
                $sheet->getColumnDimension('G')->setWidth(20);      // Presentador
                $sheet->getColumnDimension('H')->setWidth(25);      // Email
                $sheet->getColumnDimension('I')->setWidth(10);      // Nro. Autores
                $sheet->getColumnDimension('J')->setWidth(40);      // Todos los Autores
                $sheet->getColumnDimension('K')->setWidth(20);      // Área Temática
                $sheet->getColumnDimension('L')->setWidth(20);      // Evaluador 1
                $sheet->getColumnDimension('M')->setWidth(10);      // Calif. 1
                $sheet->getColumnDimension('N')->setWidth(20);      // Evaluador 2
                $sheet->getColumnDimension('O')->setWidth(10);      // Calif. 2
                $sheet->getColumnDimension('P')->setWidth(20);      // Evaluador 3
                $sheet->getColumnDimension('Q')->setWidth(10);      // Calif. 3
                $sheet->getColumnDimension('R')->setWidth(12);      // Promedio
                
                // Inmovilizar paneles para facilitar navegación
                $sheet->freezePane('A6');
                
                // Agregar estilo de negrita para los títulos, instituciones, tipo competición y áreas temáticas
                $boldRanges = ['B' . $startDataRow . ':B' . $row, 'D' . $startDataRow . ':D' . $row, 'E' . $startDataRow . ':E' . $row, 'K' . $startDataRow . ':K' . $row];
                foreach ($boldRanges as $range) {
                    $sheet->getStyle($range)->getFont()->setBold(true);
                }
                
                // Liberar memoria después de cada hoja
                $stmt->close();
                unset($trabajos);
                unset($paises);
                gc_collect_cycles();
                
            } catch (Exception $e) {
                // Registrar error y continuar con el siguiente tipo de competición
                error_log("Error procesando competición {$codigo}: " . $e->getMessage());
                continue;
            }
        }
        
        // Agregar fila de totales en la hoja resumen
        $resumenSheet->setCellValue('A' . $resumenRow, 'TOTAL');
        $resumenSheet->setCellValue('B' . $resumenRow, $competicionIndex . ' competiciones');
        $resumenSheet->setCellValue('C' . $resumenRow, $totalTrabajos);
        
        // Calcular promedio general
        $promedioGeneral = ($totalTrabajos > 0) ? number_format($sumaPuntajes / $totalTrabajos, 2) : 0;
        $resumenSheet->setCellValue('E' . $resumenRow, $promedioGeneral);
        
        // Aplicar estilo a la fila de totales
        $resumenSheet->getStyle('A' . $resumenRow . ':G' . $resumenRow)->applyFromArray($subHeaderStyle);
        $resumenSheet->getStyle('E' . $resumenRow)->getNumberFormat()->setFormatCode('0.00');
        
        // Ajustar ancho de columnas en la hoja resumen
        $resumenSheet->getColumnDimension('A')->setWidth(15);  // Código
        $resumenSheet->getColumnDimension('B')->setWidth(30);  // Tipo de competición
        $resumenSheet->getColumnDimension('C')->setWidth(15);  // Total trabajos
        $resumenSheet->getColumnDimension('D')->setWidth(20);  // Países representados
        $resumenSheet->getColumnDimension('E')->setWidth(20);  // Calificación promedio
        $resumenSheet->getColumnDimension('F')->setWidth(40);  // Mejor trabajo
        $resumenSheet->getColumnDimension('G')->setWidth(15);  // Calificación
        
        // Crear una hoja con leyenda de colores
        if ($sheetCount < $maxSheets) {
            $leyendaSheet = new \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet($spreadsheet, 'Leyenda');
            $spreadsheet->addSheet($leyendaSheet);
            
            $leyendaSheet->setCellValue('A1', 'LEYENDA DE COLORES');
            $leyendaSheet->mergeCells('A1:C1');
            $leyendaSheet->getStyle('A1')->applyFromArray($titleStyle);
            
            $leyendaSheet->setCellValue('A3', 'COLOR');
            $leyendaSheet->setCellValue('B3', 'SIGNIFICADO');
            $leyendaSheet->setCellValue('C3', 'DESCRIPCIÓN');
            $leyendaSheet->getStyle('A3:C3')->applyFromArray($headerStyle);
            
            // Calificaciones
            $leyendaSheet->setCellValue('A4', 'Excelente');
            $leyendaSheet->setCellValue('B4', 'Calificación ≥ 90');
            $leyendaSheet->setCellValue('C4', 'Trabajo de calidad excepcional');
            $leyendaSheet->getStyle('A4')->applyFromArray($calificacionExcelente);
            
            $leyendaSheet->setCellValue('A5', 'Bueno');
            $leyendaSheet->setCellValue('B5', 'Calificación entre 75 y 89.99');
            $leyendaSheet->setCellValue('C5', 'Trabajo de buena calidad');
            $leyendaSheet->getStyle('A5')->applyFromArray($calificacionBueno);
            
            $leyendaSheet->setCellValue('A6', 'Regular');
            $leyendaSheet->setCellValue('B6', 'Calificación entre 60 y 74.99');
            $leyendaSheet->setCellValue('C6', 'Trabajo que cumple los requisitos básicos');
            $leyendaSheet->getStyle('A6')->applyFromArray($calificacionRegular);
            
            $leyendaSheet->setCellValue('A7', 'Deficiente');
            $leyendaSheet->setCellValue('B7', 'Calificación < 60');
            $leyendaSheet->setCellValue('C7', 'Trabajo que requiere mejoras significativas');
            $leyendaSheet->getStyle('A7')->applyFromArray($calificacionDeficiente);
            
            // Campos repetidos
            $leyendaSheet->setCellValue('A9', 'Tipo Presentación');
            $leyendaSheet->setCellValue('B9', 'Agrupación por color');
            $leyendaSheet->setCellValue('C9', 'Todos los trabajos del mismo tipo de presentación tienen el mismo color');
            
            // Mostrar ejemplos de colores para tipos de presentación
            for ($i = 0; $i < 5; $i++) {
                $leyendaSheet->setCellValue('A' . (10 + $i), 'Tipo ' . ($i+1));
                $leyendaSheet->getStyle('A' . (10 + $i))->getFill()
                    ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
                    ->getStartColor()->setRGB($tipoPresentacionColores[$i]);
            }
            
            $leyendaSheet->setCellValue('A16', 'País');
            $leyendaSheet->setCellValue('B16', 'Agrupación por color');
            $leyendaSheet->setCellValue('C16', 'Todos los trabajos del mismo país tienen el mismo color');
            
            // Mostrar ejemplos de colores para países
            for ($i = 0; $i < 5; $i++) {
                $leyendaSheet->setCellValue('A' . (17 + $i), 'País ' . ($i+1));
                $leyendaSheet->getStyle('A' . (17 + $i))->getFill()
                    ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
                    ->getStartColor()->setRGB($paisColores[$i]);
            }
            
            $leyendaSheet->setCellValue('A23', 'Evaluador');
            $leyendaSheet->setCellValue('B23', 'Agrupación por color');
            $leyendaSheet->setCellValue('C23', 'Todos los trabajos con el mismo evaluador tienen el mismo color');
            
            // Mostrar ejemplos de colores para evaluadores
            for ($i = 0; $i < 5; $i++) {
                $leyendaSheet->setCellValue('A' . (24 + $i), 'Evaluador ' . ($i+1));
                $leyendaSheet->getStyle('A' . (24 + $i))->getFill()
                    ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
                    ->getStartColor()->setRGB($evaluadorColores[$i]);
            }
            
            // Agregar leyenda para áreas temáticas
            $leyendaSheet->setCellValue('A30', 'Área Temática');
            $leyendaSheet->setCellValue('B30', 'Agrupación por color');
            $leyendaSheet->setCellValue('C30', 'Todos los trabajos de la misma área temática tienen el mismo color');
            $leyendaSheet->getStyle('A30:C30')->applyFromArray($headerStyle);
            
            // Mostrar ejemplos de colores para áreas temáticas
            for ($i = 0; $i < 5; $i++) {
                $leyendaSheet->setCellValue('A' . (31 + $i), 'Área ' . ($i+1));
                $leyendaSheet->getStyle('A' . (31 + $i))->getFill()
                    ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
                    ->getStartColor()->setRGB($areaColores[$i]);
            }
            
            // Formatear tabla de leyenda
            $leyendaSheet->getStyle('A3:C35')->applyFromArray($dataRowStyle);
            
            // Ajustar ancho de columnas
            $leyendaSheet->getColumnDimension('A')->setWidth(20);
            $leyendaSheet->getColumnDimension('B')->setWidth(30);
            $leyendaSheet->getColumnDimension('C')->setWidth(40);
        }
        
        // Establecer la hoja de resumen como activa
        $spreadsheet->setActiveSheetIndex(0);
        
        // Limpiar el buffer de salida para asegurar que no hay datos previos
        if (ob_get_length()) ob_end_clean();
        
        // Configurar el encabezado HTTP para descargar el archivo XLSX
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment;filename="informe_detallado_competiciones_' . date('Y-m-d') . '.xlsx"');
        header('Cache-Control: max-age=0');
        header('Cache-Control: max-age=1');
        header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
        header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
        header('Cache-Control: cache, must-revalidate');
        header('Pragma: public');
        
        // Crear el escritor XLSX con configuración optimizada
        $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
        $writer->setPreCalculateFormulas(false); // Mejorar rendimiento
        $writer->setOffice2003Compatibility(false);
        $writer->setUseDiskCaching(true); // Usar caché en disco para grandes volúmenes de datos
        
        // Guardar directamente al output de PHP
        $writer->save('php://output');
        
    } catch (Exception $e) {
        // Limpiar cualquier salida previa
        if (ob_get_length()) ob_end_clean();
        
        // Devolver error
        header('Content-Type: text/html; charset=utf-8');
        echo 'Error al generar el archivo Excel: ' . $e->getMessage();
        error_log('Error en exportación Excel: ' . $e->getMessage());
    }
    
    exit;
}


/**
 * Función para sanitizar nombre de hojas de Excel (máximo 31 caracteres, sin caracteres especiales)
 * 
 * @param string $name Nombre original
 * @return string Nombre sanitizado
 */
function sanitizeSheetName($name) {
    // Convertir a UTF-8 si no lo está ya
    if (!mb_check_encoding($name, 'UTF-8')) {
        $name = mb_convert_encoding($name, 'UTF-8');
    }
    
    // Eliminar caracteres especiales y acentos
    $name = preg_replace('/[áàäâãå]/ui', 'a', $name);
    $name = preg_replace('/[éèëê]/ui', 'e', $name);
    $name = preg_replace('/[íìïî]/ui', 'i', $name);
    $name = preg_replace('/[óòöôõø]/ui', 'o', $name);
    $name = preg_replace('/[úùüû]/ui', 'u', $name);
    $name = preg_replace('/[ñ]/ui', 'n', $name);
    $name = preg_replace('/[ç]/ui', 'c', $name);
    
    // Sustituir caracteres no permitidos por guiones
    $name = preg_replace('/[^\w\s-]/u', '', $name);
    $name = trim($name);
    $name = preg_replace('/\s+/', ' ', $name);
    
    // Asegurar que el nombre no esté vacío
    if (empty($name)) {
        $name = 'Hoja';
    }
    
    // Truncar si es mayor a 31 caracteres (límite de Excel)
    if (mb_strlen($name, 'UTF-8') > 31) {
        $name = mb_substr($name, 0, 28, 'UTF-8') . '...';
    }
    
    return $name;
}

/**
 * Función para sanitizar texto y evitar problemas de codificación
 * 
 * @param string $text Texto original
 * @return string Texto sanitizado
 */
function sanitizeText($text) {
    // Decodificar entidades HTML y eliminar etiquetas
    $text = html_entity_decode(strip_tags($text), ENT_QUOTES, 'UTF-8');
    
    // Convertir a UTF-8 si no lo está ya
    if (!mb_check_encoding($text, 'UTF-8')) {
        $text = mb_convert_encoding($text, 'UTF-8');
    }
    
    // Eliminar caracteres de control y no imprimibles
    $text = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/', '', $text);
    
    // Convertir múltiples espacios en uno solo
    $text = preg_replace('/\s+/', ' ', $text);
    
    // Limitar longitud para evitar problemas con Excel
    if (mb_strlen($text, 'UTF-8') > 32000) { // Excel tiene un límite de 32,767 caracteres por celda
        $text = mb_substr($text, 0, 32000, 'UTF-8');
    }
    
    return trim($text);
}



function exportarExcel($trabajos, $trabajosPorPais, $mejoresTrabajos, $totalTrabajos, $promedioGeneral, $cantidadPorPais) {
    // Verificar que las clases de PhpSpreadsheet estén disponibles
    if (!class_exists('\\PhpOffice\\PhpSpreadsheet\\Spreadsheet')) {
        header('Location: ?error=excel_library_missing');
        exit;
    }
    
  
 
    
    // Crear el objeto Spreadsheet
    $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
    
    // Establecer propiedades del documento
    $spreadsheet->getProperties()
        ->setCreator('Dashboard Resúmenes Científicos')
        ->setLastModifiedBy('Sistema de Evaluación')
        ->setTitle('Resúmenes Científicos - Trabajos Evaluados')
        ->setSubject('Reporte de Trabajos Evaluados')
        ->setDescription('Lista de trabajos científicos evaluados con calificaciones')
        ->setKeywords('resúmenes, científicos, evaluación')
        ->setCategory('Reportes');
    
    // Obtener la hoja activa
    $sheet = $spreadsheet->getActiveSheet();
    $sheet->setTitle('Trabajos Evaluados');
    
    // Definir estilos generales
    $headerStyle = [
        'font' => [
            'bold' => true,
            'color' => ['rgb' => 'FFFFFF'],
            'size' => 12,
        ],
        'fill' => [
            'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID,
            'startColor' => ['rgb' => '2C3E50'],
        ],
        'alignment' => [
            'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
            'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER,
        ],
        'borders' => [
            'allBorders' => [
                'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
                'color' => ['rgb' => '9AA0A7'],
            ],
        ],
    ];
    
    $titleStyle = [
        'font' => [
            'bold' => true,
            'size' => 16,
            'color' => ['rgb' => '2C3E50'],
        ],
        'alignment' => [
            'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
        ],
    ];
    
    $subtitleStyle = [
        'font' => [
            'bold' => true,
            'size' => 14,
            'color' => ['rgb' => '34495E'],
        ],
        'alignment' => [
            'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
        ],
    ];
    
    $infoStyle = [
        'font' => [
            'italic' => true,
            'size' => 10,
        ],
        'alignment' => [
            'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_RIGHT,
        ],
    ];
    
    $dataRowStyle = [
        'borders' => [
            'allBorders' => [
                'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
                'color' => ['rgb' => 'D5DBDB'],
            ],
        ],
    ];
    
    $calificacionExcelente = [
        'font' => [
            'bold' => true,
            'color' => ['rgb' => 'FFFFFF'],
        ],
        'fill' => [
            'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID,
            'startColor' => ['rgb' => '2ECC71'],
        ],
        'alignment' => [
            'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
        ],
    ];
    
    $calificacionBueno = [
        'font' => [
            'bold' => true,
            'color' => ['rgb' => 'FFFFFF'],
        ],
        'fill' => [
            'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID,
            'startColor' => ['rgb' => '3498DB'],
        ],
        'alignment' => [
            'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
        ],
    ];
    
    $calificacionRegular = [
        'font' => [
            'bold' => true,
            'color' => ['rgb' => 'FFFFFF'],
        ],
        'fill' => [
            'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID,
            'startColor' => ['rgb' => 'F39C12'],
        ],
        'alignment' => [
            'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
        ],
    ];
    
    $calificacionDeficiente = [
        'font' => [
            'bold' => true,
            'color' => ['rgb' => 'FFFFFF'],
        ],
        'fill' => [
            'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID,
            'startColor' => ['rgb' => 'E74C3C'],
        ],
        'alignment' => [
            'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
        ],
    ];
    
    $highlightStyle = [
        'fill' => [
            'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID,
            'startColor' => ['rgb' => 'F2F3F4'],
        ],
    ];
    
    $summaryHeaderStyle = [
        'font' => [
            'bold' => true,
            'color' => ['rgb' => 'FFFFFF'],
        ],
        'fill' => [
            'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID,
            'startColor' => ['rgb' => '16A085'],
        ],
        'alignment' => [
            'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_LEFT,
        ],
        'borders' => [
            'allBorders' => [
                'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
                'color' => ['rgb' => '9AA0A7'],
            ],
        ],
    ];
    
    $summaryValueStyle = [
        'font' => [
            'bold' => true,
            'size' => 12,
        ],
        'alignment' => [
            'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
        ],
        'borders' => [
            'allBorders' => [
                'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
                'color' => ['rgb' => '9AA0A7'],
            ],
        ],
    ];
    
    // Título del informe
    $sheet->setCellValue('A1', 'DASHBOARD DE RESÚMENES CIENTÍFICOS');
    $sheet->mergeCells('A1:E1');
    $sheet->getStyle('A1')->applyFromArray($titleStyle);
    
    $sheet->setCellValue('A2', 'Lista de trabajos completamente evaluados');
    $sheet->mergeCells('A2:E2');
    $sheet->getStyle('A2')->applyFromArray($subtitleStyle);
    
    $sheet->setCellValue('A3', 'Fecha de generación: ' . date('d/m/Y H:i:s'));
    $sheet->mergeCells('A3:E3');
    $sheet->getStyle('A3')->applyFromArray($infoStyle);
    
    // Dejar una fila en blanco
    $currentRow = 5;
    
    // Establecer encabezados de la tabla
    $sheet->setCellValue('A' . $currentRow, 'CÓDIGO');
    $sheet->setCellValue('B' . $currentRow, 'TÍTULO');
    $sheet->setCellValue('C' . $currentRow, 'PAÍS');
    $sheet->setCellValue('D' . $currentRow, 'CALIFICACIÓN');
    $sheet->getStyle('A' . $currentRow . ':D' . $currentRow)->applyFromArray($headerStyle);
    
    // Ajustar alto de la fila de encabezados
    $sheet->getRowDimension($currentRow)->setRowHeight(30);
    
    // Incrementar la fila para los datos
    $currentRow++;
    $startDataRow = $currentRow;
    
    // Variables para rastrear elementos similares para colores alternos
    $currentPais = '';
    $colorAlternation = false;
    
    // Llenar datos de trabajos
    foreach ($trabajos as $index => $trabajo) {
        // Comprobar si es un nuevo país para alternar colores
        if ($trabajo['pais'] != $currentPais) {
            $currentPais = $trabajo['pais'];
            $colorAlternation = !$colorAlternation;
        }
        
        // Aplicar estilo de fondo alternado basado en país
        if ($colorAlternation) {
            $sheet->getStyle('A' . $currentRow . ':D' . $currentRow)->applyFromArray($highlightStyle);
        }
        
        // Insertar datos
        $sheet->setCellValue('A' . $currentRow, $trabajo['codigo']);
        $sheet->setCellValue('B' . $currentRow, html_entity_decode(strip_tags($trabajo['titulo']), ENT_QUOTES, 'UTF-8'));
        $sheet->setCellValue('C' . $currentRow, $trabajo['pais']);
        $sheet->setCellValue('D' . $currentRow, floatval($trabajo['promedio_calificacion']));
        
        // Aplicar formato de número para calificación
        $sheet->getStyle('D' . $currentRow)->getNumberFormat()->setFormatCode('0.00');
        
        // Aplicar estilo según calificación
        $calificacion = floatval($trabajo['promedio_calificacion']);
        if ($calificacion >= 90) {
            $sheet->getStyle('D' . $currentRow)->applyFromArray($calificacionExcelente);
        } elseif ($calificacion >= 75) {
            $sheet->getStyle('D' . $currentRow)->applyFromArray($calificacionBueno);
        } elseif ($calificacion >= 60) {
            $sheet->getStyle('D' . $currentRow)->applyFromArray($calificacionRegular);
        } else {
            $sheet->getStyle('D' . $currentRow)->applyFromArray($calificacionDeficiente);
        }
        
        // Aplicar bordes a la fila de datos
        $sheet->getStyle('A' . $currentRow . ':D' . $currentRow)->applyFromArray($dataRowStyle);
        
        // Incrementar fila
        $currentRow++;
    }
    
    // Aplicar formato condicional para resaltar países iguales
    $conditionalStyles = [];
    $conditional = new \PhpOffice\PhpSpreadsheet\Style\Conditional();
    $conditional->setConditionType(\PhpOffice\PhpSpreadsheet\Style\Conditional::CONDITION_EXPRESSION);
    $conditional->setOperatorType(\PhpOffice\PhpSpreadsheet\Style\Conditional::OPERATOR_EQUAL);
    $conditional->addCondition('=AND($C' . $startDataRow . '<>"",$C' . $startDataRow . '=$C' . ($startDataRow-1) . ')');
    $conditional->getStyle()->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID);
    $conditional->getStyle()->getFill()->getStartColor()->setRGB('F2F3F4');
    $conditionalStyles[] = $conditional;
    
    // Aplicar al rango de celdas de país
    $endDataRow = $currentRow - 1;
    if ($endDataRow >= $startDataRow) {
        $sheet->getStyle('C' . $startDataRow . ':C' . $endDataRow)->setConditionalStyles($conditionalStyles);
    }
    
    // Agregar una sección de estadísticas
    $currentRow += 2; // Dejar un espacio
    
    $sheet->setCellValue('A' . $currentRow, 'ESTADÍSTICAS GENERALES');
    $sheet->mergeCells('A' . $currentRow . ':D' . $currentRow);
    $sheet->getStyle('A' . $currentRow . ':D' . $currentRow)->applyFromArray($subtitleStyle);
    $currentRow += 2;
    
    // Tabla de estadísticas
    $sheet->setCellValue('A' . $currentRow, 'Total de Trabajos:');
    $sheet->setCellValue('B' . $currentRow, $totalTrabajos);
    $sheet->getStyle('A' . $currentRow)->applyFromArray($summaryHeaderStyle);
    $sheet->getStyle('B' . $currentRow)->applyFromArray($summaryValueStyle);
    $currentRow++;
    
    $sheet->setCellValue('A' . $currentRow, 'Promedio General:');
    $sheet->setCellValue('B' . $currentRow, $promedioGeneral);
    $sheet->getStyle('A' . $currentRow)->applyFromArray($summaryHeaderStyle);
    $sheet->getStyle('B' . $currentRow)->applyFromArray($summaryValueStyle);
    $sheet->getStyle('B' . $currentRow)->getNumberFormat()->setFormatCode('0.00');
    $currentRow++;
    
    $sheet->setCellValue('A' . $currentRow, 'Países Participantes:');
    $sheet->setCellValue('B' . $currentRow, count($trabajosPorPais));
    $sheet->getStyle('A' . $currentRow)->applyFromArray($summaryHeaderStyle);
    $sheet->getStyle('B' . $currentRow)->applyFromArray($summaryValueStyle);
    $currentRow += 2;
    
    // Añadir sección de mejores trabajos
    $sheet->setCellValue('A' . $currentRow, 'MEJORES TRABAJOS');
    $sheet->mergeCells('A' . $currentRow . ':D' . $currentRow);
    $sheet->getStyle('A' . $currentRow . ':D' . $currentRow)->applyFromArray($subtitleStyle);
    $currentRow += 2;
    
    // Encabezados para mejores trabajos
    $sheet->setCellValue('A' . $currentRow, 'POSICIÓN');
    $sheet->setCellValue('B' . $currentRow, 'CÓDIGO');
    $sheet->setCellValue('C' . $currentRow, 'TÍTULO');
    $sheet->setCellValue('D' . $currentRow, 'CALIFICACIÓN');
    $sheet->getStyle('A' . $currentRow . ':D' . $currentRow)->applyFromArray($headerStyle);
    $currentRow++;
    
    // Llenar los mejores trabajos
    $posiciones = ['1° 🥇', '2° 🥈', '3° 🥉'];
    for ($i = 0; $i < min(3, count($mejoresTrabajos)); $i++) {
        $trabajo = $mejoresTrabajos[$i];
        
        $sheet->setCellValue('A' . $currentRow, $posiciones[$i]);
        $sheet->setCellValue('B' . $currentRow, $trabajo['codigo']);
        $sheet->setCellValue('C' . $currentRow, html_entity_decode(strip_tags($trabajo['titulo']), ENT_QUOTES, 'UTF-8'));
        $sheet->setCellValue('D' . $currentRow, floatval($trabajo['promedio_calificacion']));
        
        // Aplicar formato de número para calificación
        $sheet->getStyle('D' . $currentRow)->getNumberFormat()->setFormatCode('0.00');
        
        // Aplicar estilo según calificación
        $calificacion = floatval($trabajo['promedio_calificacion']);
        if ($calificacion >= 90) {
            $sheet->getStyle('D' . $currentRow)->applyFromArray($calificacionExcelente);
        } elseif ($calificacion >= 75) {
            $sheet->getStyle('D' . $currentRow)->applyFromArray($calificacionBueno);
        } elseif ($calificacion >= 60) {
            $sheet->getStyle('D' . $currentRow)->applyFromArray($calificacionRegular);
        } else {
            $sheet->getStyle('D' . $currentRow)->applyFromArray($calificacionDeficiente);
        }
        
        // Dar estilo al podio
        if ($i == 0) { // Primer lugar
            $sheet->getStyle('A' . $currentRow . ':D' . $currentRow)->getFill()
                ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
                ->getStartColor()->setRGB('FFF9C4'); // Amarillo suave para oro
        } elseif ($i == 1) { // Segundo lugar
            $sheet->getStyle('A' . $currentRow . ':D' . $currentRow)->getFill()
                ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
                ->getStartColor()->setRGB('F5F5F5'); // Gris suave para plata
        } elseif ($i == 2) { // Tercer lugar
            $sheet->getStyle('A' . $currentRow . ':D' . $currentRow)->getFill()
                ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
                ->getStartColor()->setRGB('FFCCBC'); // Naranja suave para bronce
        }
        
        // Aplicar bordes
        $sheet->getStyle('A' . $currentRow . ':D' . $currentRow)->applyFromArray($dataRowStyle);
        
        // Incrementar fila
        $currentRow++;
    }
    
    $currentRow += 2;
    
    // Añadir distribución por países
    $sheet->setCellValue('A' . $currentRow, 'DISTRIBUCIÓN POR PAÍSES');
    $sheet->mergeCells('A' . $currentRow . ':B' . $currentRow);
    $sheet->getStyle('A' . $currentRow . ':B' . $currentRow)->applyFromArray($subtitleStyle);
    $currentRow += 2;
    
    // Encabezados de distribución
    $sheet->setCellValue('A' . $currentRow, 'PAÍS');
    $sheet->setCellValue('B' . $currentRow, 'CANTIDAD');
    $sheet->getStyle('A' . $currentRow . ':B' . $currentRow)->applyFromArray($headerStyle);
    $currentRow++;
    
    // Ordenar países por cantidad (mayor a menor)
    arsort($cantidadPorPais);
    
    // Llenar datos de distribución por país
    foreach ($cantidadPorPais as $pais => $cantidad) {
        $sheet->setCellValue('A' . $currentRow, $pais);
        $sheet->setCellValue('B' . $currentRow, $cantidad);
        
        // Aplicar bordes
        $sheet->getStyle('A' . $currentRow . ':B' . $currentRow)->applyFromArray($dataRowStyle);
        
        // Incrementar fila
        $currentRow++;
    }
    
    // Crear una segunda hoja para detalles por país
    $paisesSheet = $spreadsheet->createSheet();
    $paisesSheet->setTitle('Trabajos por País');
    
    // Establecer encabezados por país
    $currentRowPaises = 1;
    $paisesSheet->setCellValue('A' . $currentRowPaises, 'TRABAJOS POR PAÍS');
    $paisesSheet->mergeCells('A' . $currentRowPaises . ':D' . $currentRowPaises);
    $paisesSheet->getStyle('A' . $currentRowPaises . ':D' . $currentRowPaises)->applyFromArray($titleStyle);
    $currentRowPaises += 2;
    
    // Ordenar países alfabéticamente
    ksort($trabajosPorPais);
    
    // Procesar cada país
    foreach ($trabajosPorPais as $pais => $trabajosDelPais) {
        // Encabezado del país
        $paisesSheet->setCellValue('A' . $currentRowPaises, $pais);
        $paisesSheet->setCellValue('B' . $currentRowPaises, 'Trabajos: ' . count($trabajosDelPais));
        $paisesSheet->mergeCells('A' . $currentRowPaises . ':B' . $currentRowPaises);
        $paisesSheet->mergeCells('C' . $currentRowPaises . ':D' . $currentRowPaises);
        
        // Aplicar estilo especial para encabezado de país
        $paisesSheet->getStyle('A' . $currentRowPaises . ':D' . $currentRowPaises)->applyFromArray([
            'font' => [
                'bold' => true,
                'color' => ['rgb' => 'FFFFFF'],
                'size' => 12,
            ],
            'fill' => [
                'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID,
                'startColor' => ['rgb' => '377970'], // Color primario del dashboard
            ],
            'alignment' => [
                'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_LEFT,
                'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER,
            ],
            'borders' => [
                'allBorders' => [
                    'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
                    'color' => ['rgb' => '9AA0A7'],
                ],
            ],
        ]);
        
        $currentRowPaises++;
        
        // Encabezados para trabajos del país
        $paisesSheet->setCellValue('A' . $currentRowPaises, 'CÓDIGO');
        $paisesSheet->setCellValue('B' . $currentRowPaises, 'TÍTULO');
        $paisesSheet->setCellValue('C' . $currentRowPaises, 'CALIFICACIÓN');
        $paisesSheet->setCellValue('D' . $currentRowPaises, 'ESTADO');
        $paisesSheet->getStyle('A' . $currentRowPaises . ':D' . $currentRowPaises)->applyFromArray($headerStyle);
        $currentRowPaises++;
        
        // Ordenar trabajos por calificación (mayor a menor)
        usort($trabajosDelPais, function($a, $b) {
            return floatval($b['promedio_calificacion']) - floatval($a['promedio_calificacion']);
        });
        
        // Llenar datos de trabajos por país
        foreach ($trabajosDelPais as $trabajo) {
            $paisesSheet->setCellValue('A' . $currentRowPaises, $trabajo['codigo']);
            $paisesSheet->setCellValue('B' . $currentRowPaises, html_entity_decode(strip_tags($trabajo['titulo']), ENT_QUOTES, 'UTF-8'));
            $paisesSheet->setCellValue('C' . $currentRowPaises, floatval($trabajo['promedio_calificacion']));
            
            // Determinar estado según calificación
            $calificacion = floatval($trabajo['promedio_calificacion']);
            $estado = '';
            if ($calificacion >= 90) {
                $estado = 'Excelente';
                $paisesSheet->getStyle('C' . $currentRowPaises)->applyFromArray($calificacionExcelente);
                $paisesSheet->getStyle('D' . $currentRowPaises)->applyFromArray($calificacionExcelente);
            } elseif ($calificacion >= 75) {
                $estado = 'Bueno';
                $paisesSheet->getStyle('C' . $currentRowPaises)->applyFromArray($calificacionBueno);
                $paisesSheet->getStyle('D' . $currentRowPaises)->applyFromArray($calificacionBueno);
            } elseif ($calificacion >= 60) {
                $estado = 'Regular';
                $paisesSheet->getStyle('C' . $currentRowPaises)->applyFromArray($calificacionRegular);
                $paisesSheet->getStyle('D' . $currentRowPaises)->applyFromArray($calificacionRegular);
            } else {
                $estado = 'Deficiente';
                $paisesSheet->getStyle('C' . $currentRowPaises)->applyFromArray($calificacionDeficiente);
                $paisesSheet->getStyle('D' . $currentRowPaises)->applyFromArray($calificacionDeficiente);
            }
            
            $paisesSheet->setCellValue('D' . $currentRowPaises, $estado);
            
            // Aplicar formato de número para calificación
            $paisesSheet->getStyle('C' . $currentRowPaises)->getNumberFormat()->setFormatCode('0.00');
            
            // Aplicar bordes
            $paisesSheet->getStyle('A' . $currentRowPaises . ':D' . $currentRowPaises)->applyFromArray($dataRowStyle);
            
            // Incrementar fila
            $currentRowPaises++;
        }
        
        // Dejar un espacio entre países
        $currentRowPaises += 2;
    }
    
    // Ajustar ancho de columnas automáticamente
    foreach (['A', 'B', 'C', 'D'] as $col) {
        $sheet->getColumnDimension($col)->setAutoSize(true);
        $paisesSheet->getColumnDimension($col)->setAutoSize(true);
    }
    
    // Configurar la hoja principal como activa
    $spreadsheet->setActiveSheetIndex(0);
    
    // Configurar el encabezado HTTP para descargar el archivo XLSX
    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition: attachment;filename="resumen_cientificos_' . date('Y-m-d') . '.xlsx"');
    header('Cache-Control: max-age=0');
    
    // Crear el escritor XLSX
    $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
    
    // Guardar en output del PHP
    $writer->save('php://output');
    exit;
}



// Función para obtener la bandera del país
function getFlagEmoji($countryCode) {
    // Mapa de países a códigos ISO
    $countryToCode = [
        'Argentina' => 'AR',
        'Brasil' => 'BR',
        'Chile' => 'CL',
        'Colombia' => 'CO',
        'Ecuador' => 'EC',
        'España' => 'ES',
        'Mexico' => 'MX',
        'Perú' => 'PE',
        'Uruguay' => 'UY',
        'Venezuela' => 'VE',
        'Bolivia' => 'BO',
        'Paraguay' => 'PY',
        'Costa Rica' => 'CR',
        'Panamá' => 'PA',
        'Estados Unidos' => 'US',
        'United States' => 'US',
        'Canada' => 'CA',
        'Portugal' => 'PT',
        'Italia' => 'IT',
        'Francia' => 'FR',
        'Alemania' => 'DE',
        'Reino Unido' => 'GB',
        'United Kingdom' => 'GB',
        'Spain' => 'ES',
        'Peru' => 'PE',
        'Dominican Republic' => 'DO',
        'Guatemala' => 'GT',
        'Japan' => 'JP',
        'Puerto Rico' => 'PR',
        'Qatar' => 'QA',
        'Russia' => 'RU'
    ];
    
    // Si no existe en el mapa, devolvemos el código original
    $code = isset($countryToCode[$countryCode]) ? $countryToCode[$countryCode] : 'XX';
    
    // Ruta a las imágenes de banderas (suponiendo que tienes una carpeta "flags" con imágenes nombradas por código ISO)
    $flagPath = "https://flagcdn.com/48x36/" . strtolower($code) . ".png";
    
    // Devolvemos la etiqueta HTML de la imagen
    return '<img src="' . $flagPath . '" alt="' . $countryCode . '" title="' . $countryCode . '" class="flag-img" width="36" height="27">';
}

// Obtenemos los trabajos que tienen las 3 evaluaciones completas
function obtenerTrabajosEvaluados() {
    // Activamos la conexión MySQL usando la función de utils_database.php
    $conn = Activarmysql();
    
    // Consulta SQL para obtener los trabajos completamente evaluados
    $sql = "SELECT 
                id, 
                codigo,
                titulo, 
                pais,
                ((calificacion1_1 + calificacion1_2 + calificacion1_3 + calificacion1_4 + calificacion1_5 + calificacion1_6 +
                 calificacion2_1 + calificacion2_2 + calificacion2_3 + calificacion2_4 + calificacion2_5 + calificacion2_6 +
                 calificacion3_1 + calificacion3_2 + calificacion3_3 + calificacion3_4 + calificacion3_5 + calificacion3_6) / 3) as promedio_calificacion
            FROM 
                ttrabajo 
            WHERE 
                calificacion1_fecha IS NOT NULL AND 
                calificacion2_fecha IS NOT NULL AND 
                calificacion3_fecha IS NOT NULL
            ORDER BY 
                promedio_calificacion DESC, pais ASC";
    
    $result = $conn->query($sql);
    $trabajos = [];
    
    if ($result->num_rows > 0) {
        while($row = $result->fetch_assoc()) {
            $row['promedio_calificacion'] = number_format($row['promedio_calificacion'], 2);
            $row['bandera'] = getFlagEmoji($row['pais']);
            $trabajos[] = $row;
        }
    }
    
    $conn->close();
    return $trabajos;
}

// Agrupamos los trabajos por país
function agruparTrabajosPorPais($trabajos) {
    $porPais = [];
    foreach ($trabajos as $trabajo) {
        $pais = $trabajo['pais'];
        if (!isset($porPais[$pais])) {
            $porPais[$pais] = [];
        }
        $porPais[$pais][] = $trabajo;
    }
    return $porPais;
}


// Verificamos si hay una solicitud de exportación
$export = isset($_GET['export']) ? $_GET['export'] : '';

// Obtenemos los datos (asegúrate que estas funciones no impriman nada)
$trabajos = obtenerTrabajosEvaluados();
$trabajosPorPais = agruparTrabajosPorPais($trabajos);

// Contamos la cantidad total de trabajos y promedio general
$totalTrabajos = count($trabajos);
$promedioGeneral = 0;
if ($totalTrabajos > 0) {
    $sumaPromedios = 0;
    foreach ($trabajos as $trabajo) {
        $sumaPromedios += floatval($trabajo['promedio_calificacion']);
    }
    $promedioGeneral = number_format($sumaPromedios / $totalTrabajos, 2);
}

// Seleccionamos los 3 mejores trabajos para el escalafón
$mejoresTrabajos = array_slice($trabajos, 0, 3);

// Contamos trabajos por país
$cantidadPorPais = [];
foreach ($trabajosPorPais as $pais => $trabajosDelPais) {
    $cantidadPorPais[$pais] = count($trabajosDelPais);
}

/* AQUÍ COMIENZAN LAS EXPORTACIONES */

// EXPORTACIÓN A EXCEL (CSV)
if ($export == 'excel') {
    // Limpiamos cualquier salida previa
    ob_end_clean();
    
    // Configuración para la salida del archivo CSV
    header('Content-Type: text/csv; charset=utf-8');
    header('Content-Disposition: attachment; filename="resumen_cientificos_' . date('Y-m-d') . '.csv"');
    
    // Crear un manejador de archivo para PHP
    $output = fopen('php://output', 'w');
    
    // Establecer el delimitador de campos correcto para Excel
    fprintf($output, chr(0xEF).chr(0xBB).chr(0xBF)); // Escribir BOM para UTF-8
    
    // Escribir los encabezados
    fputcsv($output, ['CÓDIGO', 'TÍTULO', 'PAÍS', 'CALIFICACIÓN']);
    
    // Escribir los datos
    foreach ($trabajos as $trabajo) {
        // Para evitar problemas con caracteres especiales
        $fila = [
            $trabajo['codigo'],
            html_entity_decode(strip_tags($trabajo['titulo']), ENT_QUOTES, 'UTF-8'),
            $trabajo['pais'],
            $trabajo['promedio_calificacion']
        ];
        fputcsv($output, $fila);
    }
    
    // También añadir una sección con los mejores trabajos
    fputcsv($output, []);  // Línea en blanco
    fputcsv($output, ['MEJORES TRABAJOS']);
    fputcsv($output, ['POSICIÓN', 'CÓDIGO', 'TÍTULO', 'PAÍS', 'CALIFICACIÓN']);
    
    for ($i = 0; $i < min(3, count($mejoresTrabajos)); $i++) {
        $trabajo = $mejoresTrabajos[$i];
        $fila = [
            ($i + 1),
            $trabajo['codigo'],
            html_entity_decode(strip_tags($trabajo['titulo']), ENT_QUOTES, 'UTF-8'),
            $trabajo['pais'],
            $trabajo['promedio_calificacion']
        ];
        fputcsv($output, $fila);
    }
    
    // Añadir estadísticas
    fputcsv($output, []);  // Línea en blanco
    fputcsv($output, ['ESTADÍSTICAS']);
    fputcsv($output, ['Total de Trabajos', $totalTrabajos]);
    fputcsv($output, ['Promedio General', $promedioGeneral]);
    fputcsv($output, ['Países Participantes', count($trabajosPorPais)]);
    
    // Distribución por países
    fputcsv($output, []);  // Línea en blanco
    fputcsv($output, ['DISTRIBUCIÓN POR PAÍSES']);
    fputcsv($output, ['PAÍS', 'CANTIDAD DE TRABAJOS']);
    
    // Ordenar países por cantidad (mayor a menor)
    arsort($cantidadPorPais);
    
    foreach ($cantidadPorPais as $pais => $cantidad) {
        fputcsv($output, [$pais, $cantidad]);
    }
    
    fclose($output);
    exit;
}

// EXPORTACIÓN A PDF
if ($export == 'pdf') {
    // Limpiar cualquier salida previa que pudiera estar en el buffer
    ob_end_clean();
    
    // Verificar si está instalada la biblioteca TCPDF
    $tcpdfInstalled = false;
    
    // Intentar cargar TCPDF desde diferentes ubicaciones
    if (file_exists('vendor/tecnickcom/tcpdf/tcpdf.php')) {
        require_once('vendor/tecnickcom/tcpdf/tcpdf.php');
        $tcpdfInstalled = true;
    } else if (file_exists('tcpdf/tcpdf.php')) {
        require_once('tcpdf/tcpdf.php');
        $tcpdfInstalled = true;
    }
    
    if (!$tcpdfInstalled) {
        // Asegurarse de que no se ha enviado nada antes de este redirect
        header('Location: ?error=pdf_library_missing');
        exit;
    }
    
    // Crear una clase personalizada basada en TCPDF para agregar encabezado y pie de página
    class MYPDF extends TCPDF {
        // Encabezado de página
        public function Header() {
            // Logo (opcional)
            $image_file = 'logo.png'; // Asegúrate de tener este archivo
            if (file_exists($image_file)) {
                $this->Image($image_file, 10, 10, 30, '', 'PNG', '', 'T', false, 300, '', false, false, 0, false, false, false);
            }
            
            // Título del documento
            $this->SetFont('helvetica', 'B', 14);
            $this->SetY(15);
            $this->Cell(0, 10, 'Dashboard de Resúmenes Científicos', 0, false, 'C', 0, '', 0, false, 'M', 'M');
            
            // Línea separadora
            $this->Line(10, 25, $this->getPageWidth() - 10, 25);
        }
        
        // Pie de página
        public function Footer() {
            // Posición a 15 mm del final
            $this->SetY(-15);
            // Fuente
            $this->SetFont('helvetica', 'I', 8);
            // Fecha de generación
            $this->Cell(0, 10, 'Informe generado el ' . date('d/m/Y H:i:s'), 0, false, 'L', 0, '', 0, false, 'T', 'M');
            // Número de página
            $this->Cell(0, 10, 'Página ' . $this->getAliasNumPage() . '/' . $this->getAliasNbPages(), 0, false, 'R', 0, '', 0, false, 'T', 'M');
        }
    }
    
    try {
        // Crear una nueva instancia de la clase personalizada
        $pdf = new MYPDF('P', 'mm', 'A4', true, 'UTF-8', false);
        
        // Establecer información de documento
        $pdf->SetCreator('Dashboard Resúmenes Científicos');
        $pdf->SetAuthor('Sistema de Evaluación');
        $pdf->SetTitle('Resúmenes Científicos - Trabajos Evaluados');
        $pdf->SetSubject('Reporte de Trabajos Evaluados');
        
        // Establecer márgenes
        $pdf->SetMargins(15, 30, 15);
        $pdf->SetHeaderMargin(5);
        $pdf->SetFooterMargin(10);
        $pdf->SetAutoPageBreak(TRUE, 15);
        
        // Establecer fuente
        $pdf->SetFont('helvetica', '', 10);
        
        // Agregar una página
        $pdf->AddPage();
        
        // Cabecera del PDF
        $pdf->SetFont('helvetica', 'B', 16);
        $pdf->Cell(0, 10, 'Dashboard de Resúmenes Científicos', 0, 1, 'C');
        $pdf->SetFont('helvetica', '', 12);
        $pdf->Cell(0, 6, 'Visualización de trabajos completamente evaluados', 0, 1, 'C');
        $pdf->Ln(5);
        
        // Agregar una pequeña descripción
        $pdf->SetFont('helvetica', 'I', 10);
        $pdf->MultiCell(0, 6, 'Este documento contiene un resumen de los trabajos científicos evaluados, ordenados por calificación. Se incluyen las métricas globales, el escalafón de mejores trabajos y un desglose por país de origen.', 0, 'L');
        $pdf->Ln(5);
        
        // Agregar fecha de generación
        $pdf->SetFont('helvetica', '', 10);
        $pdf->Cell(0, 6, 'Fecha de generación: ' . date('d/m/Y H:i:s'), 0, 1, 'R');
        $pdf->Ln(5);
        
        // Estadísticas globales
        $pdf->SetFont('helvetica', 'B', 14);
        $pdf->Cell(0, 10, 'Estadísticas Globales', 0, 1, 'L');
        $pdf->SetFont('helvetica', '', 12);
        
        // Crear tabla de estadísticas
        $pdf->SetFillColor(240, 240, 240);
        $pdf->Cell(60, 10, 'Total de Trabajos:', 1, 0, 'L', 1);
        $pdf->Cell(30, 10, $totalTrabajos, 1, 1, 'C', 0);
        
        $pdf->Cell(60, 10, 'Promedio General:', 1, 0, 'L', 1);
        $pdf->Cell(30, 10, $promedioGeneral, 1, 1, 'C', 0);
        
        $pdf->Cell(60, 10, 'Países Participantes:', 1, 0, 'L', 1);
        $pdf->Cell(30, 10, count($trabajosPorPais), 1, 1, 'C', 0);
        
        // Agregar una leyenda de calificaciones
        $pdf->Ln(5);
        $pdf->SetFont('helvetica', '', 10);
        $pdf->Cell(0, 6, 'Leyenda de Calificaciones:', 0, 1, 'L');
        
        // Excelente
        $pdf->SetFillColor(46, 204, 113);
        $pdf->SetTextColor(255, 255, 255);
        $pdf->Cell(30, 6, 'Excelente', 1, 0, 'C', 1);
        $pdf->SetTextColor(0, 0, 0);
        $pdf->Cell(40, 6, '>= 90', 1, 1, 'C', 0);
        
        // Bueno
        $pdf->SetFillColor(52, 152, 219);
        $pdf->SetTextColor(255, 255, 255);
        $pdf->Cell(30, 6, 'Bueno', 1, 0, 'C', 1);
        $pdf->SetTextColor(0, 0, 0);
        $pdf->Cell(40, 6, '75 - 89.99', 1, 1, 'C', 0);
        
        // Regular
        $pdf->SetFillColor(243, 156, 18);
        $pdf->SetTextColor(255, 255, 255);
        $pdf->Cell(30, 6, 'Regular', 1, 0, 'C', 1);
        $pdf->SetTextColor(0, 0, 0);
        $pdf->Cell(40, 6, '60 - 74.99', 1, 1, 'C', 0);
        
        // Deficiente
        $pdf->SetFillColor(231, 76, 60);
        $pdf->SetTextColor(255, 255, 255);
        $pdf->Cell(30, 6, 'Deficiente', 1, 0, 'C', 1);
        $pdf->SetTextColor(0, 0, 0);
        $pdf->Cell(40, 6, '< 60', 1, 1, 'C', 0);
        
        $pdf->Ln(10);
        
        // Mejores trabajos
        $pdf->SetFont('helvetica', 'B', 14);
        $pdf->Cell(0, 10, 'Escalafón de Mejores Trabajos', 0, 1, 'L');
        
        // Crear tabla para mejores trabajos
        $pdf->SetFillColor(52, 152, 219); // Azul para cabecera
        $pdf->SetTextColor(255, 255, 255);
        $pdf->SetFont('helvetica', 'B', 11);
        $pdf->Cell(15, 10, 'Pos.', 1, 0, 'C', 1);
        $pdf->Cell(30, 10, 'Código', 1, 0, 'C', 1);
        $pdf->Cell(90, 10, 'Título', 1, 0, 'C', 1);
        $pdf->Cell(30, 10, 'País', 1, 0, 'C', 1);
        $pdf->Cell(20, 10, 'Calif.', 1, 1, 'C', 1);
        
        $pdf->SetTextColor(0, 0, 0);
        $pdf->SetFont('helvetica', '', 10);
        
        // Colores para calificaciones
        $excelente = [46, 204, 113]; // verde
        $bueno = [52, 152, 219]; // azul
        $regular = [243, 156, 18]; // naranja
        $deficiente = [231, 76, 60]; // rojo
        
        // Agregar los 3 mejores trabajos
        for ($i = 0; $i < min(3, count($mejoresTrabajos)); $i++) {
            $trabajo = $mejoresTrabajos[$i];
            $calificacion = floatval($trabajo['promedio_calificacion']);
            
            // Determinar color de calificación
            if ($calificacion >= 90) {
                $fillColor = $excelente;
            } elseif ($calificacion >= 75) {
                $fillColor = $bueno;
            } elseif ($calificacion >= 60) {
                $fillColor = $regular;
            } else {
                $fillColor = $deficiente;
            }
            
            // Agregar iconos de posición
            $posicion = '';
            if ($i == 0) {
                $posicion = '1º 🥇';
            } elseif ($i == 1) {
                $posicion = '2º 🥈';
            } elseif ($i == 2) {
                $posicion = '3º 🥉';
            }
            
            $pdf->Cell(15, 10, $posicion, 1, 0, 'C', 0);
            $pdf->Cell(30, 10, $trabajo['codigo'], 1, 0, 'C', 0);
            
            // Título con posible recorte si es muy largo
            $titulo = $trabajo['titulo'];
            if (strlen($titulo) > 50) {
                $titulo = substr($titulo, 0, 47) . '...';
            }
            $pdf->Cell(90, 10, $titulo, 1, 0, 'L', 0);
            
            $pdf->Cell(30, 10, $trabajo['pais'], 1, 0, 'C', 0);
            
            // Aplicar color de fondo a la calificación
            $pdf->SetFillColor($fillColor[0], $fillColor[1], $fillColor[2]);
            $pdf->SetTextColor(255, 255, 255);
            $pdf->Cell(20, 10, $trabajo['promedio_calificacion'], 1, 1, 'C', 1);
            $pdf->SetTextColor(0, 0, 0);
        }
        
        $pdf->Ln(10);
        
        // Trabajos por país
        $pdf->SetFont('helvetica', 'B', 14);
        $pdf->Cell(0, 10, 'Trabajos por País', 0, 1, 'L');
        
        // Ordenar países por cantidad de trabajos (mayor a menor)
        arsort($cantidadPorPais);
        
        // Crear un gráfico simple de barras para mostrar cantidad por país
        $pdf->SetFont('helvetica', 'B', 10);
        $pdf->Cell(0, 6, 'Distribución de Trabajos por País', 0, 1, 'L');
        $pdf->Ln(2);
        
        // Encontrar el valor máximo para escalar el gráfico
        $maxValue = max($cantidadPorPais);
        $barMaxWidth = 120; // Ancho máximo de la barra en mm
        
        $pdf->SetFont('helvetica', '', 8);
        
        // Limitamos a los 10 primeros países para no sobrecargar el PDF
        $contador = 0;
        foreach ($cantidadPorPais as $pais => $cantidad) {
            if ($contador >= 10) break;
            
            // Calcular el ancho de la barra proporcional al valor
            $barWidth = ($cantidad / $maxValue) * $barMaxWidth;
            
            // Dibujar nombre del país
            $pdf->Cell(30, 6, $pais, 0, 0, 'R');
            
            // Dibujar el valor
            $pdf->Cell(10, 6, $cantidad, 0, 0, 'R');
            
            // Dibujar la barra
            $pdf->SetFillColor(52, 152, 219);
            $pdf->Cell($barWidth, 6, '', 0, 0, 'L', 1);
            
            $pdf->Ln(7);
            $contador++;
        }
        
        $pdf->Ln(5);
        
        // Iterar por cada país
        foreach ($trabajosPorPais as $pais => $trabajosDelPais) {
            // Verificar si necesitamos una nueva página
            if ($pdf->GetY() > 220) {
                $pdf->AddPage();
            }
            
            // Encabezado del país
            $pdf->SetFillColor(44, 62, 80); // Color oscuro para el país
            $pdf->SetTextColor(255, 255, 255);
            $pdf->SetFont('helvetica', 'B', 12);
            $pdf->Cell(150, 10, $pais, 1, 0, 'L', 1);
            $pdf->Cell(30, 10, 'Trabajos: ' . count($trabajosDelPais), 1, 1, 'C', 1);
            
            // Crear tabla de trabajos
            $pdf->SetFillColor(52, 152, 219); // Azul para cabecera
            $pdf->SetFont('helvetica', 'B', 11);
            $pdf->Cell(30, 10, 'Código', 1, 0, 'C', 1);
            $pdf->Cell(120, 10, 'Título', 1, 0, 'C', 1);
            $pdf->Cell(30, 10, 'Calificación', 1, 1, 'C', 1);
            
            $pdf->SetTextColor(0, 0, 0);
            $pdf->SetFont('helvetica', '', 10);
            
            // Ordenar trabajos por calificación (mayor a menor)
            usort($trabajosDelPais, function($a, $b) {
                return floatval($b['promedio_calificacion']) - floatval($a['promedio_calificacion']);
            });
            
            // Agregar trabajos de este país
            foreach ($trabajosDelPais as $trabajo) {
                // Verificar si necesitamos una nueva página
                if ($pdf->GetY() > 250) {
                    $pdf->AddPage();
                    
                    // Repetir encabezados
                    $pdf->SetFillColor(52, 152, 219);
                    $pdf->SetTextColor(255, 255, 255);
                    $pdf->SetFont('helvetica', 'B', 11);
                    $pdf->Cell(30, 10, 'Código', 1, 0, 'C', 1);
                    $pdf->Cell(120, 10, 'Título', 1, 0, 'C', 1);
                    $pdf->Cell(30, 10, 'Calificación', 1, 1, 'C', 1);
                    $pdf->SetTextColor(0, 0, 0);
                    $pdf->SetFont('helvetica', '', 10);
                }
                
                $calificacion = floatval($trabajo['promedio_calificacion']);
                
                // Determinar color de calificación
                if ($calificacion >= 90) {
                    $fillColor = $excelente;
                } elseif ($calificacion >= 75) {
                    $fillColor = $bueno;
                } elseif ($calificacion >= 60) {
                    $fillColor = $regular;
                } else {
                    $fillColor = $deficiente;
                }
                
                $pdf->Cell(30, 10, $trabajo['codigo'], 1, 0, 'C', 0);
                
                // Título con posible recorte si es muy largo
                $titulo = $trabajo['titulo'];
                if (strlen($titulo) > 70) {
                    $titulo = substr($titulo, 0, 67) . '...';
                }
                $pdf->Cell(120, 10, $titulo, 1, 0, 'L', 0);
                
                // Aplicar color de fondo a la calificación
                $pdf->SetFillColor($fillColor[0], $fillColor[1], $fillColor[2]);
                $pdf->SetTextColor(255, 255, 255);
                $pdf->Cell(30, 10, $trabajo['promedio_calificacion'], 1, 1, 'C', 1);
                $pdf->SetTextColor(0, 0, 0);
            }
            
            $pdf->Ln(5);
        }
        
        // Limpiar cualquier salida pendiente antes de enviar el PDF
        ob_end_clean();
        
        // Enviar el PDF al navegador
        $pdf->Output('resumen_cientificos_' . date('Y-m-d') . '.pdf', 'D');
        exit;
    } catch (Exception $e) {
        // En caso de error, manejo adecuado
        ob_end_clean(); // Asegurarse de limpiar el buffer
        echo "Error al generar el PDF: " . $e->getMessage();
        exit;
    }
}


// Resto del código si no se seleccionó la exportación a PDF
?>
<?php
// Incluimos el archivo de utilidades de la base de datos
require_once 'utils_database.php';

// Verificamos si hay una solicitud de exportación
$export = isset($_GET['export']) ? $_GET['export'] : '';

// NUEVA EXPORTACIÓN A EXCEL DETALLADO POR COMPETICIONES
if ($export == 'excel_detallado') {
    // Crear conexión a la base de datos
    $conn = Activarmysql();
    
    // Obtener los tipos de competición
    $sql_tipos_competicion = "SELECT id, codigo, descripcion_esp FROM ttipo_competicion";
    $result_tipos = $conn->query($sql_tipos_competicion);
    
    $tipos_competicion = [];
    if ($result_tipos->num_rows > 0) {
        while($row = $result_tipos->fetch_assoc()) {
            $tipos_competicion[$row['codigo']] = [
                'id' => $row['id'],
                'nombre' => $row['descripcion_esp']
            ];
        }
    }
    
    // Obtener los tipos de presentación
    $sql_tipos_presentacion = "SELECT id, codigo, descripcion_esp FROM ttipo_presentacion";
    $result_presentacion = $conn->query($sql_tipos_presentacion);
    
    $tipos_presentacion = [];
    if ($result_presentacion->num_rows > 0) {
        while($row = $result_presentacion->fetch_assoc()) {
            $tipos_presentacion[$row['codigo']] = [
                'id' => $row['id'],
                'nombre' => $row['descripcion_esp']
            ];
        }
    }
    
    // Obtener información de los evaluadores
    $sql_evaluadores = "SELECT id, nombre FROM tusuario WHERE tipousuario IN ('E', 'evaluador')";
    $result_evaluadores = $conn->query($sql_evaluadores);
    
    $evaluadores = [];
    if ($result_evaluadores && $result_evaluadores->num_rows > 0) {
        while($row = $result_evaluadores->fetch_assoc()) {
            $evaluadores[$row['id']] = $row['nombre'];
        }
    }
    
    // Llamar a la función de exportación
    exportarExcelDetalladoPorCompeticiones($tipos_competicion, $tipos_presentacion, $evaluadores);
    
    // La función exportarExcelDetalladoPorCompeticiones() termina con un exit(), así que no llegará aquí
}

// Verificamos si hay una solicitud para generar el informe detallado
if (isset($_GET['export_detailed_report'])) {
    // Crear conexión a la base de datos
    $conn = Activarmysql();
    
    // Obtener los tipos de competición
    $sql_tipos_competicion = "SELECT id, codigo, descripcion_esp FROM ttipo_competicion";
    $result_tipos = $conn->query($sql_tipos_competicion);
    
    $tipos_competicion = [];
    if ($result_tipos->num_rows > 0) {
        while($row = $result_tipos->fetch_assoc()) {
            $tipos_competicion[$row['codigo']] = [
                'id' => $row['id'],
                'nombre' => $row['descripcion_esp']
            ];
        }
    }
    
    // Obtener los tipos de presentación
    $sql_tipos_presentacion = "SELECT id, codigo, descripcion_esp FROM ttipo_presentacion";
    $result_presentacion = $conn->query($sql_tipos_presentacion);
    
    $tipos_presentacion = [];
    if ($result_presentacion->num_rows > 0) {
        while($row = $result_presentacion->fetch_assoc()) {
            $tipos_presentacion[$row['codigo']] = [
                'id' => $row['id'],
                'nombre' => $row['descripcion_esp']
            ];
        }
    }
    
    // Obtener información de los evaluadores (si tipousuario es 'E' o 'evaluador')
    $sql_evaluadores = "SELECT id, nombre FROM tusuario WHERE tipousuario IN ('E', 'evaluador')";
    $result_evaluadores = $conn->query($sql_evaluadores);
    
    $evaluadores = [];
    if ($result_evaluadores && $result_evaluadores->num_rows > 0) {
        while($row = $result_evaluadores->fetch_assoc()) {
            $evaluadores[$row['id']] = $row['nombre'];
        }
    }
    
    // Función para obtener los trabajos por tipo de competición
    function obtenerTrabajosPorCompeticion($conn, $codCompeticion, $tipos_presentacion, $evaluadores) {
        $sql = "SELECT 
    t.id,
    t.codigo,
    t.cod_tipo_competicion_propuesto,
    t.cod_tipo_presentacion_propuesto,
    t.cod_tipo_presentacion_aprobado,
    t.titulo,
    t.introduccion,
    t.materiales,
    t.resultados,
    t.conclusiones,
    t.pais,
    t.ciudad,
    t.nro_autores,
    t.email,
    t.apellido_corresponsal,
    t.nombre_corresponsal,
    t.area_tematica,
    t.evaluador1,
    t.evaluador2,
    t.evaluador3,
    (t.calificacion1_1 + t.calificacion1_2 + t.calificacion1_3 + t.calificacion1_4 + t.calificacion1_5 + t.calificacion1_6) AS calificacion_evaluador1,
    (t.calificacion2_1 + t.calificacion2_2 + t.calificacion2_3 + t.calificacion2_4 + t.calificacion2_5 + t.calificacion2_6) AS calificacion_evaluador2,
    (t.calificacion3_1 + t.calificacion3_2 + t.calificacion3_3 + t.calificacion3_4 + t.calificacion3_5 + t.calificacion3_6) AS calificacion_evaluador3,
    ROUND((
        (t.calificacion1_1 + t.calificacion1_2 + t.calificacion1_3 + t.calificacion1_4 + t.calificacion1_5 + t.calificacion1_6) +
        (t.calificacion2_1 + t.calificacion2_2 + t.calificacion2_3 + t.calificacion2_4 + t.calificacion2_5 + t.calificacion2_6) +
        (t.calificacion3_1 + t.calificacion3_2 + t.calificacion3_3 + t.calificacion3_4 + t.calificacion3_5 + t.calificacion3_6)
    ) / 3, 2) AS promedio_calificacion,
    t.autores,
    t.inst_autor1,
    CONCAT(t.titulo_autor1, ' ', t.autor1, ' ', t.apellido_autor1) AS autor1_completo,
    CONCAT(t.titulo_autor2, ' ', t.autor2, ' ', t.apellido_autor2) AS autor2_completo,
    CONCAT(t.titulo_autor3, ' ', t.autor3, ' ', t.apellido_autor3) AS autor3_completo,
    CONCAT(t.titulo_autor4, ' ', t.autor4, ' ', t.apellido_autor4) AS autor4_completo,
    CONCAT(t.titulo_autor5, ' ', t.autor5, ' ', t.apellido_autor5) AS autor5_completo,
    CONCAT(t.titulo_autor6, ' ', t.autor6, ' ', t.apellido_autor6) AS autor6_completo,
    CONCAT(t.titulo_autor7, ' ', t.autor7, ' ', t.apellido_autor7) AS autor7_completo,
    CONCAT(t.titulo_autor8, ' ', t.autor8, ' ', t.apellido_autor8) AS autor8_completo,
    CONCAT(t.titulo_autor9, ' ', t.autor9, ' ', t.apellido_autor9) AS autor9_completo,
    CONCAT(t.titulo_autor10, ' ', t.autor10, ' ', t.apellido_autor10) AS autor10_completo
FROM 
    ttrabajo t
WHERE 
    t.cod_tipo_competicion_propuesto = ? 
    AND t.calificacion1_fecha IS NOT NULL 
    AND t.calificacion2_fecha IS NOT NULL 
    AND t.calificacion3_fecha IS NOT NULL
ORDER BY 
    t.pais ASC, promedio_calificacion DESC;";
        
        $stmt = $conn->prepare($sql);
        $stmt->bind_param("s", $codCompeticion);
        $stmt->execute();
        $result = $stmt->get_result();
        
        $trabajos = [];
        if ($result->num_rows > 0) {
            while($row = $result->fetch_assoc()) {
                // Preparar el tipo de presentación
                $tipo_presentacion = "No definido";
                if (!empty($row['cod_tipo_presentacion_aprobado']) && isset($tipos_presentacion[$row['cod_tipo_presentacion_aprobado']])) {
                    $tipo_presentacion = $tipos_presentacion[$row['cod_tipo_presentacion_aprobado']]['nombre'];
                } else if (!empty($row['cod_tipo_presentacion_propuesto']) && isset($tipos_presentacion[$row['cod_tipo_presentacion_propuesto']])) {
                    $tipo_presentacion = $tipos_presentacion[$row['cod_tipo_presentacion_propuesto']]['nombre'];
                }
                
                // Nombres de evaluadores
                $evaluador1 = isset($evaluadores[$row['evaluador1']]) ? $evaluadores[$row['evaluador1']] : "No asignado";
                $evaluador2 = isset($evaluadores[$row['evaluador2']]) ? $evaluadores[$row['evaluador2']] : "No asignado";
                $evaluador3 = isset($evaluadores[$row['evaluador3']]) ? $evaluadores[$row['evaluador3']] : "No asignado";
                
                // Calificaciones de cada evaluador (sin redondeo)
                $calificacion_eval1 = $row['calificacion_evaluador1'];
                $calificacion_eval2 = $row['calificacion_evaluador2'];
                $calificacion_eval3 = $row['calificacion_evaluador3'];
                $promedio_calificacion = $row['promedio_calificacion'];
                
                // Lista completa de autores
                $todos_autores = [];
                for ($i = 1; $i <= 10; $i++) {
                    if (!empty($row["autor{$i}_completo"]) && $row["autor{$i}_completo"] != '  ') {
                        $todos_autores[] = trim($row["autor{$i}_completo"]);
                    }
                }
                $lista_autores = implode("; ", $todos_autores);
                
                // Agregar trabajo al array
                $trabajos[] = [
                    'codigo' => $row['codigo'],
                    'categoria' => $codCompeticion,
                    'tipo_presentacion' => $tipo_presentacion,
                    'introduccion' => $row['introduccion'],
                    'materiales' => $row['materiales'],
                    'resultados' => $row['resultados'],
                    'conclusiones' => $row['conclusiones'],
                    'pais' => $row['pais'],
                    'institucion' => $row['inst_autor1'],
                    'corresponsal' => trim($row['nombre_corresponsal'] . ' ' . $row['apellido_corresponsal']),
                    'email' => $row['email'],
                    'nro_autores' => $row['nro_autores'],
                    'todos_autores' => $lista_autores,
                    'evaluador1' => $evaluador1,
                    'evaluador2' => $evaluador2,
                    'evaluador3' => $evaluador3,
                    'calificacion_eval1' => $calificacion_eval1,
                    'calificacion_eval2' => $calificacion_eval2,
                    'calificacion_eval3' => $calificacion_eval3,
                    'calificacion_promedio' => $promedio_calificacion
                ];
            }
        }
        
        $stmt->close();
        return $trabajos;
    }
    
    // Crear archivos CSV separados para cada tipo de competición
    foreach ($tipos_competicion as $codigo => $tipo) {
        // Obtener los trabajos para este tipo de competición
        $trabajos = obtenerTrabajosPorCompeticion($conn, $codigo, $tipos_presentacion, $evaluadores);
        
        if (count($trabajos) > 0) {
            // Nombre del archivo
            $filename = 'resumen_' . sanitizeFileName($tipo['nombre']) . '_' . date('Y-m-d') . '.csv';
            
            // Crear un archivo temporal para este tipo de competición
            $output = fopen('php://temp', 'r+');
            
            // Establecer el delimitador de campos correcto para Excel
            fprintf($output, chr(0xEF).chr(0xBB).chr(0xBF)); // Escribir BOM para UTF-8
            
            // Escribir los encabezados
            fputcsv($output, [
                'Código', 
                'Categoría', 
                'Tipo de Presentación', 
                'Introducción', 
                'Materiales', 
                'Resultados', 
                'Conclusiones', 
                'País', 
                'Institución', 
                'Presentador', 
                'Email', 
                'Número de Autores', 
                'Todos los Autores', 
                'Evaluador 1', 
                'Evaluador 2', 
                'Evaluador 3', 
                'Calificación Evaluador 1', 
                'Calificación Evaluador 2', 
                'Calificación Evaluador 3', 
                'Calificación Promedio'
            ]);
            
            // Escribir los datos
            foreach ($trabajos as $trabajo) {
                // Para evitar problemas con caracteres especiales y etiquetas HTML
                $fila = [
                    $trabajo['codigo'],
                    $tipo['nombre'],
                    $trabajo['tipo_presentacion'],
                    html_entity_decode(strip_tags($trabajo['introduccion']), ENT_QUOTES, 'UTF-8'),
                    html_entity_decode(strip_tags($trabajo['materiales']), ENT_QUOTES, 'UTF-8'),
                    html_entity_decode(strip_tags($trabajo['resultados']), ENT_QUOTES, 'UTF-8'),
                    html_entity_decode(strip_tags($trabajo['conclusiones']), ENT_QUOTES, 'UTF-8'),
                    $trabajo['pais'],
                    $trabajo['institucion'],
                    $trabajo['corresponsal'],
                    $trabajo['email'],
                    $trabajo['nro_autores'],
                    $trabajo['todos_autores'],
                    $trabajo['evaluador1'],
                    $trabajo['evaluador2'],
                    $trabajo['evaluador3'],
                    $trabajo['calificacion_eval1'],
                    $trabajo['calificacion_eval2'],
                    $trabajo['calificacion_eval3'],
                    $trabajo['calificacion_promedio']
                ];
                fputcsv($output, $fila);
            }
            
            // Guardar contenido en un array
            rewind($output);
            $csv_content[$codigo] = stream_get_contents($output);
            fclose($output);
        }
    }
    
    // Crear un archivo ZIP para contener todos los CSV
    $zip_file = 'reporte_detallado_' . date('Y-m-d') . '.zip';
    $zip = new ZipArchive();
    
    // Crear archivo ZIP temporal
    $temp_file = tempnam(sys_get_temp_dir(), 'zip');
    
    if ($zip->open($temp_file, ZipArchive::CREATE) === TRUE) {
        // Añadir cada CSV al archivo ZIP
        foreach ($csv_content as $codigo => $content) {
            $filename = 'resumen_' . sanitizeFileName($tipos_competicion[$codigo]['nombre']) . '.csv';
            $zip->addFromString($filename, $content);
        }
        
        // Cerrar el ZIP
        $zip->close();
        
        // Leer el contenido del archivo ZIP
        $zip_content = file_get_contents($temp_file);
        
        // Eliminar el archivo temporal
        unlink($temp_file);
        
        // Configurar cabeceras para la descarga
        header('Content-Type: application/zip');
        header('Content-Disposition: attachment; filename="' . $zip_file . '"');
        header('Content-Length: ' . strlen($zip_content));
        header('Cache-Control: max-age=0');
        
        // Enviar el contenido del ZIP
        echo $zip_content;
        exit;
    } else {
        // Si falla la creación del ZIP, enviar un solo CSV con todos los datos
        header('Content-Type: text/csv; charset=utf-8');
        header('Content-Disposition: attachment; filename="reporte_detallado_' . date('Y-m-d') . '.csv"');
        
        $output = fopen('php://output', 'w');
        
        // Escribir BOM para UTF-8
        fprintf($output, chr(0xEF).chr(0xBB).chr(0xBF));
        
        // Escribir encabezados
        fputcsv($output, [
            'Código', 
            'Categoría', 
            'Tipo de Presentación', 
            'Introducción', 
            'Materiales', 
            'Resultados', 
            'Conclusiones', 
            'País', 
            'Institución', 
            'Presentador', 
            'Email', 
            'Número de Autores', 
            'Todos los Autores', 
            'Evaluador 1', 
            'Evaluador 2', 
            'Evaluador 3', 
            'Calificación Evaluador 1', 
            'Calificación Evaluador 2', 
            'Calificación Evaluador 3', 
            'Calificación Promedio'
        ]);
        
        // Escribir todos los datos
        foreach ($tipos_competicion as $codigo => $tipo) {
            $trabajos = obtenerTrabajosPorCompeticion($conn, $codigo, $tipos_presentacion, $evaluadores);
            
            foreach ($trabajos as $trabajo) {
                $fila = [
                    $trabajo['codigo'],
                    $tipo['nombre'],
                    $trabajo['tipo_presentacion'],
                    html_entity_decode(strip_tags($trabajo['introduccion']), ENT_QUOTES, 'UTF-8'),
                    html_entity_decode(strip_tags($trabajo['materiales']), ENT_QUOTES, 'UTF-8'),
                    html_entity_decode(strip_tags($trabajo['resultados']), ENT_QUOTES, 'UTF-8'),
                    html_entity_decode(strip_tags($trabajo['conclusiones']), ENT_QUOTES, 'UTF-8'),
                    $trabajo['pais'],
                    $trabajo['institucion'],
                    $trabajo['corresponsal'],
                    $trabajo['email'],
                    $trabajo['nro_autores'],
                    $trabajo['todos_autores'],
                    $trabajo['evaluador1'],
                    $trabajo['evaluador2'],
                    $trabajo['evaluador3'],
                    $trabajo['calificacion_eval1'],
                    $trabajo['calificacion_eval2'],
                    $trabajo['calificacion_eval3'],
                    $trabajo['calificacion_promedio']
                ];
                fputcsv($output, $fila);
            }
        }
        
        fclose($output);
        exit;
    }
}

// Función para sanitizar nombres de archivo
function sanitizeFileName($filename) {
    // Eliminar caracteres especiales y acentos
    $filename = preg_replace('/[áàäâãå]/ui', 'a', $filename);
    $filename = preg_replace('/[éèëê]/ui', 'e', $filename);
    $filename = preg_replace('/[íìïî]/ui', 'i', $filename);
    $filename = preg_replace('/[óòöôõø]/ui', 'o', $filename);
    $filename = preg_replace('/[úùüû]/ui', 'u', $filename);
    $filename = preg_replace('/[ñ]/ui', 'n', $filename);
    $filename = preg_replace('/[ç]/ui', 'c', $filename);
    
    // Sustituir espacios por guiones bajos
    $filename = str_replace(' ', '_', $filename);
    
    // Mantener solo caracteres alfanuméricos, guión y guión bajo
    $filename = preg_replace('/[^a-z0-9_-]/i', '', $filename);
    
    return strtolower($filename);
}
?>




<!-- Script para mostrar animación al hacer clic en el botón -->
<script>
document.addEventListener('DOMContentLoaded', function() {
    const btnDetailedReport = document.querySelector('.btn-export.btn-detailed-report');
    if (btnDetailedReport) {
        btnDetailedReport.addEventListener('click', function() {
            // Mostrar indicador de carga
            this.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Generando informe...';
            this.classList.add('downloading');
            
            // Mostrar mensaje de proceso
            const processingMsg = document.createElement('div');
            processingMsg.className = 'alert alert-info alert-dismissible fade show mt-3';
            processingMsg.innerHTML = `
                <strong><i class="fas fa-spinner fa-spin"></i> Procesando...</strong> 
                Generando informe detallado. Esto puede tomar varios segundos dependiendo de la cantidad de datos.
                <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
            `;
            
            document.querySelector('.export-buttons').insertAdjacentElement('afterend', processingMsg);
        });
    }
});
</script>

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Dashboard de Resúmenes Científicos</title>
    
    <!-- Bootstrap y Font Awesome -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
    
    <style>
        :root {
            --primary-color: #377970;
            --secondary-color: #16222A;
            --accent-color: #e74c3c;
            --light-color: #ecf0f1;
            --dark-color: #383838;
        }
        
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            background-color: #f5f7fa;
            color: var(--dark-color);
        }
        
        .dashboard-header {
            background: linear-gradient(to right, var(--primary-color), var(--secondary-color));
            color: white;
            padding: 1.5rem;
            margin-bottom: 2rem;
            border-radius: 0 0 10px 10px;
            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
        }
        
        .card {
            border-radius: 10px;
            border: none;
            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            overflow: hidden;
            margin-bottom: 1.5rem;
        }
        
        .card:hover {
            transform: translateY(-5px);
            box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1);
        }
        
        .card-header {
            background-color: var(--secondary-color);
            color: white;
            font-weight: 600;
            padding: 1rem;
            border-bottom: none;
            display: flex;
            justify-content: space-between;
            align-items: center;
            text-align: center;
        }
        
        .country-header {
            cursor: pointer;
        }
        
        .card-body {
            padding: 1.5rem;
        }
        
        .table {
            width: 100%;
            border-collapse: separate;
            border-spacing: 0;
        }
        
        .table th {
            background-color: var(--light-color);
            color: var(--dark-color);
            font-weight: 600;
            padding: 0.75rem 1rem;
            border: none;
            text-align: center;
        }
        
        .table td {
            padding: 0.75rem 1rem;
            border-top: 1px solid #e0e5e9;
            vertical-align: middle;
        }
        
        .table td.titulo {
            text-align: justify;
            text-transform: uppercase;
        }
        
        .table tr:hover {
            background-color: rgba(52, 152, 219, 0.05);
        }
        
        .stats-card {
            text-align: center;
            padding: 1.5rem;
            border-radius: 15px;
            background: linear-gradient(145deg, var(--light-color), #ffffff);
            box-shadow: 0 8px 20px rgba(0, 0, 0, 0.1);
            transition: transform 0.3s ease;
        }
        
        .stats-card:hover {
            transform: translateY(-5px);
        }
        
        .stats-card h3 {
            font-size: 3rem;
            font-weight: 700;
            margin-bottom: 0.5rem;
            color: var(--secondary-color);
            text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.1);
        }
        
        .stats-card p {
            color: #7f8c8d;
            margin-bottom: 0;
            font-size: 1.2rem;
            font-weight: 500;
        }
        
        .trabajos-count {
            display: flex;
            flex-direction: column;
            align-items: center;
            background-color: rgba(255, 255, 255, 0.2);
            padding: 0.5rem 1rem;
            border-radius: 15px;
            min-width: 80px;
        }
        
        .count-number {
            font-size: 2rem;
            font-weight: 700;
            line-height: 1;
            color: white;
            text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.2);
        }
        
        .count-label {
            font-size: 0.9rem;
            color: rgba(255, 255, 255, 0.9);
        }
        
        .calificacion {
            font-weight: bold;
            min-width: 50px;
            text-align: center;
            display: inline-block;
            padding: 0.25rem 0.5rem;
            border-radius: 4px;
        }
        
        .excelente {
            background-color: #2ecc71;
            color: white;
        }
        
        .bueno {
            background-color: #3498db;
            color: white;
        }
        
        .regular {
            background-color: #f39c12;
            color: white;
        }
        
        .deficiente {
            background-color: #e74c3c;
            color: white;
        }
        
        .flag-img {
            margin-right: 0.5rem;
            vertical-align: middle;
            border: 1px solid #ddd;
            border-radius: 2px;
        }
        
        .trophy {
            font-size: 1.8rem;
            margin-right: 0.5rem;
        }
        
        .gold {
            color: #FFD700;
            text-shadow: 0 0 5px rgba(255, 215, 0, 0.5);
        }
        
        .silver {
            color: #C0C0C0;
            text-shadow: 0 0 5px rgba(192, 192, 192, 0.5);
        }
        
        .bronze {
            color: #CD7F32;
            text-shadow: 0 0 5px rgba(205, 127, 50, 0.5);
        }
        
        .deficient-medal {
            color: #95a5a6;
            font-size: 1.6rem;
            text-shadow: 0 0 5px rgba(149, 165, 166, 0.5);
        }
        
        .podium {
            background: linear-gradient(to right, var(--primary-color), var(--secondary-color));
            border-radius: 15px;
            color: white;
            padding: 2rem 0;
            margin-bottom: 2rem;
            box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1);
        }
        
        .podium-header {
            text-align: center;
            margin-bottom: 1.5rem;
        }
        
        .podium-header h2 {
            font-weight: 700;
            text-transform: uppercase;
            letter-spacing: 2px;
            margin-bottom: 0;
            text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.2);
        }
        
        .podium-positions {
            display: flex;
            justify-content: center;
            align-items: flex-end;
            gap: 1rem;
            padding: 0 1rem;
        }
        
        .podium-position {
            text-align: center;
            padding: 1rem;
            border-radius: 10px;
            transition: transform 0.3s ease;
            width: 100%;
            max-width: 300px;
        }
        
        .podium-position:hover {
            transform: translateY(-10px);
        }
        
        .position-1 {
            background-color: rgba(255, 215, 0, 0.3);
            border: 2px solid #FFD700;
            height: 300px;
            display: flex;
            flex-direction: column;
            justify-content: flex-end;
            z-index: 3;
        }
        
        .position-2 {
            background-color: rgba(192, 192, 192, 0.3);
            border: 2px solid #C0C0C0;
            height: 250px;
            display: flex;
            flex-direction: column;
            justify-content: flex-end;
            z-index: 2;
        }
        
        .position-3 {
            background-color: rgba(205, 127, 50, 0.3);
            border: 2px solid #CD7F32;
            height: 250px;
            display: flex;
            flex-direction: column;
            justify-content: flex-end;
            z-index: 1;
        }
        
        .position-trophy {
            font-size: 3rem;
            margin-bottom: 0.5rem;
        }
        
        .position-number {
            font-size: 2.5rem;
            font-weight: 800;
            margin-bottom: 0.5rem;
            text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
        }
        
        .position-codigo {
            font-size: 1.2rem;
            font-weight: 600;
            margin-bottom: 0.5rem;
            background: rgba(255, 255, 255, 0.2);
            padding: 0.3rem 0.8rem;
            border-radius: 30px;
            display: inline-block;
        }
        
        .position-calificacion {
            font-size: 1.5rem;
            font-weight: 700;
            margin-bottom: 0.5rem;
        }
        
        .position-pais {
            display: flex;
            align-items: center;
            justify-content: center;
            margin-top: 0.5rem;
        }
        
        .position-flag {
            margin-right: 0.5rem;
        }
        
        .truncate-text {
            white-space: nowrap;
            overflow: hidden;
            text-overflow: ellipsis;
            max-width: 100%;
        }
        
        .position-title {
            white-space: nowrap;
            overflow: hidden;
            text-overflow: ellipsis;
            max-width: 100%;
            background: rgba(255, 255, 255, 0.2);
            padding: 5px 10px;
            border-radius: 5px;
            margin: 5px 0;
            cursor: help;
        }
        
        /* Botones de exportación */
        .export-buttons {
            margin-bottom: 20px;
            display: flex;
            justify-content: flex-end;
            gap: 10px;
        }
        
        .btn-export {
            display: flex;
            align-items: center;
            gap: 8px;
            padding: 8px 16px;
            border-radius: 8px;
            font-weight: 600;
            text-decoration: none;
            transition: all 0.3s ease;
            box-shadow: 0 2px 5px rgba(0,0,0,0.15);
        }
        
        .btn-pdf {
            background-color: #e74c3c;
            color: white;
            border: none;
        }
        
        .btn-pdf:hover {
            background-color: #c0392b;
            color: white;
            transform: translateY(-2px);
            box-shadow: 0 4px 8px rgba(0,0,0,0.2);
        }
        
        .btn-excel {
            background-color: #27ae60;
            color: white;
            border: none;
        }
        
        .btn-excel:hover {
            background-color: #2ecc71;
            color: white;
            transform: translateY(-2px);
            box-shadow: 0 4px 8px rgba(0,0,0,0.2);
        }
        
        /* Botón de abstract científico */
        .btn-scientific, .btn-export.btn-abstract {
            background: linear-gradient(135deg, #4b6cb7, #182848);
            color: white;
            border: none;
            transition: all 0.3s ease;
            box-shadow: 0 2px 5px rgba(0,0,0,0.1);
            text-decoration: none;
            display: inline-flex;
            align-items: center;
            justify-content: center;
        }
        
        .btn-scientific {
            padding: 6px 12px;
            border-radius: 4px;
            font-weight: 500;
            font-size: 0.875rem;
        }
        
        .btn-scientific:hover, .btn-export.btn-abstract:hover {
            background: linear-gradient(135deg, #182848, #4b6cb7);
            color: white;
            transform: translateY(-2px);
            box-shadow: 0 4px 8px rgba(0,0,0,0.2);
        }
        
        .btn-scientific:active, .btn-export.btn-abstract:active {
            transform: translateY(0);
            box-shadow: 0 2px 3px rgba(0,0,0,0.1);
        }
        
        /* Efecto para botón descargando */
        .btn-export.downloading, .btn-scientific.loading {
            pointer-events: none;
            opacity: 0.8;
            position: relative;
        }
        
        .btn-export.downloading:after, .btn-scientific.loading:after {
            content: "";
            position: absolute;
            width: 100%;
            height: 2px;
            bottom: 0;
            left: 0;
            background: white;
            animation: loading 2s infinite;
        }
        
        @keyframes loading {
            0% { width: 0; left: 0; }
            50% { width: 100%; left: 0; }
            100% { width: 0; left: 100%; }
        }
        
        /* Modal para abstract científico */
        #abstractModal .modal-header {
            background: linear-gradient(135deg, #3498db, #2980b9);
            color: white;
            border-bottom: none;
            padding: 1rem 1.5rem;
        }
        
        #abstractModal .modal-content {
            border-radius: 10px;
            overflow: hidden;
            border: none;
            box-shadow: 0 5px 15px rgba(0,0,0,0.2);
        }
        
        #abstractModal .list-group-item {
            transition: all 0.2s ease;
            border-left: 3px solid transparent;
        }
        
        #abstractModal .list-group-item:hover {
            background-color: rgba(52, 152, 219, 0.05);
            border-left: 3px solid #3498db;
        }
        
        #abstractModal .badge {
            padding: 0.5em 0.8em;
            font-weight: 600;
            border-radius: 30px;
        }
        
        @media (max-width: 991px) {
            .podium-positions {
                flex-direction: column;
                align-items: center;
            }
            
            .podium-position {
                height: auto !important;
                width: 100%;
                max-width: 100%;
            }
            
            .export-buttons {
                justify-content: center;
                flex-wrap: wrap;
            }
        }
    
    .btn-detailed-report {
        background-color: #8e44ad;
        color: white;
        border: none;
    }
    
    .btn-detailed-report:hover {
        background-color: #9b59b6;
        color: white;
        transform: translateY(-2px);
        box-shadow: 0 4px 8px rgba(0,0,0,0.2);
    }
    
    .btn-excel-detallado {
    background-color: #16a085;
    color: white;
    border: none;
}

.btn-excel-detallado:hover {
    background-color: #1abc9c;
    color: white;
    transform: translateY(-2px);
    box-shadow: 0 4px 8px rgba(0,0,0,0.2);
}

    </style>
    
    <!-- Script para mostrar animación al hacer clic en el botón -->
<script>
document.addEventListener('DOMContentLoaded', function() {
    const btnDetailedReport = document.querySelector('.btn-export.btn-detailed-report');
    if (btnDetailedReport) {
        btnDetailedReport.addEventListener('click', function() {
            // Mostrar indicador de carga
            this.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Generando informe...';
            this.classList.add('downloading');
            
            // Mostrar mensaje de proceso
            const processingMsg = document.createElement('div');
            processingMsg.className = 'alert alert-info alert-dismissible fade show mt-3';
            processingMsg.innerHTML = `
                <strong><i class="fas fa-spinner fa-spin"></i> Procesando...</strong> 
                Generando informe detallado. Esto puede tomar varios segundos dependiendo de la cantidad de datos.
                <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
            `;
            
            document.querySelector('.export-buttons').insertAdjacentElement('afterend', processingMsg);
        });
    }
});
</script>
</head>
<body>
    <div class="dashboard-header">
        <div class="container">
            <h1><i class="fas fa-chart-line me-2"></i> Dashboard de Resúmenes Científicos</h1>
            <p>Visualización de trabajos completamente evaluados por país</p>
        </div>
    </div>
    
    <div class="container">
        <?php if(isset($_GET['error'])): ?>
        <div class="alert alert-danger alert-dismissible fade show" role="alert">
            <strong><i class="fas fa-exclamation-triangle"></i> Error:</strong>
            <?php 
                $error_msg = '';
                if($_GET['error'] == 'pdf_library_missing') {
                    $error_msg = 'No se pudo generar el PDF porque falta la biblioteca TCPDF. Contacte al administrador.';
                } elseif($_GET['error'] == 'trabajo_no_encontrado') {
                    $error_msg = 'No se encontró el trabajo especificado.';
                } else {
                    $error_msg = 'Ha ocurrido un error al generar el PDF.';
                }
                echo $error_msg;
            ?>
            <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
        </div>
        <?php endif; ?>
        
        <!-- Botones de exportación -->
<!-- Botón para generar informe detallado -->
<!-- Reemplazar el botón actual de Abstracts Científicos con este código -->
<div class="export-buttons">
    <a href="?export=pdf" class="btn btn-export btn-pdf">
        <i class="fas fa-file-pdf"></i> Exportar a PDF
    </a>
    <a href="?export=excel" class="btn btn-export btn-excel">
        <i class="fas fa-file-excel"></i> Exportar a CSV
    </a>
    <!-- Botón modificado para abstracts científicos -->
    <div class="dropdown d-inline-block">
        <button class="btn btn-export btn-abstract dropdown-toggle" type="button" id="dropdownAbstractsButton" data-bs-toggle="dropdown" aria-expanded="false">
            <i class="fas fa-graduation-cap"></i> Abstracts Científicos
        </button>
        <ul class="dropdown-menu" aria-labelledby="dropdownAbstractsButton">
            <li><a class="dropdown-item" href="?export_all_abstracts=true">
                <i class="fas fa-file-pdf me-2"></i> Generar todos los abstracts
            </a></li>
            <li><hr class="dropdown-divider"></li>
            <li><a class="dropdown-item" href="#" id="btn-select-abstract">
                <i class="fas fa-list-check me-2"></i> Seleccionar trabajo individual
            </a></li>
        </ul>
    </div>
    <a href="envio_certificados.php" class="btn btn-export btn-certificate">
        <i class="fas fa-award"></i> Certificados
    </a>
    <a href="?export=excel_detallado" class="btn btn-export btn-excel-detallado">
        <i class="fas fa-table"></i> Informe Detallado en Excel
    </a>
</div>

<!-- Agregar este script para manejar el botón "Seleccionar trabajo individual" -->
<script>
document.addEventListener('DOMContentLoaded', function() {
    const btnSelectAbstract = document.getElementById('btn-select-abstract');
    if (btnSelectAbstract) {
        btnSelectAbstract.addEventListener('click', function(e) {
            e.preventDefault();
            
            // Crear modal para seleccionar trabajos
            const modalHTML = `
                <div class="modal fade" id="abstractModal" tabindex="-1" aria-labelledby="abstractModalLabel" aria-hidden="true">
                    <div class="modal-dialog modal-lg">
                        <div class="modal-content">
                            <div class="modal-header" style="background-color: #3498db; color: white;">
                                <h5 class="modal-title" id="abstractModalLabel">
                                    <i class="fas fa-graduation-cap me-2"></i>Generar Abstract Científico Individual
                                </h5>
                                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                            </div>
                            <div class="modal-body">
                                <p>Seleccione el trabajo para generar su abstract en formato científico:</p>
                                <div class="list-group">
                                    <?php foreach ($trabajos as $trabajo): ?>
                                    <a href="?export_abstract=true&id=<?php echo $trabajo['id']; ?>" class="list-group-item list-group-item-action">
                                        <div class="d-flex w-100 justify-content-between">
                                            <h5 class="mb-1"><?php echo $trabajo['codigo']; ?></h5>
                                            <small>
                                                <span class="badge bg-primary"><?php echo $trabajo['promedio_calificacion']; ?></span>
                                            </small>
                                        </div>
                                        <p class="mb-1"><?php echo htmlspecialchars($trabajo['titulo']); ?></p>
                                        <small><?php echo $trabajo['pais']; ?></small>
                                    </a>
                                    <?php endforeach; ?>
                                </div>
                            </div>
                            <div class="modal-footer">
                                <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cerrar</button>
                            </div>
                        </div>
                    </div>
                </div>
            `;
            
            // Insertar modal en el documento
            document.body.insertAdjacentHTML('beforeend', modalHTML);
            
            // Mostrar modal
            const modal = new bootstrap.Modal(document.getElementById('abstractModal'));
            modal.show();
            
            // Eliminar modal cuando se cierre
            document.getElementById('abstractModal').addEventListener('hidden.bs.modal', function () {
                this.remove();
            });
            
            // Agregar efecto de carga a los enlaces del modal
            const modalLinks = document.querySelectorAll('#abstractModal a.list-group-item');
            modalLinks.forEach(link => {
                link.addEventListener('click', function() {
                    // Mostrar icono de carga
                    const loadingIcon = document.createElement('i');
                    loadingIcon.className = 'fas fa-spinner fa-spin ms-2';
                    this.appendChild(loadingIcon);
                    
                    // Deshabilitar otros enlaces
                    modalLinks.forEach(otherLink => {
                        if (otherLink !== this) {
                            otherLink.classList.add('disabled');
                            otherLink.style.opacity = '0.5';
                        }
                    });
                });
            });
        });
    }
    
    // Agregar efecto de carga para el botón de generar todos los abstracts
    const btnGenerateAllAbstracts = document.querySelector('.dropdown-item[href="?export_all_abstracts=true"]');
    if (btnGenerateAllAbstracts) {
        btnGenerateAllAbstracts.addEventListener('click', function() {
            // Crear mensaje de procesamiento
            const processingMsg = document.createElement('div');
            processingMsg.className = 'alert alert-info alert-dismissible fade show mt-3';
            processingMsg.innerHTML = `
                <strong><i class="fas fa-spinner fa-spin"></i> Procesando...</strong> 
                Generando documento PDF con todos los abstracts científicos. Esto puede tomar varios segundos.
                <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
            `;
            
            // Insertar mensaje después de los botones de exportación
            document.querySelector('.export-buttons').insertAdjacentElement('afterend', processingMsg);
            
            // Mostrar texto de procesamiento en el botón
            this.innerHTML = '<i class="fas fa-spinner fa-spin me-2"></i> Generando PDF...';
            
            // Deshabilitar el botón para evitar clics múltiples
            this.classList.add('disabled');
        });
    }
});
</script>

<!-- Agregar estos estilos para el botón de dropdown de abstracts -->
<style>
.dropdown-menu {
    border-radius: 8px;
    box-shadow: 0 4px 15px rgba(0,0,0,0.15);
    border: none;
    padding: 0.5rem 0;
}

.dropdown-item {
    padding: 0.6rem 1.2rem;
    transition: all 0.2s ease;
}

.dropdown-item:hover {
    background-color: #edf7fd;
}

.dropdown-item:active {
    background-color: #3498db;
    color: white;
}

.dropdown-divider {
    margin: 0.3rem 0;
}
</style>
        <!-- Tabla principal de trabajos -->
        <div class="card mb-4">
            <div class="card-header">
                <h4 class="mb-0">
                    <i class="fas fa-file-alt me-2"></i>
                    Todos los Trabajos Evaluados
                </h4>
            </div>
            <div class="card-body">
                <div class="table-responsive">
                    <table class="table">
                        <thead>
                            <tr>
                                <th>CÓDIGO</th>
                                <th>TÍTULO</th>
                                <th>CALIFICACIÓN</th>
                                <th>ACCIONES</th>
                            </tr>
                        </thead>
                        <tbody>
                            <?php foreach ($trabajos as $trabajo): ?>
                                <tr>
                                    <td class="text-center"><?php echo $trabajo['codigo']; ?></td>
                                    <td class="titulo"><?php echo strtoupper(htmlspecialchars($trabajo['titulo'])); ?></td>
                                    <td class="text-center">
                                        <?php
                                            $calificacion = floatval($trabajo['promedio_calificacion']);
                                            $clase = '';
                                            $trophy = '';
                                            
                                            if ($calificacion >= 90) {
                                                $clase = 'excelente';
                                                $trophy = '<i class="fas fa-trophy gold trophy" title="Excelente"></i>';
                                            } elseif ($calificacion >= 75) {
                                                $clase = 'bueno';
                                                $trophy = '<i class="fas fa-trophy silver trophy" title="Bueno"></i>';
                                            } elseif ($calificacion >= 60) {
                                                $clase = 'regular';
                                                $trophy = '<i class="fas fa-trophy bronze trophy" title="Regular"></i>';
                                            } else {
                                                $clase = 'deficiente';
                                                $trophy = '<i class="fas fa-medal deficient-medal" title="Por mejorar"></i>';
                                            }
                                        ?>
                                        <?php echo $trophy; ?>
                                        <span class="calificacion <?php echo $clase; ?>">
                                            <?php echo number_format($trabajo['promedio_calificacion'], 2); ?>
                                        </span>
                                    </td>
                                    <td>
                                        <a href="?export_abstract=true&id=<?php echo $trabajo['id']; ?>" class="btn btn-scientific">
                                            <i class="fas fa-file-pdf me-1"></i> Abstract
                                        </a>
                                        
                                       
                                  </td>
                                  
                                </tr>
                            <?php endforeach; ?>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
        
      

    <!-- Bootstrap Bundle with Popper -->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
     <script> 
document.addEventListener('DOMContentLoaded', function() {
    // Habilitar tooltips en todo el documento
    const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
    tooltipTriggerList.forEach(function(tooltipTriggerEl) {
        new bootstrap.Tooltip(tooltipTriggerEl, {
            trigger: 'hover',
            placement: 'top',
            html: true
        });
    });
    
    // Alternar visibilidad de secciones
    const countryHeaders = document.querySelectorAll('.country-header');
    countryHeaders.forEach(header => {
        header.addEventListener('click', function() {
            const target = this.getAttribute('data-bs-target');
            const content = document.querySelector(target);
            if (content.classList.contains('show')) {
                content.classList.remove('show');
            } else {
                content.classList.add('show');
            }
        });
    });
    
    // Animación para botones de exportación
    const exportButtons = document.querySelectorAll('.btn-export');
    exportButtons.forEach(button => {
        button.addEventListener('click', function(e) {
            // Si es el botón de abstracts o certificados, no aplicar la animación ya que abre un modal
            if (this.classList.contains('btn-abstract') || this.classList.contains('btn-certificate')) {
                return;
            }
            
            // Animación visual antes de la descarga
            this.classList.add('downloading');
            
            // Determinar el tipo de formato y mensaje según la clase del botón
            let format, message;
            
            if (this.classList.contains('btn-pdf')) {
                format = 'PDF';
                message = 'Generando documento PDF. Esto puede tomar unos segundos.';
            } else if (this.classList.contains('btn-excel')) {
                format = 'CSV';
                message = 'Exportando datos a formato CSV. Esto puede tomar unos segundos.';
            } else if (this.classList.contains('btn-excel-detallado')) {
                format = 'Excel';
                message = 'Generando informe detallado en Excel con formato mejorado. Esto puede tomar varios segundos dependiendo de la cantidad de datos.';
            } else if (this.classList.contains('btn-detailed-report')) {
                format = 'ZIP';
                message = 'Generando informe detallado por competición en formato CSV. Los archivos se comprimirán en un ZIP. Esto puede tomar varios segundos.';
            } else {
                format = 'Archivo';
                message = 'Generando archivo de exportación. Esto puede tomar unos segundos.';
            }
            
            // Crear mensaje de procesamiento
            const processingMsg = document.createElement('div');
            processingMsg.className = 'alert alert-info alert-dismissible fade show mt-3';
            processingMsg.innerHTML = `
                <strong><i class="fas fa-spinner fa-spin"></i> Procesando...</strong> 
                ${message}
                <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
            `;
            
            // Insertar mensaje después de los botones de exportación
            document.querySelector('.export-buttons').insertAdjacentElement('afterend', processingMsg);
            
            // El mensaje se eliminará automáticamente cuando la descarga comience
            setTimeout(() => {
                const alerts = document.querySelectorAll('.alert');
                alerts.forEach(alert => {
                    if (alert.classList.contains('alert-info')) {
                        try {
                            const bsAlert = new bootstrap.Alert(alert);
                            bsAlert.close();
                        } catch(e) {
                            alert.remove();
                        }
                    }
                });
            }, 10000); // Aumentamos el tiempo a 10 segundos para informes más grandes
        });
    });
    
    // Agregar efecto de carga al hacer clic en los botones de abstract
    const scientificButtons = document.querySelectorAll('.btn-scientific');
    scientificButtons.forEach(button => {
        button.addEventListener('click', function() {
            this.classList.add('loading');
            // Mostrar texto de procesamiento
            const originalText = this.innerHTML;
            this.innerHTML = '<i class="fas fa-spinner fa-spin me-1"></i> Generando PDF...';
            
            // Restaurar después de un tiempo (solo visual, ya que la página se redirigirá)
            setTimeout(() => {
                this.classList.remove('loading');
                this.innerHTML = originalText;
            }, 10000); // Por si algo falla y no se redirecciona
        });
    });
    
    // Para el botón general que abre un modal
    const btnAbstract = document.querySelector('.btn-export.btn-abstract');
    if (btnAbstract) {
        btnAbstract.addEventListener('click', function(e) {
            e.preventDefault();
            
            // Crear modal para seleccionar trabajos
            const modalHTML = `
                <div class="modal fade" id="abstractModal" tabindex="-1" aria-labelledby="abstractModalLabel" aria-hidden="true">
                    <div class="modal-dialog modal-lg">
                    
                    <div class="modal-content">
                            <div class="modal-header" style="background-color: #3498db; color: white;">
                                <h5 class="modal-title" id="abstractModalLabel">
                                    <i class="fas fa-graduation-cap me-2"></i>Generar Abstract Científico
                                </h5>
                                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                            </div>
                            <div class="modal-body">
                                <p>Seleccione el trabajo para generar su abstract en formato científico:</p>
                                <div class="list-group">
                                    <?php foreach ($trabajos as $trabajo): ?>
                                    <a href="?export_abstract=true&id=<?php echo $trabajo['id']; ?>" class="list-group-item list-group-item-action">
                                        <div class="d-flex w-100 justify-content-between">
                                            <h5 class="mb-1"><?php echo $trabajo['codigo']; ?></h5>
                                            <small>
                                                <span class="badge bg-primary"><?php echo $trabajo['promedio_calificacion']; ?></span>
                                            </small>
                                        </div>
                                        <p class="mb-1"><?php echo htmlspecialchars($trabajo['titulo']); ?></p>
                                        <small><?php echo $trabajo['pais']; ?></small>
                                    </a>
                                    <?php endforeach; ?>
                                </div>
                            </div>
                            <div class="modal-footer">
                                <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cerrar</button>
                            </div>
                        </div>
                    </div>
                </div>
            `;
            
            // Insertar modal en el documento
            document.body.insertAdjacentHTML('beforeend', modalHTML);
            
            // Mostrar modal
            const modal = new bootstrap.Modal(document.getElementById('abstractModal'));
            modal.show();
            
            // Eliminar modal cuando se cierre
            document.getElementById('abstractModal').addEventListener('hidden.bs.modal', function () {
                this.remove();
            });
            
            // Agregar efecto de carga a los enlaces del modal
            const modalLinks = document.querySelectorAll('#abstractModal a.list-group-item');
            modalLinks.forEach(link => {
                link.addEventListener('click', function() {
                    // Mostrar icono de carga
                    const loadingIcon = document.createElement('i');
                    loadingIcon.className = 'fas fa-spinner fa-spin ms-2';
                    this.appendChild(loadingIcon);
                    
                    // Deshabilitar otros enlaces
                    modalLinks.forEach(otherLink => {
                        if (otherLink !== this) {
                            otherLink.classList.add('disabled');
                            otherLink.style.opacity = '0.5';
                        }
                    });
                });
            });
        });
    }
    

});
    

</script>

<?php
// Agregar este CSS a la sección de estilos
?>

<style>
/* Estilo para el botón de certificados */
.btn-certificate {
    background-color: #27ae60;
    color: white;
    border: none;
}

.btn-certificate:hover {
    background-color: #2ecc71;
    color: white;
    transform: translateY(-2px);
    box-shadow: 0 4px 8px rgba(0,0,0,0.2);
}

/* Estilo para el modal de certificados */
#certificateModal .modal-header {
    background: linear-gradient(135deg, #27ae60, #2ecc71);
    color: white;
    border-bottom: none;
}

#certificateModal .list-group-item {
    transition: all 0.2s ease;
    border-left: 3px solid transparent;
}

#certificateModal .list-group-item:hover {
    background-color: rgba(46, 204, 113, 0.1);
    border-left: 3px solid #2ecc71;
}
</style>
</body>
</html>