<?php
/**
 * Exportar Programación de Presentaciones
 * 
 * Este archivo genera exportaciones en PDF o Excel de la programación de presentaciones
 * con un formato profesional, moderno y estéticamente agradable
 */

// Incluir archivo de conexión a base de datos
require_once('utils_database.php');

// Configuración de errores para depuración
error_reporting(E_ALL);
ini_set('display_errors', 1);

// Verificar si se recibió una petición POST
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    exit("Acceso no permitido.");
}

// Obtener parámetros
$fechas = isset($_POST['fechas']) ? $_POST['fechas'] : [];
$formato = isset($_POST['formato']) ? $_POST['formato'] : 'pdf';

// Validar que se seleccionó al menos una fecha
if (empty($fechas)) {
    exit("Por favor, seleccione al menos una fecha para exportar.");
}

// Conectar a la base de datos
$conn = ActivarMySQL();
if (!$conn) {
    exit("Error al conectar a la base de datos.");
}

// Preparar la consulta con valores escapados para seguridad
$fechasStr = implode("','", array_map(function($fecha) use ($conn) {
    return mysqli_real_escape_string($conn, $fecha);
}, $fechas));

// Consulta actualizada para incluir las observaciones de la sesión
$query = "
    SELECT s.fecha, s.hora, s.pantalla, s.supervisor, s.observaciones,
           t.codigo, t.titulo, t.autor1, t.apellido_autor1, t.pais, 
           t.titulo_autor1, t.cod_tipo_competicion_propuesto,
           tc.descripcion_esp as tipo_competicion,
           st.orden
    FROM tsesiones s
    JOIN tsesion_trabajos st ON s.id = st.sesion_id
    JOIN ttrabajo t ON st.trabajo_id = t.id
    LEFT JOIN ttipo_competicion tc ON t.cod_tipo_competicion_propuesto = tc.codigo
    WHERE s.fecha IN ('$fechasStr')
    ORDER BY s.fecha, s.hora, s.pantalla, st.orden
";

// Ejecutar consulta
$resultado = mysqli_query($conn, $query);
if (!$resultado) {
    exit("Error al ejecutar la consulta: " . mysqli_error($conn));
}

// Extraer todos los datos
$datos = [];
while ($fila = mysqli_fetch_assoc($resultado)) {
    // Formatear el título en mayúsculas
    $fila['titulo'] = mb_strtoupper($fila['titulo'], 'UTF-8');
    
    // Formatear el nombre del presentador (primera letra en mayúscula)
    $fila['autor1'] = ucwords(mb_strtolower($fila['autor1'], 'UTF-8'));
    $fila['apellido_autor1'] = ucwords(mb_strtolower($fila['apellido_autor1'], 'UTF-8'));
    
    // Si no tiene título académico, asignar uno por defecto
    if (empty($fila['titulo_autor1'])) {
        $fila['titulo_autor1'] = '';
    }
    
    // Crear nombre completo del presentador con formato
    $fila['presentador_completo'] = trim($fila['titulo_autor1'] . ' ' . $fila['autor1'] . ' ' . $fila['apellido_autor1']);
    
    $datos[] = $fila;
}

// Liberar resultado y cerrar conexión
mysqli_free_result($resultado);
mysqli_close($conn);

// Si no hay datos, mostrar mensaje
if (empty($datos)) {
    exit("No hay datos para exportar en las fechas seleccionadas.");
}

// Exportar según el formato seleccionado
if ($formato === 'pdf') {
    exportarPDF($datos, $fechas);
} else {
    exportarExcel($datos, $fechas);
}

/**
 * Función para exportar la programación en formato PDF usando TCPDF
 */
function exportarPDF($datos, $fechas) {
    // Asegurarse de que la biblioteca TCPDF está disponible
    if (!file_exists('tcpdf/tcpdf.php')) {
        exit("La biblioteca TCPDF no está disponible. Por favor instálela para generar PDFs.");
    }
    
    require_once('tcpdf/tcpdf.php');
    
    // Extender TCPDF para personalizar encabezado y pie de página con diseño mejorado
    class MYPDF extends TCPDF {
        // Encabezado personalizado con diseño moderno en verde esmeralda
        public function Header() {
            // Degradado de fondo para el encabezado (tonos de verde esmeralda)
            $this->Rect(0, 0, $this->getPageWidth(), 25, 'F', array(), array(235, 250, 242, 220, 245, 230, 210, 240, 220));
            
            // Logo
            $image_file = 'assets/img/logo_congreso.png';
            if (file_exists($image_file)) {
                $this->Image($image_file, 10, 5, 22, '', 'PNG', '', 'T', false, 300, '', false, false, 0, false, false, false);
            }
            
            // Título principal con tipografía moderna en verde esmeralda
            $this->SetFont('helvetica', 'B', 14);
            $this->SetTextColor(16, 122, 89); // Verde esmeralda más oscuro
            $this->SetY(5);
            $this->SetX(35);
            $this->Cell(0, 8, 'PROGRAMACIÓN DE PRESENTACIONES', 0, false, 'L', 0, '', 0, false, 'M', 'M');
            
            // Subtítulo con estilo distintivo en verde más claro
            $this->SetFont('helvetica', 'I', 10);
            $this->SetTextColor(38, 144, 110); // Verde esmeralda medio
            $this->SetY(11);
            $this->SetX(35);
            $this->Cell(0, 6, 'XXXV CONGRESO PANAMERICANO DE TRAUMA', 0, false, 'L', 0, '', 0, false, 'M', 'M');
            
            // Línea decorativa en verde esmeralda
            $this->SetLineStyle(array('width' => 0.5, 'dash' => 0, 'color' => array(20, 160, 110))); // Verde esmeralda
            $this->Line(10, 21, $this->getPageWidth() - 10, 21);
            
            // Segunda línea más delgada para efecto moderno
            $this->SetLineStyle(array('width' => 0.2, 'dash' => 0, 'color' => array(13, 131, 90))); // Verde esmeralda más oscuro
            $this->Line(10, 22, $this->getPageWidth() - 10, 22);
        }
        
        // Pie de página personalizado con diseño moderno en verde esmeralda
        public function Footer() {
            // Degradado de fondo para el pie de página (tonos de verde esmeralda)
            $this->Rect(0, $this->getPageHeight() - 15, $this->getPageWidth(), 15, 'F', array(), array(235, 250, 242, 220, 245, 230, 210, 240, 220));
            
            // Posición a 12mm del final
            $this->SetY(-12);
            
            // Línea decorativa superior del pie de página
            $this->SetLineStyle(array('width' => 0.2, 'dash' => 0, 'color' => array(13, 131, 90))); // Verde esmeralda más oscuro
            $this->Line(10, $this->getPageHeight() - 12, $this->getPageWidth() - 10, $this->getPageHeight() - 12);
            
            // Fuente moderna para el pie de página
            $this->SetFont('helvetica', 'I', 7.5);
            $this->SetTextColor(38, 144, 110); // Verde esmeralda medio
            
            // Fecha, versión y número de página con iconos
            $fecha_generacion = date('d/m/Y H:i:s');
            $texto_pie = '● Generado: ' . $fecha_generacion . ' ● Página ' . $this->getAliasNumPage() . ' de ' . $this->getAliasNbPages() . ' ●';
            $this->Cell(0, 10, $texto_pie, 0, false, 'C', 0, '', 0, false, 'T', 'M');
        }
    }
    
    // Crear objeto PDF con orientación vertical (P) y formato A4
    $pdf = new MYPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    
    // Configurar metadatos del documento
    $pdf->SetCreator('Sistema de Programación de Presentaciones');
    $pdf->SetAuthor('Administrador');
    $pdf->SetTitle('Programación de Presentaciones - Congreso Panamericano de Trauma');
    $pdf->SetSubject('Programación de Presentaciones de Investigación');
    $pdf->SetKeywords('programación, presentaciones, congreso, trauma, investigación');
    
    // Establecer márgenes optimizados
    $pdf->SetMargins(10, 25, 10);
    
    // Establecer saltos de página automáticos
    $pdf->SetAutoPageBreak(true, 15);
    
    // Desactivar enlaces subrayados para un diseño más limpio
    $pdf->setHtmlLinksStyle(array('color' => array(20, 160, 110), 'underline' => false));
    
    // Agregar primera página
    $pdf->AddPage();
    
    // Título del documento con diseño atractivo en verde esmeralda
    $pdf->SetFont('helvetica', 'B', 12);
    $pdf->SetTextColor(16, 122, 89); // Verde esmeralda más oscuro
    $pdf->Cell(0, 10, 'PROGRAMACIÓN DETALLADA DE PRESENTACIONES', 0, 1, 'C');
    
    // Fechas seleccionadas con estilo moderno en verde esmeralda claro
    $pdf->SetFont('helvetica', 'B', 9);
    $pdf->SetTextColor(16, 122, 89); // Verde esmeralda más oscuro
    $pdf->SetFillColor(235, 250, 242); // Fondo verde esmeralda muy claro
    $pdf->SetLineStyle(array('width' => 0.1, 'dash' => 0, 'color' => array(20, 160, 110)));
    $pdf->RoundedRect(10, $pdf->GetY(), $pdf->getPageWidth() - 20, 8, 2, '1111', 'DF');
    
    // Texto de fechas seleccionadas
    $textoFechas = 'Fechas seleccionadas: ' . implode(', ', array_map(function($f) {
        return date('d/m/Y', strtotime($f));
    }, $fechas));
    
    $pdf->SetXY(12, $pdf->GetY() + 1.5);
    $pdf->Cell(0, 5, $textoFechas, 0, 1, 'L');
    $pdf->Ln(5); // Espacio después del título
    
    // Procesar los datos por fecha
    $datos_por_fecha = [];
    foreach ($datos as $fila) {
        $fecha = $fila['fecha'];
        if (!isset($datos_por_fecha[$fecha])) {
            $datos_por_fecha[$fecha] = [];
        }
        $datos_por_fecha[$fecha][] = $fila;
    }
    
    // Definir una paleta de colores variada para los diferentes elementos
    $colores = [
        'titulo_fecha' => array(41, 128, 185),  // Azul brillante (del diseño original)
        'titulo_hora' => array(39, 174, 96),   // Verde (del diseño original)
        'titulo_pantalla' => array(142, 68, 173), // Púrpura (del diseño original)
        'cabecera' => array(236, 240, 241),    // Gris muy claro (del diseño original)
        'bordes' => array(189, 195, 199),      // Gris claro (del diseño original)
        'alterno1' => array(255, 255, 255),    // Blanco
        'alterno2' => array(245, 247, 250),    // Gris muy claro
        'texto_normal' => array(44, 62, 80),   // Gris oscuro (del diseño original)
        'observaciones' => array(52, 152, 219)  // Azul medio (del diseño original)
    ];
    
    // Generar contenido para cada fecha con diseño mejorado
    foreach ($fechas as $fecha) {
        if (!isset($datos_por_fecha[$fecha])) {
            continue;
        }
        
        // Título de la fecha con estilo del diseño original pero fondo verde claro
        $pdf->SetFont('helvetica', 'B', 11);
        $pdf->SetTextColor($colores['titulo_fecha'][0], $colores['titulo_fecha'][1], $colores['titulo_fecha'][2]);
        $pdf->SetFillColor(235, 250, 242); // Fondo verde esmeralda muy claro
        $pdf->SetLineStyle(array('width' => 0.2, 'dash' => 0, 'color' => array(41, 128, 185)));
        $pdf->RoundedRect(10, $pdf->GetY(), $pdf->getPageWidth() - 20, 8, 2, '1111', 'DF');
        
        // Texto de la fecha
        $pdf->SetXY(12, $pdf->GetY() + 1.5);
        $pdf->Cell(0, 5, 'FECHA: ' . date('d/m/Y', strtotime($fecha)), 0, 1, 'L');
        $pdf->Ln(3);
        
        // Agrupar por hora
        $datos_por_hora = [];
        foreach ($datos_por_fecha[$fecha] as $fila) {
            $hora = $fila['hora'];
            if (!isset($datos_por_hora[$hora])) {
                $datos_por_hora[$hora] = [];
            }
            $datos_por_hora[$hora][] = $fila;
        }
        
        // Generar contenido para cada hora con estilo mejorado
        foreach ($datos_por_hora as $hora => $filas) {
            $pdf->SetFont('helvetica', 'B', 10);
            $pdf->SetTextColor($colores['titulo_hora'][0], $colores['titulo_hora'][1], $colores['titulo_hora'][2]);
            $pdf->Cell(0, 7, 'HORARIO: ' . $hora, 0, 1, 'L');
            
            // Agrupar por pantalla
            $datos_por_pantalla = [];
            foreach ($filas as $fila) {
                $pantalla = $fila['pantalla'];
                if (!isset($datos_por_pantalla[$pantalla])) {
                    $datos_por_pantalla[$pantalla] = [];
                }
                $datos_por_pantalla[$pantalla][] = $fila;
            }
            
            // Generar tabla para cada pantalla con diseño mejorado
            foreach ($datos_por_pantalla as $pantalla => $pantalla_filas) {
                // Encabezado de pantalla con estilo atractivo
                $pdf->SetFont('helvetica', 'B', 9);
                $pdf->SetTextColor($colores['titulo_pantalla'][0], $colores['titulo_pantalla'][1], $colores['titulo_pantalla'][2]);
                
                // Información de pantalla y supervisor con icono
                $texto_pantalla = 'PANTALLA ' . $pantalla . ' - SUPERVISOR: ' . $pantalla_filas[0]['supervisor'];
                $pdf->Cell(0, 6, $texto_pantalla, 0, 1, 'L');
                
                // Mostrar observaciones si existen
                if (!empty($pantalla_filas[0]['observaciones'])) {
                    $pdf->SetFont('helvetica', 'I', 8);
                    $pdf->SetTextColor($colores['observaciones'][0], $colores['observaciones'][1], $colores['observaciones'][2]);
                    $pdf->SetFillColor(240, 248, 255); // Fondo azul muy claro (del diseño original)
                    
                    // Crear un rectángulo redondeado para las observaciones
                    $texto_obs = 'Observaciones: ' . $pantalla_filas[0]['observaciones'];
                    
                    // Calcular la altura necesaria para el texto de observaciones
                    $obs_lines = $pdf->getNumLines($texto_obs, $pdf->getPageWidth() - 22);
                    $obs_height = $obs_lines * 4 + 2; // 4mm por línea + 2mm de padding
                    
                    // Dibujar el fondo
                    $pdf->RoundedRect(12, $pdf->GetY(), $pdf->getPageWidth() - 24, $obs_height, 1.5, '1111', 'F');
                    
                    // Colocar el texto de observaciones
                    $pdf->MultiCell($pdf->getPageWidth() - 24, $obs_height, $texto_obs, 0, 'L', false, 1, 12, $pdf->GetY());
                    $pdf->Ln(1);
                }
                
                // Restablecer color para el texto normal
                $pdf->SetTextColor($colores['texto_normal'][0], $colores['texto_normal'][1], $colores['texto_normal'][2]);
                
                // Ancho de columnas (optimizado para formato vertical)
                $ancho_orden = 6;
                $ancho_codigo = 18;
                $ancho_titulo = 68;
                $ancho_presentador = 55;
                $ancho_pais = 13;
                $ancho_categoria = 21;
                
                // Determinar las alturas de fila necesarias para cada presentación
                $alturas_filas = [];
                foreach ($pantalla_filas as $fila) {
                    $pdf->SetFont('helvetica', '', 7);
                    $titulo_lines = $pdf->getNumLines($fila['titulo'], $ancho_titulo);
                    $presentador_lines = $pdf->getNumLines($fila['presentador_completo'], $ancho_presentador);
                    $categoria_lines = $pdf->getNumLines($fila['tipo_competicion'], $ancho_categoria);
                    
                    // Usar la cantidad máxima de líneas para determinar la altura
                    $max_lines = max($titulo_lines, $presentador_lines, $categoria_lines);
                    $alturas_filas[] = max(4, $max_lines * 3.5); // Mínimo 4mm o 3.5mm por línea
                }
                
                // Cabecera de tabla con estilo moderno y atractivo
                $pdf->SetFont('helvetica', 'B', 7.5);
                $pdf->SetFillColor($colores['cabecera'][0], $colores['cabecera'][1], $colores['cabecera'][2]);
                $pdf->SetLineWidth(0.1);
                $pdf->SetDrawColor($colores['bordes'][0], $colores['bordes'][1], $colores['bordes'][2]);
                
                // Encabezados de columna
                $pdf->Cell($ancho_orden, 5, '#', 1, 0, 'C', true);
                $pdf->Cell($ancho_codigo, 5, 'CÓDIGO', 1, 0, 'C', true);
                $pdf->Cell($ancho_titulo, 5, 'TÍTULO', 1, 0, 'C', true);
                $pdf->Cell($ancho_presentador, 5, 'PRESENTADOR', 1, 0, 'C', true);
                $pdf->Cell($ancho_pais, 5, 'PAÍS', 1, 0, 'C', true);
                $pdf->Cell($ancho_categoria, 5, 'CATEGORÍA', 1, 1, 'C', true);
                
                // Filas de datos con diseño alternado
                $pdf->SetFont('helvetica', '', 7);
                
                // Alternar colores para filas
                $fill = false;
                
                foreach ($pantalla_filas as $index => $fila) {
                    // Obtener la altura calculada para esta fila
                    $rowHeight = $alturas_filas[$index];
                    
                    // Establecer color de fondo alternado
                    if ($fill) {
                        $pdf->SetFillColor($colores['alterno2'][0], $colores['alterno2'][1], $colores['alterno2'][2]);
                    } else {
                        $pdf->SetFillColor($colores['alterno1'][0], $colores['alterno1'][1], $colores['alterno1'][2]);
                    }
                    
                    // Posición inicial
                    $startX = $pdf->GetX();
                    $startY = $pdf->GetY();
                    $currentX = $startX;
                    
                    // Calcular alto uniforme para toda la fila
                    $titulo_lines = $pdf->getNumLines($fila['titulo'], $ancho_titulo);
                    $presentador_lines = $pdf->getNumLines($fila['presentador_completo'], $ancho_presentador);
                    $categoria_lines = $pdf->getNumLines($fila['tipo_competicion'], $ancho_categoria);
                    $max_lines = max($titulo_lines, $presentador_lines, $categoria_lines);
                    $real_height = max($rowHeight, $max_lines * 3.5);
                    
                    // Número de orden (columna 1)
                    $pdf->MultiCell($ancho_orden, $real_height, $fila['orden'], 1, 'C', $fill, 0, '', '', true, 0, false, true, $real_height, 'M');
                    $currentX += $ancho_orden;
                    
                    // Código (columna 2)
                    $pdf->SetFont('helvetica', 'B', 7); // Negrita para el código
                    $pdf->MultiCell($ancho_codigo, $real_height, $fila['codigo'], 1, 'C', $fill, 0, $currentX, $startY, true, 0, false, true, $real_height, 'M');
                    $currentX += $ancho_codigo;
                    
                    // Título en mayúsculas (columna 3)
                    $pdf->SetFont('helvetica', '', 7);
                    $pdf->MultiCell($ancho_titulo, $real_height, $fila['titulo'], 1, 'L', $fill, 0, $currentX, $startY, true, 0, false, true, $real_height, 'M');
                    $currentX += $ancho_titulo;
                    
                    // Presentador con formato mejorado (columna 4)
                    $pdf->MultiCell($ancho_presentador, $real_height, $fila['presentador_completo'], 1, 'L', $fill, 0, $currentX, $startY, true, 0, false, true, $real_height, 'M');
                    $currentX += $ancho_presentador;
                    
                    // País (columna 5)
                    $pdf->SetFont('helvetica', '', 7);
                    $pdf->MultiCell($ancho_pais, $real_height, $fila['pais'], 1, 'C', $fill, 0, $currentX, $startY, true, 0, false, true, $real_height, 'M');
                    $currentX += $ancho_pais;
                    
                    // Categoría (columna 6)
                    $pdf->MultiCell($ancho_categoria, $real_height, $fila['tipo_competicion'], 1, 'C', $fill, 1, $currentX, $startY, true, 0, false, true, $real_height, 'M');
                    
                    // Alternar color de fondo
                    $fill = !$fill;
                }
                
                $pdf->Ln(4); // Espacio después de cada tabla
            }
            
            $pdf->Ln(3); // Espacio después de cada bloque horario
        }
        
        // Nueva página para cada fecha (excepto la última)
        if ($fecha !== end($fechas)) {
            $pdf->AddPage();
        }
    }
    
    // Añadir información final
    $pdf->SetFont('helvetica', 'I', 8);
    $pdf->SetTextColor(38, 144, 110); // Verde esmeralda medio para el pie de página
    $pdf->Ln(5);
    $pdf->Cell(0, 6, 'Documento generado automáticamente por el Sistema de Gestión de Programación', 0, 1, 'C');
    
    // Configuración para mejor calidad de salida
    $pdf->SetCompression(true);
    
    // Salida del PDF
    $pdf->Output('programacion_presentaciones_' . date('Ymd') . '.pdf', 'D');
    exit();
}

/**
 * Función para exportar la programación en formato Excel/CSV
 */
function exportarExcel($datos, $fechas) {
    // Construir cabecera con diseño moderno
    $cabecera = [
        'Fecha',
        'Hora',
        'Pantalla',
        'Supervisor',
        'Observaciones',  // Añadir observaciones a la exportación
        'Orden',
        'Código',
        'TÍTULO',
        'PRESENTADOR',
        'País',
        'CATEGORÍA'
    ];
    
    // Construir filas de datos incluyendo observaciones
    $filas = [$cabecera]; // Primera fila es la cabecera
    
    foreach ($datos as $fila) {
        $filas[] = [
            date('d/m/Y', strtotime($fila['fecha'])),
            $fila['hora'],
            $fila['pantalla'],
            $fila['supervisor'],
            $fila['observaciones'],  // Incluir el campo observaciones
            $fila['orden'],
            $fila['codigo'],
            $fila['titulo'],
            $fila['presentador_completo'],
            $fila['pais'],
            $fila['tipo_competicion']
        ];
    }
    
    // Generar CSV con formato profesional
    $output = fopen('php://output', 'w');
    
    // Establecer encabezados HTTP para descarga
    header('Content-Type: text/csv; charset=utf-8');
    header('Content-Disposition: attachment; filename="programacion_presentaciones_' . date('Ymd') . '.csv"');
    
    // Escribir BOM para UTF-8 (para compatibilidad con Excel)
    fprintf($output, chr(0xEF).chr(0xBB).chr(0xBF));
    
    // Escribir filas
    foreach ($filas as $fila) {
        fputcsv($output, $fila);
    }
    
    fclose($output);
    exit();
}