<?php
/**
 * pdf_generator.php
 * Generador de PDF para resúmenes científicos con diseño profesional y borde estilizado
 * Versión corregida con mejor manejo de errores y preservación del código original
 */

// Protección contra inclusión múltiple
if (!defined('PDF_GENERATOR_INCLUDED')) {
    define('PDF_GENERATOR_INCLUDED', true);

    /**
     * Función para generar un PDF con formato de journal científico para resúmenes
     */
    function generarPDFResumen($titulo, $autores, $codigo, $referencia, $introduccion, $materiales, $resultados, $conclusiones, $area_tematica, $pais, $ciudad, $email = '', $cod_tipo_presentacion_propuesto = '', $cod_tipo_competicion_propuesto = '', $beca_internacional = '', $nombre_patrocinador = '', $apellido_patrocinador = '', $estado_membresia_patrocinador = '', $email_patrocinador = '') {
        // Verificar que los parámetros no estén vacíos
        if (empty($codigo)) {
            error_log("ADVERTENCIA: El código está vacío, usando 'SIN_CODIGO'");
            $codigo = 'SIN_CODIGO';
        } else {
            // Registrar el código recibido para depuración
            error_log("PDF: Recibido código: $codigo");
        }
        
        if (empty($titulo)) {
            $titulo = 'Sin título especificado';
        }
        
        try {
            // Requiere la biblioteca TCPDF
            require_once('tcpdf/tcpdf.php');
            
            // Incluir archivo de utilidades para la conexión a base de datos
            require_once('utils_database.php');
            
            // Registrar actividad
            error_log("Generando PDF para el resumen con código: $codigo");
            
            // Conectar a la base de datos para obtener información adicional
            $conn = ActivarMySQL();
            
            // Obtener descripción del área temática desde la tabla tarea
            $area_tematica_desc = $area_tematica;
            if (!empty($area_tematica) && $conn) {
                $area_query = "SELECT descripcion FROM tarea WHERE codigo = ?";
                $stmt = $conn->prepare($area_query);
                if ($stmt) {
                    $stmt->bind_param("s", $area_tematica);
                    $stmt->execute();
                    $result = $stmt->get_result();
                    if ($result && $result->num_rows > 0) {
                        $row = $result->fetch_assoc();
                        $area_tematica_desc = $row['descripcion'];
                    }
                    $stmt->close();
                }
            }
            
            // Obtener tipo de presentación
            $tipo_presentacion_desc = '';
            if (!empty($cod_tipo_presentacion_propuesto) && $conn) {
                $sql_tipo = "SELECT descripcion_esp FROM ttipo_presentacion WHERE codigo = ?";
                $stmt = $conn->prepare($sql_tipo);
                if ($stmt) {
                    $stmt->bind_param("s", $cod_tipo_presentacion_propuesto);
                    $stmt->execute();
                    $result = $stmt->get_result();
                    if ($result && $result->num_rows > 0) {
                        $row = $result->fetch_assoc();
                        $tipo_presentacion_desc = $row['descripcion_esp'];
                    }
                    $stmt->close();
                }
            }
            
            // Obtener tipo de competición
            $tipo_competicion_desc = '';
            if (!empty($cod_tipo_competicion_propuesto) && $conn) {
                $sql_comp = "SELECT descripcion_esp FROM ttipo_competicion WHERE codigo = ?";
                $stmt = $conn->prepare($sql_comp);
                if ($stmt) {
                    $stmt->bind_param("s", $cod_tipo_competicion_propuesto);
                    $stmt->execute();
                    $result = $stmt->get_result();
                    if ($result && $result->num_rows > 0) {
                        $row = $result->fetch_assoc();
                        $tipo_competicion_desc = $row['descripcion_esp'];
                    }
                    $stmt->close();
                }
            }
            
            // Para depuración
            error_log("Tipo presentación: " . $tipo_presentacion_desc . ", Código: " . $cod_tipo_presentacion_propuesto);
            error_log("Tipo competición: " . $tipo_competicion_desc . ", Código: " . $cod_tipo_competicion_propuesto);
            
            // Cerrar la conexión a la base de datos
            if ($conn) {
                $conn->close();
            }
            
            // Verificar si la clase ya existe antes de definirla
            if (!class_exists('ScientificMagazinePDF')) {
                // Clase personalizada para el formato de scientific magazine
                class ScientificMagazinePDF extends TCPDF {
                    // Propiedades para el header y footer
                    protected $codigo = '';
                    protected $borderColor = array(180, 180, 180); // Color del borde en RGB
                    protected $area_tematica = '';
                    protected $tipo_presentacion = '';
                    protected $tipo_competicion = '';
                    protected $pais_actual = '';
                    
                    // Colores del tema
                    protected $primaryColor = array(0, 103, 137); // Azul oscuro profesional
                    
                    public function setCodigo($codigo) {
                        // Registrar el código que se está configurando para depuración
                        error_log("PDF: Configurando código en PDF: $codigo");
                        $this->codigo = $codigo;
                    }
                    
                    public function setAreaTematica($area_tematica) {
                        $this->area_tematica = $area_tematica;
                    }
                    
                    public function setTipoPresentacion($tipo_presentacion) {
                        $this->tipo_presentacion = $tipo_presentacion;
                    }
                    
                    public function setTipoCompeticion($tipo_competicion) {
                        $this->tipo_competicion = $tipo_competicion;
                    }
                    
                    public function setPaisActual($pais) {
                        $this->pais_actual = $pais;
                    }
                    
                    // Encabezado de página - estilo journal científico moderno
                    public function Header() {
                        // Dibujar borde decorativo alrededor de la página
                        $this->RoundedRect(5, 5, $this->getPageWidth()-10, $this->getPageHeight()-10, 2, '1111', '', 
                            array('width' => 0.5, 'color' => $this->borderColor));
                        
                        // Línea decorativa superior
                        $this->SetDrawColor($this->borderColor[0], $this->borderColor[1], $this->borderColor[2]);
                        $this->SetLineWidth(0.2);
                        $this->Line(10, 10, $this->getPageWidth()-10, 10);
                        
                        // Configuración de fuente
                        $this->SetFont('helvetica', '', 7);
                        $this->SetTextColor(60, 60, 60);
                        
                        // Título del journal con área temática, tipo de presentación y competición
                        $this->SetXY(12, 6);
                        $journal_title = 'Panamerican Journal of Trauma';
                        
                        // Añadir el área temática, tipo de presentación y tipo de competición
                        $additional_info = array();
                        
                        if (!empty($this->area_tematica)) {
                            $additional_info[] = $this->area_tematica;
                        }
                        
                        if (!empty($this->tipo_presentacion)) {
                            $additional_info[] = $this->tipo_presentacion;
                        }
                        
                        if (!empty($this->tipo_competicion)) {
                            $additional_info[] = $this->tipo_competicion;
                        }
                        
                        if (!empty($additional_info)) {
                            $journal_title .= ': ' . implode(' - ', $additional_info);
                        }
                        
                        // Limitar el ancho para que no se sobreponga a la información del código
                        $this->Cell($this->getPageWidth() - 130, 4, $journal_title, 0, 0, 'L');
                        
                        // Información del código (parte superior derecha)
                        $this->SetXY($this->getPageWidth()-80, 6);
                        // Verificar qué código se está mostrando en el encabezado
                        error_log("PDF: Mostrando código en encabezado: " . $this->codigo);
                        $this->Cell(70, 4, $this->codigo, 0, 0, 'R');
                        
                        // Logo (si existe)
                        $logoPath = 'assets/img/logo_congreso.png';
                        if (file_exists($logoPath)) {
                            $this->Image($logoPath, $this->getPageWidth() - 50, 15, 35, '', 'PNG', '', 'T', false, 300);
                        }
                        
                        // Ajustar la posición Y para el contenido principal
                        $this->SetY(20);
                    }
                    
                    // Pie de página con información del congreso
                    public function Footer() {
                        $this->SetY(-25);
                        
                        // Línea superior del pie de página
                        $this->SetDrawColor($this->borderColor[0], $this->borderColor[1], $this->borderColor[2]);
                        $this->SetLineWidth(0.2);
                        $this->Line(10, $this->getPageHeight()-24, $this->getPageWidth()-10, $this->getPageHeight()-24);
                        
                        // Texto congreso
                        $this->SetFont('helvetica', 'B', 8);
                        $this->SetTextColor(0, 103, 137);
                        $this->SetXY(12, $this->getPageHeight()-22);
                        $this->Cell($this->getPageWidth() - 24, 5, 'Panamerican Trauma Society Oficina Central: 1200 East Broad Street P.O. Box 980454 Richmond', 0, 1, 'L');
                        
                        // Número de página
                        $this->SetFont('helvetica', '', 8);
                        $this->SetTextColor(100, 100, 100);
                        $this->SetXY($this->getPageWidth()-30, $this->getPageHeight()-15);
                        $this->Cell(20, 4, 'Página ' . $this->getAliasNumPage() . '/' . $this->getAliasNbPages(), 0, 0, 'R');
                    }
                    
                    /**
                     * Dibuja un rectángulo con esquinas redondeadas
                     */
                    public function RoundedRect($x, $y, $w, $h, $r, $round_corner = '1111', $style = '', $border_style = array(), $fill_color = array()) {
                        if (isset($border_style['all'])) {
                            $border_style['all'] = $this->borderColor;
                        }
                        
                        // Establecer color de borde
                        $this->SetDrawColor($this->borderColor[0], $this->borderColor[1], $this->borderColor[2]);
                        
                        // Dibujar rectángulo redondeado
                        parent::RoundedRect($x, $y, $w, $h, $r, $round_corner, $style, $border_style, $fill_color);
                        
                        // Restaurar color de dibujo
                        $this->SetDrawColor(0, 0, 0);
                    }
                    
                    /**
                     * Mejora la justificación del texto para evitar espacios grandes
                     * @param string $text Texto a formatear
                     * @param float $line_height Altura de línea
                     * @param string $alignment Alineación (L, R, C, J)
                     */
                    public function mejorarJustificacion($text, $line_height = 5, $alignment = 'J') {
                        // Eliminar espacios múltiples
                        $text = preg_replace('/\s+/', ' ', $text);
                        
                        // Dividir en párrafos más pequeños para mejorar justificación
                        $paragraphs = explode("\n", $text);
                        foreach($paragraphs as $paragraph) {
                            if(strlen($paragraph) > 500) {
                                // Dividir párrafos largos en secciones
                                $sentences = preg_split('/(?<=[.!?])\s+/', $paragraph);
                                $chunk = '';
                                $char_count = 0;
                                
                                foreach($sentences as $sentence) {
                                    $chunk .= $sentence . ' ';
                                    $char_count += strlen($sentence);
                                    
                                    if($char_count > 300) {
                                        $this->MultiCell(0, $line_height, trim($chunk), 0, $alignment);
                                        $this->Ln(1);
                                        $chunk = '';
                                        $char_count = 0;
                                    }
                                }
                                
                                if(!empty($chunk)) {
                                    $this->MultiCell(0, $line_height, trim($chunk), 0, $alignment);
                                    $this->Ln(1);
                                }
                            } else {
                                $this->MultiCell(0, $line_height, $paragraph, 0, $alignment);
                                $this->Ln(1);
                            }
                        }
                    }
                    
                    /**
                     * Ajusta el texto para caber en una sola página con un máximo de caracteres
                     * @param string $text Texto a ajustar
                     * @param int $max_chars Número máximo de caracteres
                     * @return string Texto ajustado
                     */
                    public function ajustarTexto($text, $max_chars = 650) {
                        $text = strip_tags($text);
                        $text = preg_replace('/\s+/', ' ', $text);
                        
                        if (strlen($text) > $max_chars) {
                            $text = substr($text, 0, $max_chars-3) . '...';
                        }
                        
                        return $text;
                    }
                }
            }
            
            // Crear nueva instancia de ScientificMagazinePDF
            $pdf = new ScientificMagazinePDF('P', 'mm', 'A4', true, 'UTF-8', false);
            
            // Establecer información básica
            $pdf->setCodigo($codigo);
            $pdf->setAreaTematica($area_tematica_desc);
            $pdf->setTipoPresentacion($tipo_presentacion_desc);
            $pdf->setTipoCompeticion($tipo_competicion_desc);
            $pdf->setPaisActual($pais);
            
            // Establecer información del documento
            $pdf->SetCreator('Congreso Panamericano de Trauma');
            $pdf->SetAuthor('Comité Científico');
            $pdf->SetTitle($titulo);
            $pdf->SetSubject('Resumen Científico');
            $pdf->SetKeywords('trauma, científico, resumen, congreso');
            
            // Configuración de página
            $pdf->SetMargins(15, 20, 15);
            $pdf->SetHeaderMargin(5);
            $pdf->SetFooterMargin(25);
            $pdf->SetAutoPageBreak(TRUE, 30);
            
            // Añadir página
            $pdf->AddPage();
            
            // TÍTULO DEL TRABAJO
            $pdf->SetFont('helvetica', 'B', 14);
            $pdf->SetTextColor(40, 40, 40);
            $pdf->MultiCell(0, 10, strtoupper($titulo), 0, 'C');
            $pdf->Ln(2);
            
            // INFORMACIÓN DE AUTORES Y AFILIACIONES
            // Procesar autores
            if (is_string($autores)) {
                $autores = json_decode($autores, true);
            }
            
            if (is_array($autores) && !empty($autores)) {
                // Lista de autores
                $autores_lista = [];
                foreach ($autores as $index => $autor) {
                    if (!empty($autor['nombre']) && !empty($autor['apellido'])) {
                        $autor_nombre = '';
                        if (!empty($autor['titulo'])) {
                            $autor_nombre .= $autor['titulo'] . ' ';
                        }
                        $autor_nombre .= $autor['nombre'] . ' ' . $autor['apellido'];
                        $autores_lista[] = $autor_nombre;
                    }
                }
                
                // Mostrar autores en una línea
                if (!empty($autores_lista)) {
                    $pdf->SetFont('helvetica', '', 12);
                    $pdf->SetTextColor(50, 50, 50);
                    $pdf->MultiCell(0, 8, implode(', ', $autores_lista), 0, 'C');
                }
                
                // Mostrar primera institución (si existe)
                if (!empty($autores[0]['institucion'])) {
                    $pdf->SetFont('helvetica', 'I', 10);
                    $pdf->SetTextColor(70, 70, 70);
                    $pdf->MultiCell(0, 7, $autores[0]['institucion'], 0, 'C');
                }
            }
            
            // Origen (ciudad, país) debajo de la institución
            $pdf->SetFont('helvetica', 'I', 10);
            $pdf->SetTextColor(70, 70, 70);
            $pdf->MultiCell(0, 7, $ciudad . ', ' . $pais, 0, 'C');
            
            // Email de contacto
            if (!empty($email)) {
                $pdf->SetFont('helvetica', 'I', 10);
                $pdf->SetTextColor(70, 70, 70);
                $pdf->MultiCell(0, 7, $email, 0, 'C');
            }
            
            // Ya no mostramos tipo de presentación y competición aquí, ahora están en el header
            $pdf->Ln(4);
            
            // Información de beca (si existe)
            if (!empty($beca_internacional) && $beca_internacional != 'No deseo participar') {
                $pdf->SetFont('helvetica', 'B', 11);
                $pdf->SetTextColor(40, 40, 40);
                $pdf->Cell(0, 8, 'INFORMACIÓN DE BECA', 0, 1, 'L');
                
                $pdf->SetFont('helvetica', '', 10);
                $pdf->SetTextColor(50, 50, 50);
                $pdf->MultiCell(0, 6, 'Aplicación para: ' . $beca_internacional, 0, 'L');
                
                // Si hay patrocinador
                if (!empty($nombre_patrocinador) || !empty($apellido_patrocinador)) {
                    $pdf->MultiCell(0, 6, 'Patrocinador: ' . $nombre_patrocinador . ' ' . $apellido_patrocinador, 0, 'L');
                    
                    if (!empty($estado_membresia_patrocinador)) {
                        $pdf->MultiCell(0, 6, 'Estado de membresía: ' . $estado_membresia_patrocinador, 0, 'L');
                    }
                    
                    if (!empty($email_patrocinador)) {
                        $pdf->MultiCell(0, 6, 'Email del patrocinador: ' . $email_patrocinador, 0, 'L');
                    }
                }
                
                // Añadir un espacio
                $pdf->Ln(4);
            }
            
            // Línea separadora antes del contenido principal
            $pdf->SetDrawColor(220, 220, 220);
            $pdf->Line(15, $pdf->GetY() + 2, $pdf->getPageWidth() - 15, $pdf->GetY() + 2);
            $pdf->Ln(6);
            
            // INICIO SECCIONES A DOS COLUMNAS
            // Activar modo de dos columnas para todo el contenido
            $pdf->setEqualColumns(2, 85);
            $pdf->selectColumn(0);
            
            // I. INTRODUCCIÓN
            $pdf->SetFont('helvetica', 'B', 13);
            $pdf->SetTextColor(35, 35, 35);
            $pdf->Cell(0, 8, 'I. INTRODUCCIÓN', 0, 1, 'L');
            $pdf->Ln(1);
            
            // Texto de la introducción
            if (!empty($introduccion)) {
                $pdf->SetFont('times', '', 12);
                $pdf->SetTextColor(45, 45, 45);
                
                $intro_text = $pdf->ajustarTexto($introduccion, 650);
                $pdf->mejorarJustificacion($intro_text, 5.5, 'J');
                $pdf->Ln(2);
            }
            
            // II. MATERIALES Y MÉTODOS
            $pdf->SetFont('helvetica', 'B', 13);
            $pdf->SetTextColor(35, 35, 35);
            $pdf->Cell(0, 8, 'II. MATERIALES Y MÉTODOS', 0, 1, 'L');
            $pdf->Ln(1);
            
            // Texto de materiales
            if (!empty($materiales)) {
                $pdf->SetFont('times', '', 12);
                $pdf->SetTextColor(45, 45, 45);
                
                $materials_text = $pdf->ajustarTexto($materiales, 650);
                $pdf->mejorarJustificacion($materials_text, 5.5, 'J');
                $pdf->Ln(2);
            }
            
            // Cambiar a la segunda columna
            $pdf->selectColumn(1);
            
            // III. RESULTADOS
            $pdf->SetFont('helvetica', 'B', 13);
            $pdf->SetTextColor(35, 35, 35);
            $pdf->Cell(0, 8, 'III. RESULTADOS', 0, 1, 'L');
            $pdf->Ln(1);
            
            // Texto de resultados
            if (!empty($resultados)) {
                $pdf->SetFont('times', '', 12);
                $pdf->SetTextColor(45, 45, 45);
                
                $results_text = $pdf->ajustarTexto($resultados, 650);
                $pdf->mejorarJustificacion($results_text, 5.5, 'J');
                $pdf->Ln(2);
            }
            
            // IV. CONCLUSIONES
            $pdf->SetFont('helvetica', 'B', 13);
            $pdf->SetTextColor(35, 35, 35);
            $pdf->Cell(0, 8, 'IV. CONCLUSIONES', 0, 1, 'L');
            $pdf->Ln(1);
            
            // Texto de conclusiones
            if (!empty($conclusiones)) {
                $pdf->SetFont('times', '', 12);
                $pdf->SetTextColor(45, 45, 45);
                
                $conclusions_text = $pdf->ajustarTexto($conclusiones, 650);
                $pdf->mejorarJustificacion($conclusions_text, 5.5, 'J');
            }
            
            // Restaurar el ajuste de columnas
            $pdf->resetColumns();
            
            // Determinar la ruta del directorio pdfs/
            $currentDir = dirname(__FILE__);
            $pdfDirectory = $currentDir . '/pdfs/';
            
            // Crear directorio si no existe
            if (!file_exists($pdfDirectory)) {
                if (!mkdir($pdfDirectory, 0777, true)) {
                    error_log("Error al crear el directorio para PDFs en: " . $pdfDirectory);
                    return '';
                }
            }
            
            // Verificar permisos de escritura
            if (!is_writable($pdfDirectory)) {
                chmod($pdfDirectory, 0777);
                if (!is_writable($pdfDirectory)) {
                    error_log("El directorio pdfs/ no tiene permisos de escritura en: " . $pdfDirectory);
                    return '';
                }
            }
            
            // Crear un nombre de archivo seguro
            $pdfFileName = 'resumen_' . preg_replace('/[^a-zA-Z0-9]/', '_', $codigo) . '.pdf';
            $pdfFilePath = $pdfDirectory . $pdfFileName;
            
            // Registrar el nombre de archivo que se está usando
            error_log("Guardando PDF con nombre de archivo: $pdfFilePath");
            
            // Intentar guardar el PDF con ruta absoluta
            try {
                // Usar ruta absoluta para evitar problemas con file://
                $pdf->Output($pdfFilePath, 'F');  // 'F' indica guardar como archivo
                
                // Limpiar cualquier salida de buffer para evitar problemas
                if (ob_get_length()) {
                    ob_clean();
                }
                
                // Devolver ruta relativa para acceder desde el navegador
                return 'pdfs/' . $pdfFileName;
            } catch (Exception $e) {
                // Registrar el error pero continuar
                error_log("Error al generar PDF: " . $e->getMessage());
                
                // Intentar un enfoque alternativo usando la función Output con 'S' (como string)
                // y luego escribirlo manualmente
                try {
                    $pdfString = $pdf->Output('', 'S');
                    file_put_contents($pdfFilePath, $pdfString);
                    
                    // Verificar si el archivo se creó correctamente
                    if (file_exists($pdfFilePath) && filesize($pdfFilePath) > 0) {
                        return 'pdfs/' . $pdfFileName;
                    }
                } catch (Exception $e2) {
                    error_log("Error en el segundo intento de generar PDF: " . $e2->getMessage());
                }
                
                // Devolver una cadena vacía para indicar que no se generó el PDF
                return '';
            }
        } catch (Exception $e) {
            // Capturar cualquier error durante la generación del PDF
            error_log("Error en la generación del PDF: " . $e->getMessage());
            return '';
        }
    } // fin de la función generarPDFResumen
} // fin de la protección contra inclusión múltiple