<?php
session_start();

// Evitar caché del PDF en el navegador
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');

// Establecer la zona horaria de Santiago de Chile
date_default_timezone_set('America/Santiago');

// Mostrar errores en pantalla (debug)
error_reporting(E_ALL);
ini_set('display_errors', 1);

if (!isset($_SESSION['user_id'])) {
    header('Location: login.php');
    exit;
}

require(__DIR__ . '/../lib/fpdf/fpdf.php');
require_once(__DIR__ . '/../config/db_auto.php');


$matricula_id = $_GET['matricula_id'] ?? 0;
if ($matricula_id == 0) {
    die("Error: No se proporcionó un ID de matrícula válido.");
}


// 1. Consulta para los datos del alumno usando el ID de matrícula
$stmt = $pdo->prepare("
    SELECT a.*, 
           g.nombre AS grado_nombre, 
           g.abreviatura AS grado_abreviatura,
           g.nivel AS grado_nivel,
           te.nombre AS tipo_ensenanza_nombre, 
           m.fecha_matricula,
           m.anio AS anio_matricula,
           m.estado AS estado_matricula,
           s.*, 
           sa.*
    FROM matriculas m
    LEFT JOIN alumnos a ON a.id = m.alumno_id
    LEFT JOIN grados g ON m.grado_id = g.id
    LEFT JOIN tipo_ensenanza te ON g.tipo_ensenanza_id = te.id
    LEFT JOIN social_alumno s ON a.id = s.alumno_id
    LEFT JOIN salud_alumno sa ON a.id = sa.alumno_id
    WHERE m.id = ?
");
$stmt->execute([$matricula_id]);
$alumno = $stmt->fetch(PDO::FETCH_ASSOC);

// Si no se encuentra la matrícula/alumno, detener la ejecución y mostrar un error.
if (!$alumno) {
    die("Error: No se encontró la matrícula o el alumno con el ID proporcionado.");
}

// Debug temporal - agregar ?debug=1 a la URL para ver los datos
$debug = isset($_GET['debug']);
if ($debug) {
    echo '<pre>';
    echo "MATRICULA CONSULTADA: " . $matricula_id . "\n";
    echo "TIPO ENSEÑANZA: " . ($alumno['tipo_ensenanza_nombre'] ?? 'NULL') . "\n";
    echo "GRADO: " . ($alumno['grado_nombre'] ?? 'NULL') . "\n";
    echo "FECHA MATRICULA: " . ($alumno['fecha_matricula'] ?? 'NULL') . "\n";
    echo "\nTODOS LOS DATOS:\n";
    print_r($alumno);
    echo '</pre>';
    exit;
}

// Traer todos los familiares con sus roles y parentesco específico
$stmt = $pdo->prepare("
    SELECT f.*, 
           GROUP_CONCAT(af.tipo_relacion ORDER BY af.tipo_relacion SEPARATOR ', ') AS roles,
           COALESCE(af.parentesco_especifico, f.parentesco) as parentesco_mostrar
    FROM familiares f
    INNER JOIN alumno_familiar af ON f.id = af.familiar_id
    WHERE af.alumno_id = ?
    GROUP BY f.id
    ORDER BY
        -- Prioridad 1: Apoderado Titular
        MIN(CASE WHEN af.tipo_relacion = 'APODERADO TITULAR' THEN 0 ELSE 1 END),
        -- Prioridad 2: Apoderado Suplente
        MIN(CASE WHEN af.tipo_relacion = 'APODERADO SUPLENTE' THEN 0 ELSE 1 END),
        -- Prioridad 3: Apoderado 3
        MIN(CASE WHEN af.tipo_relacion = 'APODERADO 3' THEN 0 ELSE 1 END),
        -- Prioridad 4: Padre
        MIN(CASE WHEN af.tipo_relacion = 'PADRE' THEN 0 ELSE 1 END),
        -- Prioridad 5: Madre
        MIN(CASE WHEN af.tipo_relacion = 'MADRE' THEN 0 ELSE 1 END),
        f.ap_paterno, f.ap_materno
");
$stmt->execute([$alumno['id']]);

$familiares = $stmt->fetchAll(PDO::FETCH_ASSOC);

// --- INICIO DE LA SOLUCIÓN: BUSCAR PADRES SIN ROL ASIGNADO ---
// El problema: un padre/madre puede existir pero no tener un rol, por lo que no aparece.
// Solución: Hacemos una segunda consulta para encontrar a los padres/madres que no
// estén ya en la lista de familiares con roles.

// 1. Obtener los IDs de los familiares que ya hemos cargado (los que tienen roles).
$ids_existentes = array_column($familiares, 'id');

// 2. Buscar en la tabla 'familiares' a aquellos cuyo parentesco sea PADRE o MADRE
// y que NO estén en la lista de IDs existentes.
// Para vincularlos al alumno, usamos una subconsulta que busca cualquier asociación en alumno_familiar.
// Esto es una heurística para encontrar padres que alguna vez estuvieron asociados o que comparten apellido.
$sql_padres = "
    SELECT f.*, 'SIN ROL ASIGNADO' as roles, f.parentesco as parentesco_mostrar
    FROM familiares f
    WHERE (f.parentesco = 'PADRE' OR f.parentesco = 'MADRE')
      AND EXISTS (SELECT 1 FROM alumno_familiar af_check WHERE af_check.familiar_id = f.id AND af_check.alumno_id = ?)
";
if (!empty($ids_existentes)) {
    $sql_padres .= " AND f.id NOT IN (" . implode(',', array_fill(0, count($ids_existentes), '?')) . ")";
}
$stmt_padres = $pdo->prepare($sql_padres);
$stmt_padres->execute(array_merge([$alumno['id']], $ids_existentes));
$padres_sin_rol = $stmt_padres->fetchAll(PDO::FETCH_ASSOC);

// 3. Combinar los resultados. Los padres sin rol se añadirán al final de la lista.
$familiares = array_merge($familiares, $padres_sin_rol);

// DEPURACIÓN: Mostrar el id de alumno y los familiares obtenidos
if (isset($_GET['debug'])) {
    echo '<pre>';
    echo "ID Alumno usado: " . $alumno['id'] . "\n";
    print_r($familiares);
    echo '</pre>';
    exit;
}

// --- NUEVA FUNCIONALIDAD: SALIDA JSON PARA VISTA PREVIA ---
// Si se solicita la salida en formato JSON, se empaquetan los datos y se finaliza el script.
if (isset($_GET['output']) && $_GET['output'] === 'json') {
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode([
        'success' => true,
        'alumno' => $alumno,
        'familiares' => $familiares
    ]);
    exit; // Finalizar ejecución para no generar el PDF.
}
// --- FIN DE LA NUEVA FUNCIONALIDAD ---

class PDF extends FPDF
{
    private $alumno;
    private $familiares;

    // Se pasa la información al constructor de la clase
    function __construct($alumno, $familiares)
    {
        // Inicializar FPDF con orientación Portrait y tamaño Oficio Chileno
        // Oficio Chileno: 215.9 x 330.2 mm
        parent::__construct('P', 'mm', array(215.9, 330.2));
        $this->alumno     = $alumno;
        $this->familiares = $familiares;
    }

    // Método que se ejecuta automáticamente al agregar una nueva página
    function AddPage($orientation = '', $size = '', $rotation = 0)
    {
        parent::AddPage($orientation, $size, $rotation);
        $this->configurarMargenesAlternados();
    }

    // Configurar márgenes según el número de página (impar/par)
    function configurarMargenesAlternados()
    {
        $pageNum = $this->PageNo();

        if ($pageNum % 2 == 1) {
            // Páginas impares (1, 3, 5...): margen izquierdo 20mm para perforaciones
            $this->SetMargins(20, 10, 10);
            // Ajustar el ancho efectivo: 215.9mm (Oficio) - 20mm (izq) - 10mm (der) = 185.9mm
            $this->SetX(20);
        } else {
            // Páginas pares (2, 4, 6...): margen derecho 20mm para perforaciones
            $this->SetMargins(10, 10, 20);
            // Ajustar el ancho efectivo: 215.9mm (Oficio) - 10mm (izq) - 20mm (der) = 185.9mm
            $this->SetX(10);
        }
    }

    // Método auxiliar para obtener el ancho disponible según la página actual
    function getAnchoDisponible()
    {
        // Ancho de Oficio Chileno (215.9mm) - márgenes (20mm + 10mm) = 185.9mm
        return 185.9;
    }

    function Header()
    {
        // Configurar márgenes alternados ANTES de dibujar el header
        $this->configurarMargenesAlternados();

        // Solo mostrar el encabezado completo en la primera página
        if ($this->PageNo() == 1) {
            // Logo arriba a la izquierda (20mm ancho)
            $logoPath = __DIR__ . '/../assets/logo_crn.png';
            if (file_exists($logoPath)) {
                $this->Image($logoPath, 20, 8, 20);
            }

            // Información institucional centrada
            $this->SetY(10);
            $this->SetFont('Arial', 'B', 14);
            $this->Cell(0, 8, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'ESCUELA CARMEN REVECO NÚÑEZ'), 0, 1, 'C');
            $this->SetFont('Arial', '', 10);
            $this->Cell(0, 5, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'RBD: 10671-2 | AVDA. MIGUEL LETELIER S-N PAINE'), 0, 1, 'C');
            $this->Cell(0, 5, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'TELÉFONO: +569 6606 0084 | EMAIL: ESCUELACRN@PAINEDUCA.CL'), 0, 1, 'C');

            $this->Ln(5);
            $this->SetFont('Arial', 'B', 12);
            $this->SetFillColor(128, 0, 32); // Color vino
            $this->SetTextColor(255, 255, 255);
            $w = $this->getAnchoDisponible();
            $this->Cell($w, 8, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'FICHA DE MATRÍCULA'), 1, 1, 'C', true);
            $this->SetTextColor(0, 0, 0);

            $this->SetFont('Arial', '', 9); // Reducido de 10 a 9 para evitar desbordamiento
            // Información del curso en una fila más compacta
            $tipo  = 'TIPO ENSEÑANZA: ' . strtoupper($this->alumno['tipo_ensenanza_nombre'] ?? 'N/A');
            $grado = 'GRADO: ' . strtoupper($this->alumno['grado_nombre'] ?? 'N/A');

            // Formatear la fecha de matrícula
            $fecha_raw = $this->alumno['fecha_matricula'] ?? '';
            $fecha_formateada = '';
            if (!empty($fecha_raw)) {
                $fecha_obj = DateTime::createFromFormat('Y-m-d', $fecha_raw);
                if ($fecha_obj) {
                    $fecha_formateada = $fecha_obj->format('d/m/Y');
                } else {
                    $fecha_formateada = $fecha_raw;
                }
            }
            $fecha = 'FECHA MATRÍCULA: ' . ($fecha_formateada ?: 'N/A');

            $this->SetFillColor(240, 240, 240);
            // Distribuir proporcionalmente: 43% + 29% + 28% = 100%
            $this->Cell($w * 0.43, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $tipo), 1, 0, 'L', true);
            $this->Cell($w * 0.29, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $grado), 1, 0, 'L', true);
            $this->Cell($w * 0.28, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $fecha), 1, 1, 'L', true);
            $this->Ln(8);
        } else {
            // En páginas siguientes, solo mostrar título pequeño
            $this->SetFont('Arial', 'B', 10);
            $this->Cell(0, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'FICHA DE MATRÍCULA - ' . trim(($this->alumno['nombre'] ?? '') . ' ' . ($this->alumno['ap_paterno'] ?? '') . ' ' . ($this->alumno['ap_materno'] ?? ''))), 0, 1, 'C');
            $this->Ln(3);
        }
    }

    function Footer()
    {
        $this->SetY(-15);
        $this->SetFont('Arial', 'I', 8);
        $this->SetTextColor(128, 128, 128);
        // Información a la izquierda
        $fecha = date('d/m/Y H:i');
        $this->Cell(95, 5, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', "Documento generado el: $fecha"), 0, 0, 'L');
        // Página a la derecha
        $this->Cell(95, 5, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'Página ' . $this->PageNo() . ' de {nb}'), 0, 1, 'R');
        $this->SetTextColor(0, 0, 0);
    }

    // Este método ya recibía los datos, pero ahora lo llamaremos sin argumentos
    function FancyTableAlumno()
    {
        $alumno = $this->alumno;
        $w = $this->getAnchoDisponible(); // Ancho dinámico según página
        $w2 = $w / 2; // Mitad del ancho para columnas dobles

        // --------------------
        // BLOQUE 1: Datos personales
        // --------------------
        $this->SetFont('Arial', 'B', 11);
        $this->SetFillColor(230, 230, 230);
        $w = $this->getAnchoDisponible();
        $this->Cell($w, 8, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'DATOS PERSONALES DEL ESTUDIANTE'), 1, 1, 'C', true);
        $this->SetFont('Arial', '', 10);

        $nombre = trim(($alumno['nombre'] ?? '') . ' ' . ($alumno['ap_paterno'] ?? '') . ' ' . ($alumno['ap_materno'] ?? ''));
        $this->Cell($w, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', "Nombre completo: $nombre"), 1, 1);

        $this->Cell($w2, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', "RUN: " . ($alumno['run'] ?? '')), 1, 0);
        $this->Cell($w2, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', "Fecha de nacimiento: " . ($alumno['fecha_nac'] ?? '')), 1, 1);

        $this->Cell($w2, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', "Edad: " . ($alumno['edad'] ?? '') . " años"), 1, 0);
        $this->Cell($w2, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', "Nacionalidad: " . ($alumno['nacionalidad'] ?? '')), 1, 1);

        $this->Cell($w, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', "Domicilio: " . ($alumno['domicilio'] ?? '')), 1, 1);

        // Información académica integrada
        $repitente = ((int)($alumno['repitente'] ?? 0) === 1) ? 'Sí' : 'No';
        $this->Cell($w2, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', "Repitente: " . $repitente), 1, 0);
        $this->Cell($w2, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', "Grado de repitencia: " . ($alumno['grado_repitencia'] ?? '')), 1, 1);

        $this->Cell($w, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', "Colegio de procedencia: " . ($alumno['colegio_procedencia'] ?? '')), 1, 1);

        $hermanos_escuela = ((int)($alumno['hermanos_escuela'] ?? 0) === 0 ? 'No' : 'Sí (' . $alumno['hermanos_escuela'] . ')');
        $this->Cell($w2, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', "Hermanos en la escuela: " . $hermanos_escuela), 1, 0);
        $this->Cell($w2, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', "Grados de hermanos: " . ($alumno['grado_hermanos'] ?? '')), 1, 1);

        $this->Ln(5);

        // --------------------
        // BLOQUE 2: Información social y familiar
        // --------------------
        $this->SetFont('Arial', 'B', 11);
        $this->SetFillColor(230, 230, 230);
        $w = $this->getAnchoDisponible();
        $this->Cell($w, 8, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'INFORMACIÓN SOCIAL Y FAMILIAR'), 1, 1, 'C', true);
        $this->SetFont('Arial', '', 10);

        // --- CAMPOS REORDENADOS LÓGICAMENTE ---
        $col1 = [
            // Grupo 1: Hogar y Familia
            ["Vive con", $alumno['vive_con'] ?? ''],
            ["Integrantes familia", $alumno['integrantes_familia'] ?? ''],
            // Grupo 2: Logística y Ubicación
            ["Transporte", ((int)($alumno['transporte'] ?? 0) === 1) ? 'Sí' : 'No'],
            ["Sector", $alumno['sector'] ?? ''],
            // Grupo 3: Beneficios y Programas
            ["Junaeb", ((int)($alumno['junaeb'] ?? 0) === 1) ? 'Sí' : 'No'],
            ["Programa social", $alumno['programa_social'] ?? ''],
        ];

        $col2 = [
            // Grupo 4: Cultural y Personal
            ["Etnia", $alumno['etnia'] ?? ''],
            ["Opta religión", ((int)($alumno['opta_religion'] ?? 0) === 1) ? 'Sí' : 'No'],
            ["Religión", $alumno['religion'] ?? ''],
            // Grupo 5: Tecnología
            ["Internet hogar", ((int)($alumno['internet_hogar'] ?? 0) === 1) ? 'Sí' : 'No'],
            ["Computador hogar", ((int)($alumno['computador_hogar'] ?? 0) === 1) ? 'Sí' : 'No'],
            ["Uso imagen", ((int)($alumno['uso_imagen'] ?? 0) === 1) ? 'Sí' : 'No'],
        ];


        $maxRows = max(count($col1), count($col2));
        for ($i = 0; $i < $maxRows; $i++) {
            $item1 = isset($col1[$i]) ? $col1[$i] : ["", ""];
            $item2 = isset($col2[$i]) ? $col2[$i] : ["", ""];

            // Solo mostrar la fila si al menos uno de los campos tiene contenido
            if (!empty($item1[0]) || !empty($item2[0])) {
                $txt1 = !empty($item1[0]) ? iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $item1[0] . ': ' . $item1[1]) : '';
                $txt2 = !empty($item2[0]) ? iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $item2[0] . ': ' . $item2[1]) : '';
                $this->Cell($w2, 6, $txt1, 1, 0);
                $this->Cell($w2, 6, $txt2, 1, 1);
            }
        }

        // --- NUEVO: Fila combinada para Orden de Alejamiento ---
        $orden_alejamiento_val = ((int)($alumno['orden_alejamiento'] ?? 0) === 0 ? 'No' : 'Sí');
        $txt1 = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'Orden alejamiento: ' . $orden_alejamiento_val);
        $txt2 = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'Observación: ' . ($alumno['observacion_alejamiento'] ?? ''));
        $this->Cell($w2, 6, $txt1, 1, 0);
        $this->Cell($w2, 6, $txt2, 1, 1);

        $this->Ln(5);

        // --------------------
        // BLOQUE 3: Información de salud
        // --------------------
        $this->SetFont('Arial', 'B', 11);
        $this->SetFillColor(230, 230, 230);
        $w = $this->getAnchoDisponible();
        $this->Cell($w, 8, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'INFORMACIÓN DE SALUD'), 1, 1, 'C', true);
        $this->SetFont('Arial', '', 10);

        // Mostrar los datos de salud en una sola columna, cada campo en una línea
        $w_salud = $w; // Usar el ancho dinámico
        $h = 6;

        $salud_fields = [
            ["Sistema de salud", $alumno['sistema_salud'] ?? ''],
            ["Alergias", $alumno['alergias'] ?? ''],
            ["Enfermedad que requiere cuidado", $alumno['enfermedad_cuidado'] ?? ''],
            ["Medicamento contraindicado", $alumno['medicamento_contraindicado'] ?? ''],
            ["Medicamento de uso diario", $alumno['medicamento_uso_diario'] ?? ''],
            ["Observaciones médicas", $alumno['observaciones'] ?? '']
        ];

        foreach ($salud_fields as $field) {
            if (!empty($field[1])) {
                $this->MultiCell($w_salud, $h, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $field[0] . ": " . $field[1]), 1);
            } else {
                $this->Cell($w_salud, $h, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $field[0] . ": "), 1, 1);
            }
        }
        $this->Ln(5);
    }

    // Este método ya recibía los datos, pero ahora lo llamaremos sin argumentos

    function FancyTableFamilia()
    {
        $familiares = $this->familiares;
        $w = $this->getAnchoDisponible(); // Ancho dinámico según página (185.9mm)

        // Calcular anchos proporcionales basados en 185.9mm total
        // Mantener las proporciones originales pero ajustadas al nuevo ancho
        // Fila 1: Label1 (13%) + Data1 (55%) + Label2 (11%) + Data2 (21%) = 100%
        $w_label1 = round($w * 0.13, 1);  // ~24.2mm
        $w_data1 = round($w * 0.55, 1);   // ~102.2mm
        $w_label2 = round($w * 0.11, 1);  // ~20.4mm
        $w_data2 = $w - $w_label1 - $w_data1 - $w_label2; // Resto para completar exactamente el ancho

        // Para filas de una sola columna de datos
        $w_full = $w - $w_label1;

        // Para filas con dos columnas de datos (teléfonos, escolaridad/profesión)
        $w_half = ($w - (2 * $w_label1)) / 2;

        // Título de la sección
        $this->SetFont('Arial', 'B', 11);
        $this->SetFillColor(230, 230, 230);
        $w_titulo = $this->getAnchoDisponible();
        $this->Cell($w_titulo, 8, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'INFORMACIÓN FAMILIAR'), 1, 1, 'C', true);
        $this->SetFont('Arial', '', 10);

        if (empty($familiares)) {
            $this->Cell(0, 7, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', "No hay datos familiares registrados."), 1, 1, 'C');
            return;
        }

        foreach ($familiares as $index => $f) {
            // Verificar si hay espacio suficiente para el familiar completo (~50mm)
            // Si no hay espacio, forzar nueva página
            $altura_familiar_estimada = 50; // Altura aproximada de un familiar completo
            if (($this->GetY() + $altura_familiar_estimada) > ($this->GetPageHeight() - 20)) {
                $this->AddPage();
            }

            $nombre_fam  = trim(($f['nombre'] ?? '') . ' ' . ($f['ap_paterno'] ?? '') . ' ' . ($f['ap_materno'] ?? ''));
            $run         = (string)($f['run'] ?? '');
            $domicilio   = (string)($f['domicilio'] ?? '');
            $roles       = (string)($f['roles'] ?? '');
            $parentesco  = (string)($f['parentesco_mostrar'] ?? '');
            $tel1        = (string)($f['telefono'] ?? '');
            $tel2        = (string)($f['telefono2'] ?? '');
            $email       = (string)($f['email'] ?? '');
            $escolaridad = (string)($f['escolaridad'] ?? '');
            $profesion   = (string)($f['profesion'] ?? '');
            $actividad   = (string)($f['actividad_laboral'] ?? '');

            // Encabezado del familiar
            $this->SetFont('Arial', 'B', 10);
            $this->SetFillColor(245, 245, 245);
            $titulo_familiar = !empty($roles) ? strtoupper($roles) : 'FAMILIAR ' . ($index + 1);
            $this->Cell($w, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $titulo_familiar), 1, 1, 'C', true);
            $this->SetFont('Arial', '', 10);

            // Fila 1: Nombre completo y RUN
            $this->Cell($w_label1, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'Nombre:'), 1, 0, 'L');
            $this->Cell($w_data1, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $nombre_fam), 1, 0, 'L');
            $this->Cell($w_label2, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'RUN:'), 1, 0, 'L');
            $this->Cell($w_data2, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $run), 1, 1, 'L');

            // Fila 2: Parentesco
            $this->Cell($w_label1, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'Parentesco:'), 1, 0, 'L');
            $this->Cell($w_full, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $parentesco), 1, 1, 'L');

            // Fila 3: Domicilio
            $this->Cell($w_label1, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'Domicilio:'), 1, 0, 'L');
            $this->Cell($w_full, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $domicilio), 1, 1, 'L');

            // Fila 4: Teléfonos
            $this->Cell($w_label1, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'Teléfono 1:'), 1, 0, 'L');
            $this->Cell($w_half, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $tel1), 1, 0, 'L');
            $this->Cell($w_label1, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'Teléfono 2:'), 1, 0, 'L');
            $this->Cell($w_half, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $tel2), 1, 1, 'L');

            // Fila 5: Email
            $this->Cell($w_label1, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'Email:'), 1, 0, 'L');
            $this->Cell($w_full, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $email), 1, 1, 'L');

            // Fila 6: Escolaridad y Profesión
            $this->Cell($w_label1, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'Escolaridad:'), 1, 0, 'L');
            $this->Cell($w_half, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $escolaridad), 1, 0, 'L');
            $this->Cell($w_label1, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'Profesión:'), 1, 0, 'L');
            $this->Cell($w_half, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $profesion), 1, 1, 'L');

            // Fila 7: Actividad laboral
            $this->Cell($w_label1, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'Actividad:'), 1, 0, 'L');
            $this->Cell($w_full, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $actividad), 1, 1, 'L');

            $this->Ln(3); // Espacio entre familiares
        }
    }

    function NbLines($w, $txt)
    {
        $cw = &$this->CurrentFont['cw'];
        if ($w == 0)
            $w = $this->w - $this->rMargin - $this->x;
        $wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize;
        $s = str_replace("\r", '', $txt);
        $nb = strlen($s);
        if ($nb > 0 and $s[$nb - 1] == "\n")
            $nb--;
        $sep = -1;
        $i = 0;
        $j = 0;
        $l = 0;
        $nl = 1;
        while ($i < $nb) {
            $c = $s[$i];
            if ($c == "\n") {
                $i++;
                $sep = -1;
                $j = $i;
                $l = 0;
                $nl++;
                continue;
            }
            if ($c == ' ')
                $sep = $i;
            $l += $cw[$c];
            if ($l > $wmax) {
                if ($sep == -1) {
                    if ($i == $j)
                        $i++;
                } else
                    $i = $sep + 1;
                $sep = -1;
                $j = $i;
                $l = 0;
                $nl++;
            } else
                $i++;
        }
        return $nl;
    }
}

// Crear PDF, pasando los datos directamente al constructor
$pdf = new PDF($alumno, $familiares);

// Configurar márgenes alternados para impresión a doble cara con perforaciones
// Páginas impares (1,3,5...): margen izquierdo 20mm para perforaciones
// Páginas pares (2,4,6...): margen derecho 20mm para perforaciones
$pdf->SetAutoPageBreak(true, 15); // Margen inferior de 15mm
$pdf->AliasNbPages(); // Para mostrar el total de páginas en el footer
$pdf->AddPage();

$pdf->SetFont('Arial', '', 10);
$pdf->FancyTableAlumno();

$pdf->FancyTableFamilia();

// Buscar apoderado titular
$apoderado_titular = null;
foreach ($familiares as $f) {
    if (isset($f['roles']) && stripos($f['roles'], 'apoderado titular') !== false) {
        $apoderado_titular = $f;
        break;
    }
}
$nombre_apoderado = '';
if ($apoderado_titular) {
    $nombre_apoderado = trim(($apoderado_titular['nombre'] ?? '') . ' ' . ($apoderado_titular['ap_paterno'] ?? '') . ' ' . ($apoderado_titular['ap_materno'] ?? ''));
}
$nombre_alumno = trim(($alumno['nombre'] ?? '') . ' ' . ($alumno['ap_paterno'] ?? '') . ' ' . ($alumno['ap_materno'] ?? ''));
$nombre_grado = strtoupper(trim($alumno['grado_nombre'] ?? ''));
$anio_actual = date('Y');



// --- NUEVO BLOQUE: Verificar espacio antes de cada cuadro y dibujar ambos juntos ---
function dibujarSeccionTabla($pdf, $titulo, $texto, $incluir_firma = true)
{
    // Título de la sección con el mismo estilo que las otras secciones
    $pdf->SetFont('Arial', 'B', 11);
    $pdf->SetFillColor(230, 230, 230);
    $w = $pdf->getAnchoDisponible();
    $pdf->Cell($w, 8, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $titulo), 1, 1, 'C', true);
    $pdf->SetFont('Arial', '', 10);

    // Contenido del texto en una celda de tabla con padding
    $w = $pdf->getAnchoDisponible(); // Usar ancho dinámico según página
    $h = 5;
    $padding = 3; // Padding interno para el texto

    // Reducir espaciado entre párrafos en el texto
    $texto_formateado = str_replace('\n\n', '\n', $texto);

    // Calcular altura necesaria para el texto
    $nbLines = $pdf->NbLines($w - (2 * $padding), iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $texto_formateado));
    $alturaTexto = $nbLines * $h;

    // Verificar si necesitamos nueva página
    $yActual = $pdf->GetY();
    $alturaTotal = $alturaTexto + (2 * $padding) + ($incluir_firma ? 25 : 5); // Aumentado espacio para firma de 18 a 25

    if (($yActual + $alturaTotal) > ($pdf->GetPageHeight() - 20)) {
        $pdf->AddPage();
    }

    // Posición inicial para el contenido con padding
    $x_inicial = $pdf->GetX();
    $y_inicial = $pdf->GetY();

    // Dibujar el rectángulo de la celda primero
    $pdf->Rect($x_inicial, $y_inicial, $w, $alturaTexto + (2 * $padding));

    // Posicionar el texto con padding
    $pdf->SetXY($x_inicial + $padding, $y_inicial + $padding);

    // Dibujar el texto sin bordes (ya tenemos el rectángulo)
    $pdf->MultiCell($w - (2 * $padding), $h, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $texto_formateado), 0, 'J');

    // Mover cursor después del contenido
    $pdf->SetY($y_inicial + $alturaTexto + (2 * $padding));

    if ($incluir_firma) {
        // Crear celda de firma con texto en la parte inferior
        $altura_firma = 22;
        $x_firma = $pdf->GetX();
        $y_firma = $pdf->GetY();

        // Dibujar el rectángulo de la celda de firma
        $pdf->Rect($x_firma, $y_firma, $w, $altura_firma);

        // Posicionar el texto "FIRMA APODERADO:" en la parte inferior de la celda
        $pdf->SetXY($x_firma, $y_firma + $altura_firma - 8); // 8 píxeles desde abajo
        $pdf->Cell($w, 6, iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'FIRMA APODERADO: ___________________________'), 0, 0, 'R');

        // Mover cursor después de la celda de firma
        $pdf->SetY($y_firma + $altura_firma);
    }

    $pdf->Ln(2); // Espacio reducido después de la sección
}

// --- DIBUJAR AMBAS SECCIONES CON ESTILO DE TABLA ---
$pdf->Ln(4); // Reducido de 8 a 4 para menos espacio inicial
$texto_compromiso = "Yo, $nombre_apoderado, como apoderado(a) de $nombre_alumno, quien cursa el $nombre_grado, del año escolar $anio_actual.\n1.- Recibo y tomo conocimiento del Reglamento Interno, Reglamento de Evaluación y Plan de Convivencia Escolar, aceptando las normas internas del colegio en cuanto a los aspectos académicos, comportamiento disciplinario, uso del vestuario escolar, presentación personal y los aspectos valóricos que le rigen.\n2.- Me comprometo a la brevedad informar en la dirección del establecimiento, en secretaría, sobre cambios de domicilio, número de teléfono o correo electrónico con el propósito de mantener los canales de comunicación activos.\n3.- Me comprometo a que mi hijo utilice el celular solo con fines pedagógicos, asumiendo que el establecimiento no se hará responsable en caso de extravío o desperfecto del aparato, según la normativa vigente.";
dibujarSeccionTabla($pdf, 'REGLAMENTOS Y COMPROMISOS', $texto_compromiso, true);

$uso_imagen_valor = ((int)($alumno['uso_imagen'] ?? 0) === 1) ? 'Sí' : 'No';
if ($uso_imagen_valor === 'Sí') {
    $texto_imagen = "Yo, $nombre_apoderado, como apoderado(a) de $nombre_alumno, quien cursa el $nombre_grado, del año escolar $anio_actual.\n$uso_imagen_valor, autorizo al establecimiento a que haga uso de la imagen de mi pupilo con fines pedagógicos (fotografías, videos), pudiendo ser publicados en las redes sociales del establecimiento.";
} else {
    $texto_imagen = "Yo, $nombre_apoderado, como apoderado(a) de $nombre_alumno, quien cursa el $nombre_grado, del año escolar $anio_actual.\n$uso_imagen_valor, autorizo al establecimiento a que haga uso de la imagen de mi pupilo.";
}
dibujarSeccionTabla($pdf, 'AUTORIZACION USO DE IMAGEN', $texto_imagen, true);

$primer_nombre = explode(' ', trim($alumno['nombre']))[0] ?? '';
$ap_paterno = trim($alumno['ap_paterno'] ?? '');
$grado = strtoupper(trim($alumno['grado_nombre'] ?? ''));
$nombre_archivo = 'FM_' . preg_replace('/[^A-Za-z0-9_\-]/', '_', strtoupper($primer_nombre . '_' . $ap_paterno . '_' . $grado)) . '.pdf';
$pdf->Output('I', $nombre_archivo);
