<?php
session_start();
require_once '../config/database.php';

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

$conn = (new Database())->connect();

$anioBoletinPdf = (string)date('Y');
$gestionActual = $anioBoletinPdf;
try {
    $stmtGestionBoletin = $conn->query('SELECT anio_escolar FROM configuracion_sistema ORDER BY id DESC LIMIT 1');
    if ($stmtGestionBoletin) {
        $gestBoletin = trim((string)$stmtGestionBoletin->fetchColumn());
        if ($gestBoletin !== '') {
            $gestionActual = $gestBoletin;
        }
        if ($gestBoletin !== '' && preg_match('/\b(20\d{2})\b/', $gestBoletin, $mAnio)) {
            $anioBoletinPdf = $mAnio[1];
        }
    }
} catch (PDOException $e) {
    // Mantener año por defecto del servidor
}

// Obtener ID del curso desde parámetro GET
$id_curso = $_GET['id_curso'] ?? 0;

if (!$id_curso) {
    header('Location: dashboard_primaria.php');
    exit();
}

// Determinar el modo de visualización (trimestral/anual)
$vista = $_GET['vista'] ?? 'trimestral';
$trimestre = isset($_GET['trimestre']) ? (int)$_GET['trimestre'] : 1;

// Obtener información del curso
$stmt_curso = $conn->prepare("SELECT nivel, curso, paralelo FROM cursos WHERE id_curso = ?");
$stmt_curso->execute([$id_curso]);
$curso_info = $stmt_curso->fetch(PDO::FETCH_ASSOC);

if (!$curso_info) {
    echo "<div class='alert alert-danger'>Curso no encontrado</div>";
    exit();
}

$nombre_curso = $curso_info['nivel'] . ' ' . $curso_info['curso'] . ' "' . $curso_info['paralelo'] . '"';

// Función para generar abreviaturas automáticas
function generarAbreviatura($nombre)
{
    $palabras = explode(' ', $nombre);
    $abreviatura = '';

    foreach ($palabras as $palabra) {
        if (strlen($palabra) > 3) {
            $abreviatura .= strtoupper(substr($palabra, 0, 3));
        } else {
            $abreviatura .= strtoupper($palabra);
        }
    }

    return substr($abreviatura, 0, 6);
}

// Obtener todas las materias del curso
$stmt_materias = $conn->prepare("
    SELECT 
        m.id_materia, 
        m.nombre_materia,
        m.materia_padre_id,
        (SELECT COUNT(*) FROM materias WHERE materia_padre_id = m.id_materia) AS tiene_hijas
    FROM cursos_materias cm
    JOIN materias m ON cm.id_materia = m.id_materia
    WHERE cm.id_curso = ?
    ORDER BY m.materia_padre_id, m.id_materia
");
$stmt_materias->execute([$id_curso]);
$todas_materias = $stmt_materias->fetchAll(PDO::FETCH_ASSOC);

if (empty($todas_materias)) {
    $todas_materias = []; // Asegurar que sea un array vacío
}

// Organizar materias
$materias_padre = [];
$materias_hijas = [];
$materias_individuales = [];

foreach ($todas_materias as $materia) {
    $materia['abreviatura'] = generarAbreviatura($materia['nombre_materia']);

    if ($materia['materia_padre_id'] === null) {
        if ($materia['tiene_hijas'] > 0) {
            $materias_padre[$materia['id_materia']] = $materia;
        } else {
            $materias_individuales[] = $materia;
        }
    } else {
        $materias_hijas[$materia['materia_padre_id']][] = $materia;
    }
}

// Vincular hijas con padres
foreach ($materias_padre as &$padre) {
    $padre['hijas'] = $materias_hijas[$padre['id_materia']] ?? [];
}
unset($padre);

// Obtener estudiantes
$stmt_estudiantes = $conn->prepare("
    SELECT id_estudiante, apellido_paterno, apellido_materno, nombres 
    FROM estudiantes 
    WHERE id_curso = ?
    ORDER BY apellido_paterno, apellido_materno, nombres
");
$stmt_estudiantes->execute([$id_curso]);
$estudiantes = $stmt_estudiantes->fetchAll(PDO::FETCH_ASSOC);

if (empty($estudiantes)) {
    $estudiantes = []; // Asegurar que sea un array vacío
}

// Obtener calificaciones (modelo actual: parciales + trimestrales)
$calificaciones = [];
$idsEstudiantes = array_map(static fn($e) => (int)$e['id_estudiante'], $estudiantes);
$idsMaterias = array_map(static fn($m) => (int)$m['id_materia'], $todas_materias);

if (!empty($idsEstudiantes) && !empty($idsMaterias)) {
    $placeholdersEst = implode(',', array_fill(0, count($idsEstudiantes), '?'));
    $placeholdersMat = implode(',', array_fill(0, count($idsMaterias), '?'));
    $paramsBase = array_merge([$gestionActual], $idsEstudiantes, $idsMaterias);

    $stmtParciales = $conn->prepare(" 
        SELECT cp.id_estudiante, cp.id_materia, pe.trimestre, AVG(cp.calificacion) AS promedio_parcial
        FROM calificaciones_parciales cp
        INNER JOIN periodos_evaluacion pe ON pe.id_periodo_evaluacion = cp.id_periodo_evaluacion
        WHERE pe.gestion = ?
          AND cp.id_estudiante IN ($placeholdersEst)
          AND cp.id_materia IN ($placeholdersMat)
        GROUP BY cp.id_estudiante, cp.id_materia, pe.trimestre
    ");
    $stmtParciales->execute($paramsBase);

    $parcialesPorTrim = [];
    foreach ($stmtParciales->fetchAll(PDO::FETCH_ASSOC) as $rowParcial) {
        $idEst = (int)$rowParcial['id_estudiante'];
        $idMat = (int)$rowParcial['id_materia'];
        $trim = (int)$rowParcial['trimestre'];
        $parcialesPorTrim[$idEst][$idMat][$trim] = $rowParcial['promedio_parcial'] !== null
            ? (float)$rowParcial['promedio_parcial'] : null;
    }

    $stmtTrim = $conn->prepare(" 
        SELECT id_estudiante, id_materia, trimestre, autoevaluacion, nota_extra
        FROM calificaciones_trimestrales
        WHERE gestion = ?
          AND id_estudiante IN ($placeholdersEst)
          AND id_materia IN ($placeholdersMat)
    ");
    $stmtTrim->execute($paramsBase);

    $extrasPorTrim = [];
    foreach ($stmtTrim->fetchAll(PDO::FETCH_ASSOC) as $rowTrim) {
        $idEst = (int)$rowTrim['id_estudiante'];
        $idMat = (int)$rowTrim['id_materia'];
        $trim = (int)$rowTrim['trimestre'];
        $extrasPorTrim[$idEst][$idMat][$trim] = [
            'auto' => $rowTrim['autoevaluacion'] !== null ? (float)$rowTrim['autoevaluacion'] : 0.0,
            'extra' => $rowTrim['nota_extra'] !== null ? (float)$rowTrim['nota_extra'] : 0.0,
        ];
    }

    foreach ($idsEstudiantes as $idEst) {
        foreach ($idsMaterias as $idMat) {
            for ($trim = 1; $trim <= 3; $trim++) {
                $base = $parcialesPorTrim[$idEst][$idMat][$trim] ?? null;
                $auto = $extrasPorTrim[$idEst][$idMat][$trim]['auto'] ?? 0.0;
                $extra = $extrasPorTrim[$idEst][$idMat][$trim]['extra'] ?? 0.0;
                if ($base === null && $auto == 0.0 && $extra == 0.0) {
                    $calificaciones[$idEst][$idMat][$trim] = '-';
                    continue;
                }
                $total = ($base ?? 0.0) + $auto + $extra;
                $calificaciones[$idEst][$idMat][$trim] = number_format($total, 2, '.', '');
            }
        }
    }
}

// Calcular promedios
$promedios = [];
foreach ($estudiantes as $est) {
    $total_notas = 0;
    $contador_notas = 0;

    // Incluir materias sin categoría
    foreach ($materias_individuales as $mat) {
        if ($vista == 'trimestral') {
            $nota = $calificaciones[$est['id_estudiante']][$mat['id_materia']][$trimestre] ?? '-';
            if (is_numeric($nota)) {
                $total_notas += $nota;
                $contador_notas++;
            }
        } else {
            // En vista anual, promediamos los tres trimestres
            $suma_trim = 0;
            $count_trim = 0;
            for ($t = 1; $t <= 3; $t++) {
                $nota_t = $calificaciones[$est['id_estudiante']][$mat['id_materia']][$t] ?? '-';
                if (is_numeric($nota_t)) {
                    $suma_trim += $nota_t;
                    $count_trim++;
                }
            }
            if ($count_trim > 0) {
                $total_notas += ($suma_trim / $count_trim);
                $contador_notas++;
            }
        }
    }

    // Incluir submaterias (no las materias padre)
    foreach ($materias_padre as $padre) {
        foreach ($padre['hijas'] as $hija) {
            if ($vista == 'trimestral') {
                $nota = $calificaciones[$est['id_estudiante']][$hija['id_materia']][$trimestre] ?? '-';
                if (is_numeric($nota)) {
                    $total_notas += $nota;
                    $contador_notas++;
                }
            } else {
                // En vista anual, promediamos los tres trimestres
                $suma_trim = 0;
                $count_trim = 0;
                for ($t = 1; $t <= 3; $t++) {
                    $nota_t = $calificaciones[$est['id_estudiante']][$hija['id_materia']][$t] ?? '-';
                    if (is_numeric($nota_t)) {
                        $suma_trim += $nota_t;
                        $count_trim++;
                    }
                }
                if ($count_trim > 0) {
                    $total_notas += ($suma_trim / $count_trim);
                    $contador_notas++;
                }
            }
        }
    }

$promedios[$est['id_estudiante']] = $contador_notas > 0 ?
        number_format($total_notas / $contador_notas, 2) : '-';
}

function claseNotaBoletin($nota)
{
    if (!is_numeric($nota)) {
        return '';
    }
    $valor = round((float)$nota, 2);
    if ($valor == 50.0) {
        return ' nota-trim-50';
    }
    if ($valor < 50.0) {
        return ' nota-trim-aplazado';
    }
    return ' nota-trim-aprobado';
}

function formatearNotaBoletin($nota)
{
    if (!is_numeric($nota)) {
        return '-';
    }
    return (string)round((float)$nota);
}
?>
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <title>Boletín <?= htmlspecialchars($nombre_curso) ?></title>
    <link rel="stylesheet" href="../css/bootstrap.min.css">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/remixicon@4.1.0/fonts/remixicon.css">
    <style>
        body {
            font-family: 'Segoe UI', Arial, sans-serif;
            font-size: 0.9rem;
        }

        .boletin-table {
            width: 100%;
            border-collapse: collapse;
            table-layout: auto;
        }

        .boletin-table th,
        .boletin-table td {
            border: 1px solid #dee2e6;
            padding: 6px;
            text-align: center;
            vertical-align: middle;
        }

        .encabezado-principal {
            background-color: #2f75b5;
            color: white;
            font-weight: bold;
            font-size: 1.1em;
            border-top: 2px solid #1c4481;
            border-bottom: 2px solid #1c4481;
        }

        .encabezado-grupo {
            background-color: #d9e1f2;
            font-weight: bold;
            color: #305496;
        }

        .encabezado-submateria {
            background-color: #e7edf7;
            font-weight: 600;
        }

        .tr-striped td {
            background-color: #f8f9fa;
        }

        .nombre-estudiante {
            text-align: left;
            font-weight: 500;
            position: sticky;
            left: 2.5rem;
            background: white;
            z-index: 2;
            min-width: 220px;
        }

        .numero-estudiante {
            position: sticky;
            left: 0;
            background: white;
            z-index: 3;
            min-width: 2.5rem;
            border-right: 2px solid #dee2e6;
        }

        .promedio-general {
            background-color: #ffedea;
            color: #d72c16;
            font-weight: bold;
        }

        .nota-trim-50 {
            background: #dbeafe;
            color: #1d4ed8;
            font-weight: 700;
        }

        .nota-trim-aplazado {
            background: #fee2e2;
            color: #b91c1c;
            font-weight: 700;
        }

        .nota-trim-aprobado {
            background: #dcfce7;
            color: #166534;
            font-weight: 700;
        }

        .selector-container {
            display: flex;
            gap: 15px;
            margin-bottom: 20px;
        }

        .vista-actual {
            background-color: #e3f2fd;
            padding: 5px 15px;
            border-radius: 4px;
            font-weight: bold;
            color: #0d47a1;
        }

        .curso-titulo {
            flex-grow: 1;
            text-align: center;
        }

        .annual-layout {
            overflow-x: auto;
        }

        .boletin-table.boletin-anual th,
        .boletin-table.boletin-anual td {
            padding: 4px;
            font-size: 0.8rem;
        }

        .boletin-table.boletin-anual .encabezado-submateria.materia-block {
            font-size: 0.72rem;
            letter-spacing: 0.2px;
            line-height: 1.15;
            min-width: 120px;
        }

        .boletin-table.boletin-anual .trim-col {
            min-width: 42px;
            font-weight: 700;
        }

        @media print {
            .no-print {
                display: none !important;
            }

            .boletin-table th,
            .boletin-table td {
                font-size: 9pt;
            }

            .nombre-estudiante,
            .numero-estudiante {
                background-color: white !important;
            }
        }
    </style>
    <!-- Librerías para PDF -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf-autotable/3.5.28/jspdf.plugin.autotable.min.js"></script>

</head>

<body>
    <div class="container-fluid py-3">
        <!-- Cabecera con título centrado y botones a los lados -->
        <div class="d-flex justify-content-between align-items-center mb-3 no-print">
            <a href="dashboard_primaria.php" class="btn btn-secondary">
                <i class="ri-arrow-left-line"></i> Atrás
            </a>
            <h1 class="h3 text-primary curso-titulo"><?= htmlspecialchars($nombre_curso) ?></h1>
            <div class="d-flex gap-2">
                <button onclick="generarResumenOficioPDF()" class="btn btn-outline-primary">
                    <i class="ri-file-chart-line"></i> Resumen PDF Oficio
                </button>
                <button onclick="generarBoletinesPDF()" class="btn btn-primary">
                    <i class="ri-file-pdf-line"></i> Boletines PDF
                </button>
            </div>

        </div>

        <!-- Selectores de vista -->
        <div class="selector-container no-print">
            <form method="GET" action="" id="vista-form">
                <input type="hidden" name="id_curso" value="<?= $id_curso ?>">
                <div class="input-group">
                    <label class="input-group-text" for="vista">Vista</label>
                    <select class="form-select" name="vista" id="vista" onchange="document.getElementById('vista-form').submit()">
                        <option value="trimestral" <?= ($vista == 'trimestral') ? 'selected' : '' ?>>Trimestral</option>
                        <option value="anual" <?= ($vista == 'anual') ? 'selected' : '' ?>>Anual</option>
                    </select>
                </div>
            </form>

            <?php if ($vista == 'trimestral'): ?>
                <form method="GET" action="">
                    <input type="hidden" name="id_curso" value="<?= $id_curso ?>">
                    <input type="hidden" name="vista" value="trimestral">
                    <div class="input-group">
                        <label class="input-group-text" for="trimestre">Trimestre</label>
                        <select class="form-select" name="trimestre" id="trimestre" onchange="this.form.submit()">
                            <option value="1" <?= ($trimestre == 1) ? 'selected' : '' ?>>Primer trimestre</option>
                            <option value="2" <?= ($trimestre == 2) ? 'selected' : '' ?>>Segundo trimestre</option>
                            <option value="3" <?= ($trimestre == 3) ? 'selected' : '' ?>>Tercer trimestre</option>
                        </select>
                    </div>
                </form>
            <?php endif; ?>

            <div class="d-flex align-items-center">
                <div class="vista-actual">
                    <?= $vista == 'trimestral' ? 'Trimestre ' . $trimestre : 'Vista Anual' ?>
                </div>
            </div>
        </div>

        <?php if (empty($todas_materias)): ?>
            <div class="alert alert-warning">
                No hay materias asignadas a este curso.
            </div>
        <?php elseif (empty($estudiantes)): ?>
            <div class="alert alert-warning">
                No hay estudiantes matriculados en este curso.
            </div>
        <?php else: ?>
            <div class="table-responsive <?php echo $vista == 'anual' ? 'annual-layout' : ''; ?>">
                <table class="boletin-table <?php echo $vista == 'anual' ? 'boletin-anual' : ''; ?>">
                    <?php if ($vista == 'trimestral'): ?>
                        <!-- VISTA TRIMESTRAL -->
                        <thead>
                            <tr>
                                <th rowspan="2" class="numero-estudiante">#</th>
                                <th rowspan="2" class="nombre-estudiante">Estudiante</th>

                                <!-- PRIMERO: Materias individuales -->
                                <?php if (!empty($materias_individuales)): ?>
                                    <th colspan="<?= count($materias_individuales) ?>" class="encabezado-principal">
                                        <!-- Espacio en blanco como solicitado -->
                                    </th>
                                <?php endif; ?>

                                <!-- DESPUÉS: Materias padre y sus hijas -->
                                <?php foreach ($materias_padre as $padre): ?>
                                    <th colspan="<?= count($padre['hijas']) ?>" class="encabezado-grupo">
                                        <?= htmlspecialchars($padre['nombre_materia']) ?>
                                    </th>
                                <?php endforeach; ?>

                                <!-- Promedio general -->
                                <th rowspan="2" class="promedio-general">PROM. GRAL</th>
                            </tr>
                            <tr>
                                <!-- Nombres de materias individuales PRIMERO -->
                                <?php foreach ($materias_individuales as $mat): ?>
                                    <th class="encabezado-submateria">
                                        <?= htmlspecialchars($mat['abreviatura']) ?>
                                    </th>
                                <?php endforeach; ?>

                                <!-- Submaterias bajo cada materia padre DESPUÉS -->
                                <?php foreach ($materias_padre as $padre): ?>
                                    <?php foreach ($padre['hijas'] as $hija): ?>
                                        <th class="encabezado-submateria">
                                            <?= htmlspecialchars($hija['abreviatura']) ?>
                                        </th>
                                    <?php endforeach; ?>
                                <?php endforeach; ?>
                            </tr>
                        </thead>
                        <tbody>
                            <?php $contador = 1;
                            foreach ($estudiantes as $est): ?>
                                <tr class="<?= $contador % 2 == 0 ? 'tr-striped' : '' ?>">
                                    <td class="numero-estudiante"><?= $contador++ ?></td>
                                    <td class="nombre-estudiante">
                                        <?= htmlspecialchars(
                                            $est['apellido_paterno'] . ' ' .
                                                $est['apellido_materno'] . ', ' .
                                                $est['nombres']
                                        ) ?>
                                    </td>

                                    <!-- PRIMERO: Notas de materias individuales -->
                                    <?php foreach ($materias_individuales as $mat): ?>
                                        <?php $notaTrim = $calificaciones[$est['id_estudiante']][$mat['id_materia']][$trimestre] ?? '-'; ?>
                                        <td class="<?= claseNotaBoletin($notaTrim) ?>">
                                            <?= formatearNotaBoletin($notaTrim) ?>
                                        </td>
                                    <?php endforeach; ?>

                                    <!-- DESPUÉS: Notas de submaterias -->
                                    <?php foreach ($materias_padre as $padre): ?>
                                        <?php foreach ($padre['hijas'] as $hija): ?>
                                            <?php $notaTrim = $calificaciones[$est['id_estudiante']][$hija['id_materia']][$trimestre] ?? '-'; ?>
                                            <td class="<?= claseNotaBoletin($notaTrim) ?>">
                                                <?= formatearNotaBoletin($notaTrim) ?>
                                            </td>
                                        <?php endforeach; ?>
                                    <?php endforeach; ?>

                                    <!-- Promedio general -->
                                    <td class="promedio-general">
                                        <?= $promedios[$est['id_estudiante']] ?>
                                    </td>
                                </tr>
                            <?php endforeach; ?>
                        </tbody>
                    <?php else: ?>
                        <!-- VISTA ANUAL -->
                        <thead>
                            <tr>
                                <th rowspan="3" class="numero-estudiante">#</th>
                                <th rowspan="3" class="nombre-estudiante">Estudiante</th>

                                <!-- PRIMERO: Materias individuales -->
                                <?php if (!empty($materias_individuales)): ?>
                                    <th colspan="<?= count($materias_individuales) * 3 ?>" class="encabezado-principal">
                                        <!-- Espacio en blanco como solicitado -->
                                    </th>
                                <?php endif; ?>

                                <!-- DESPUÉS: Materias padre -->
                                <?php foreach ($materias_padre as $padre): ?>
                                    <th colspan="<?= count($padre['hijas']) * 3 ?>" class="encabezado-grupo">
                                        <?= htmlspecialchars($padre['nombre_materia']) ?>
                                    </th>
                                <?php endforeach; ?>

                                <!-- Promedio general -->
                                <th rowspan="3" class="promedio-general">PROM. GRAL</th>
                            </tr>
                            <tr>
                                <!-- PRIMERO: Bloque por materia individual -->
                                <?php foreach ($materias_individuales as $mat): ?>
                                    <th colspan="3" class="encabezado-submateria materia-block"><?= $mat['abreviatura'] ?></th>
                                <?php endforeach; ?>

                                <!-- DESPUÉS: Bloque por submateria -->
                                <?php foreach ($materias_padre as $padre): ?>
                                    <?php foreach ($padre['hijas'] as $hija): ?>
                                        <th colspan="3" class="encabezado-submateria materia-block"><?= $hija['abreviatura'] ?></th>
                                    <?php endforeach; ?>
                                <?php endforeach; ?>
                            </tr>
                            <tr>
                                <?php foreach ($materias_individuales as $mat): ?>
                                    <th class="encabezado-submateria trim-col">T1</th>
                                    <th class="encabezado-submateria trim-col">T2</th>
                                    <th class="encabezado-submateria trim-col">T3</th>
                                <?php endforeach; ?>

                                <?php foreach ($materias_padre as $padre): ?>
                                    <?php foreach ($padre['hijas'] as $hija): ?>
                                        <th class="encabezado-submateria trim-col">T1</th>
                                        <th class="encabezado-submateria trim-col">T2</th>
                                        <th class="encabezado-submateria trim-col">T3</th>
                                    <?php endforeach; ?>
                                <?php endforeach; ?>
                            </tr>
                        </thead>
                        <tbody>
                            <?php $contador = 1;
                            foreach ($estudiantes as $est): ?>
                                <tr class="<?= $contador % 2 == 0 ? 'tr-striped' : '' ?>">
                                    <td class="numero-estudiante"><?= $contador++ ?></td>
                                    <td class="nombre-estudiante">
                                        <?= htmlspecialchars(
                                            $est['apellido_paterno'] . ' ' .
                                                $est['apellido_materno'] . ', ' .
                                                $est['nombres']
                                        ) ?>
                                    </td>

                                    <!-- PRIMERO: Notas de materias individuales (3 trimestres) -->
                                    <?php foreach ($materias_individuales as $mat): ?>
                                        <?php for ($t = 1; $t <= 3; $t++): ?>
                                            <?php $notaTrim = $calificaciones[$est['id_estudiante']][$mat['id_materia']][$t] ?? '-'; ?>
                                            <td class="<?= claseNotaBoletin($notaTrim) ?>">
                                                <?= formatearNotaBoletin($notaTrim) ?>
                                            </td>
                                        <?php endfor; ?>
                                    <?php endforeach; ?>

                                    <!-- DESPUÉS: Notas de submaterias (3 trimestres) -->
                                    <?php foreach ($materias_padre as $padre): ?>
                                        <?php foreach ($padre['hijas'] as $hija): ?>
                                            <?php for ($t = 1; $t <= 3; $t++): ?>
                                                <?php $notaTrim = $calificaciones[$est['id_estudiante']][$hija['id_materia']][$t] ?? '-'; ?>
                                                <td class="<?= claseNotaBoletin($notaTrim) ?>">
                                                    <?= formatearNotaBoletin($notaTrim) ?>
                                                </td>
                                            <?php endfor; ?>
                                        <?php endforeach; ?>
                                    <?php endforeach; ?>

                                    <!-- Promedio general -->
                                    <td class="promedio-general">
                                        <?= $promedios[$est['id_estudiante']] ?>
                                    </td>
                                </tr>
                            <?php endforeach; ?>
                        </tbody>
                    <?php endif; ?>
                </table>
            </div>
        <?php endif; ?>
    </div>

    <script>
        function formatearNotaBoletinJs(valor) {
            const n = Number.parseFloat(String(valor).replace(',', '.'));
            if (!Number.isFinite(n)) return '-';
            return String(Math.round(n));
        }

        function generarResumenOficioPDF() {
            const estudiantes = <?= json_encode($estudiantes) ?>;
            const materiasIndividuales = <?= json_encode($materias_individuales) ?>;
            const materiasPadreObj = <?= json_encode($materias_padre) ?>;
            const materiasPadre = Object.keys(materiasPadreObj).map(key => materiasPadreObj[key]);
            const calificaciones = <?= json_encode($calificaciones) ?>;
            const promedios = <?= json_encode($promedios) ?>;
            const nombreCurso = <?= json_encode(htmlspecialchars_decode($nombre_curso)) ?>;
            const vistaActual = <?= json_encode($vista) ?>;
            const trimestreActual = <?= (int)$trimestre ?>;
            const anioGestionBoletin = <?= json_encode($anioBoletinPdf) ?>;

            if (!Array.isArray(estudiantes) || estudiantes.length === 0) {
                alert('No hay estudiantes para generar el resumen');
                return;
            }

            const { jsPDF } = window.jspdf;
            const doc = new jsPDF({
                orientation: 'landscape',
                unit: 'pt',
                format: 'a4'
            });

            const pageWidth = doc.internal.pageSize.getWidth();
            const pageMargin = 12;

            const todasMaterias = [];
            materiasIndividuales.forEach(m => {
                todasMaterias.push({ id: m.id_materia, etiqueta: m.abreviatura || m.nombre_materia, nombre: m.nombre_materia });
            });
            materiasPadre.forEach(p => {
                (p.hijas || []).forEach(h => {
                    todasMaterias.push({ id: h.id_materia, etiqueta: h.abreviatura || h.nombre_materia, nombre: h.nombre_materia });
                });
            });

            doc.setFont('helvetica', 'bold');
            doc.setFontSize(13);
            doc.text('RESUMEN DE NOTAS - ' + nombreCurso, pageWidth / 2, 34, { align: 'center' });
            doc.setFont('helvetica', 'normal');
            doc.setFontSize(10);
            const subtitulo = vistaActual === 'trimestral' ? ('Trimestre ' + trimestreActual) : 'Vista Anual';
            doc.text('Gestion: ' + anioGestionBoletin + ' - ' + subtitulo, pageWidth / 2, 52, { align: 'center' });

            let head;
            if (vistaActual === 'trimestral') {
                head = [['#', 'Estudiante']];
                todasMaterias.forEach(m => head[0].push(m.etiqueta));
                head[0].push('PROM. GRAL');
            } else {
                const filaMaterias = [
                    { content: '#', rowSpan: 2 },
                    { content: 'Estudiante', rowSpan: 2 }
                ];
                const filaTrimestres = [];
                todasMaterias.forEach(m => {
                    const nombreMateria = m.nombre || m.nombre_materia || m.etiqueta;
                    filaMaterias.push({ content: nombreMateria, colSpan: 3 });
                    filaTrimestres.push('T1', 'T2', 'T3');
                });
                filaMaterias.push({ content: 'PROM. GRAL', rowSpan: 2 });
                head = [filaMaterias, filaTrimestres];
            }
            const totalColumns = vistaActual === 'anual' ? (2 + (todasMaterias.length * 3) + 1) : head[0].length;
            const lastCol = totalColumns - 1;
            const noteCols = Math.max(lastCol - 2, 1);
            const availableWidth = pageWidth - (pageMargin * 2);
            const numberWidth = 20;
            const averageWidth = 48;
            const studentWidth = vistaActual === 'anual'
                ? Math.max(118, Math.min(170, availableWidth * 0.22))
                : Math.max(150, Math.min(190, availableWidth * 0.24));
            const fixedWidth = numberWidth + studentWidth + averageWidth;
            const noteCellWidth = vistaActual === 'anual'
                ? Math.max(10, (availableWidth - fixedWidth) / noteCols)
                : Math.max(24, (availableWidth - fixedWidth) / noteCols);
            const headerHeight = vistaActual === 'anual' ? 24 : 36;
            const headerBaseFontSize = vistaActual !== 'anual'
                ? 8
                : (noteCols >= 36 ? 4.8 : (noteCols >= 27 ? 5.2 : (noteCols >= 18 ? 5.8 : 6.2)));

            function fitRotatedHeaderText(text, maxWidth, baseFontSize) {
                let fontSize = baseFontSize;
                doc.setFont('helvetica', 'bold');
                doc.setFontSize(fontSize);

                while (fontSize > 4.5 && doc.getTextWidth(text) > maxWidth) {
                    fontSize -= 0.3;
                    doc.setFontSize(fontSize);
                }

                let fittedText = text;
                if (doc.getTextWidth(fittedText) > maxWidth) {
                    const ellipsis = '...';
                    while (fittedText.length > 1 && doc.getTextWidth(fittedText + ellipsis) > maxWidth) {
                        fittedText = fittedText.slice(0, -1);
                    }
                    fittedText = fittedText.length > 1 ? fittedText.trimEnd() + ellipsis : ellipsis;
                }

                return { text: fittedText, fontSize };
            }

            function obtenerTextoCeldaHeader(raw) {
                if (raw && typeof raw === 'object' && raw.content !== undefined) {
                    return String(raw.content);
                }
                return String(raw || '');
            }

            const columnStyles = {
                0: { cellWidth: numberWidth, halign: 'center' },
                1: { cellWidth: studentWidth, halign: 'left' },
                [lastCol]: { cellWidth: averageWidth, halign: 'center' }
            };

            for (let c = 2; c < lastCol; c++) {
                columnStyles[c] = { cellWidth: noteCellWidth, halign: 'center' };
            }

            const body = estudiantes.map((est, index) => {
                const fila = [
                    String(index + 1),
                    `${est.apellido_paterno || ''} ${est.apellido_materno || ''}, ${est.nombres || ''}`.replace(/\s+/g, ' ').trim()
                ];

                if (vistaActual === 'trimestral') {
                    todasMaterias.forEach(m => {
                        const nota = calificaciones?.[est.id_estudiante]?.[m.id]?.[trimestreActual] ?? '-';
                        fila.push(formatearNotaBoletinJs(nota));
                    });
                } else {
                    todasMaterias.forEach(m => {
                        for (let t = 1; t <= 3; t++) {
                            const nota = calificaciones?.[est.id_estudiante]?.[m.id]?.[t] ?? '-';
                            fila.push(formatearNotaBoletinJs(nota));
                        }
                    });
                }

                fila.push(String(promedios?.[est.id_estudiante] ?? '-'));
                return fila;
            });

            doc.autoTable({
                head,
                body,
                startY: 66,
                margin: { left: pageMargin, right: pageMargin },
                tableWidth: availableWidth,
                styles: { fontSize: 6.5, cellPadding: { top: 2.5, right: 2, bottom: 2.5, left: 2 }, lineWidth: 0.25, lineColor: [150, 150, 150], halign: 'center', valign: 'middle', overflow: 'linebreak' },
                headStyles: { fillColor: [47, 117, 181], textColor: [255, 255, 255], fontStyle: 'bold', halign: 'center', valign: 'middle', cellPadding: { top: 4, right: 2.5, bottom: 4, left: 2.5 } },
                columnStyles,
                didParseCell: function(data) {
                    if (data.section === 'head' && vistaActual === 'anual') {
                        const textoHeader = obtenerTextoCeldaHeader(data.cell.raw);
                        const fittedHeader = fitRotatedHeaderText(textoHeader, Math.max(18, data.cell.width - 4), headerBaseFontSize);
                        data.cell.text = [fittedHeader.text];
                        data.cell.styles.fontSize = fittedHeader.fontSize;
                        data.cell.styles.minCellHeight = data.row.index === 0 ? headerHeight : 18;
                        data.cell.styles.cellPadding = { top: 6, right: 2, bottom: 6, left: 2 };
                        data.cell.styles.halign = 'center';
                        data.cell.styles.valign = 'middle';
                        data.cell.styles.overflow = 'hidden';
                    } else if (data.section === 'head') {
                        data.cell.styles.halign = 'center';
                        data.cell.styles.valign = 'middle';
                        data.cell.styles.cellPadding = { top: 4, right: 2, bottom: 4, left: 2 };
                    }

                    if (data.section !== 'body') return;
                    if (data.column.index > 1 && data.column.index < lastCol) {
                        const v = parseFloat(String(data.cell.raw).replace(',', '.'));
                        if (!Number.isNaN(v)) {
                            if (v < 50) {
                                data.cell.styles.fillColor = [254, 226, 226];
                                data.cell.styles.textColor = [185, 28, 28];
                            } else if (v === 50) {
                                data.cell.styles.fillColor = [219, 234, 254];
                                data.cell.styles.textColor = [29, 78, 216];
                            } else {
                                data.cell.styles.fillColor = [220, 252, 231];
                                data.cell.styles.textColor = [22, 101, 52];
                            }
                        }
                    }
                },
                didDrawCell: function(data) {
                },
            });

            doc.save(`Resumen_Oficio_${nombreCurso.replace(/\s+/g, '_')}.pdf`);
        }

        function generarBoletinesPDF(options = {}) {
            const estudiantes = <?= json_encode($estudiantes) ?>;
            const materiasIndividuales = <?= json_encode($materias_individuales) ?>;
            const materiasPadreObj = <?= json_encode($materias_padre) ?>;
            const materiasPadre = Object.keys(materiasPadreObj).map(key => materiasPadreObj[key]);
            const calificaciones = <?= json_encode($calificaciones) ?>;
            const nombreCurso = <?= json_encode(htmlspecialchars_decode($nombre_curso)) ?>;
            const trimestre = <?= $vista == 'trimestral' ? $trimestre : 1 ?>;
            const anioGestionBoletin = <?= json_encode($anioBoletinPdf) ?>;

            const {
                jsPDF
            } = window.jspdf;
            const doc = new jsPDF();

            // 🔵 Pega aquí tu imagen Base64
            const LOGO_BASE64 = "data:image/png;base64, ";

            if (!Array.isArray(estudiantes) || estudiantes.length === 0) {
                alert('No hay estudiantes para generar boletines');
                return;
            }

            estudiantes.forEach((estudiante, index) => {
                if (index > 0) doc.addPage();

                doc.setTextColor(0, 0, 0); // Negro puro

                // 🔵 Insertar logo en la parte superior derecha
                doc.addImage(LOGO_BASE64, 'PNG', 170, 10, 18, 18);

                // TÍTULO
                doc.setFontSize(16);
                doc.setFont('helvetica', 'bolditalic');
                doc.text("U.E SIMON BOLIVAR", 105, 15, {
                    align: 'center'
                });

                // ENCABEZADO
                doc.setFontSize(12);
                doc.setFont('helvetica', 'bold');
                doc.text("ESTUDIANTE :", 20, 27);
                doc.setFont('helvetica', 'normal');
                doc.text(`${estudiante.apellido_paterno} ${estudiante.apellido_materno} ${estudiante.nombres}`, 60, 27);

                doc.setFont('helvetica', 'bold');
                doc.text("CURSO :", 20, 33);
                doc.setFont('helvetica', 'normal');
                doc.text(`${nombreCurso}`, 60, 33);

                doc.setFont('helvetica', 'bold');
                doc.text("GESTIÓN :", 150, 33);
                doc.setFont('helvetica', 'normal');
                doc.text(String(anioGestionBoletin), 180, 33);

                doc.line(20, 37, 190, 37); // Línea separadora

                // MATERIAS
                let todasMaterias = [];

                if (Array.isArray(materiasIndividuales)) {
                    materiasIndividuales.forEach(m => {
                        todasMaterias.push({
                            id: m.id_materia,
                            nombre: m.nombre_materia
                        });
                    });
                }

                if (Array.isArray(materiasPadre)) {
                    materiasPadre.forEach(p => {
                        if (p.hijas && Array.isArray(p.hijas)) {
                            p.hijas.forEach(h => {
                                todasMaterias.push({
                                    id: h.id_materia,
                                    nombre: h.nombre_materia
                                });
                            });
                        }
                    });
                }

                // ORDEN PERSONALIZADO
                const ordenDeseado = [
                    "LENGUAJE",
                    "INGLES",
                    "CIENCIAS SOCIALES",
                    "EDUCACION FISICA Y DEPORTES",
                    "EDUCACION MUSICA",
                    "ARTES PLASTICAS",
                    "MATEMATICAS",
                    "TECNICA TECNOLOGIA",
                    "CIENCIAS NATURALES",
                    "VALORES ESPIRITUALIDAD Y RELIGIONES"
                ];

                const normalizar = str => str.toUpperCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/\s+/g, " ").trim();

                todasMaterias.sort((a, b) => {
                    const idxA = ordenDeseado.findIndex(nombre => normalizar(nombre) === normalizar(a.nombre));
                    const idxB = ordenDeseado.findIndex(nombre => normalizar(nombre) === normalizar(b.nombre));
                    return (idxA === -1 ? 999 : idxA) - (idxB === -1 ? 999 : idxB);
                });

                // CABECERA
                const headers = [
                    [{
                            content: 'ASIGNATURA',
                            styles: {
                                halign: 'left'
                            }
                        },
                        '1TRI', '2TRI', '3TRI', 'P.ANUAL'
                    ]
                ];

                const rows = [];

                todasMaterias.forEach(materia => {
                    let nota1 = '-',
                        nota2 = '-',
                        nota3 = '-',
                        promedio = '-';

                    try {
                        const notas = calificaciones?.[estudiante.id_estudiante]?.[materia.id] || {};
                        const nota1Raw = notas[1] ?? '-';
                        const nota2Raw = notas[2] ?? '-';
                        const nota3Raw = notas[3] ?? '-';
                        nota1 = formatearNotaBoletinJs(nota1Raw);
                        nota2 = formatearNotaBoletinJs(nota2Raw);
                        nota3 = formatearNotaBoletinJs(nota3Raw);

                        const validas = [nota1Raw, nota2Raw, nota3Raw].map(n => parseFloat(n)).filter(n => !isNaN(n));
                        if (validas.length > 0) {
                            promedio = String(Math.round(validas.reduce((a, b) => a + b, 0) / validas.length));
                        }
                    } catch (e) {
                        console.error(e);
                    }

                    rows.push([{
                            content: materia.nombre,
                            styles: {
                                halign: 'left'
                            }
                        },
                        nota1, nota2, nota3, promedio
                    ]);
                });

                if (rows.length === 0) {
                    rows.push(['No hay materias', '-', '-', '-', '-']);
                }

                // TABLA
                doc.autoTable({
                    head: headers,
                    body: rows,
                    startY: 40,
                    theme: 'grid',
                    headStyles: {
                        fillColor: [255, 255, 255],
                        textColor: [0, 0, 0],
                        fontStyle: 'bold',
                        halign: 'center'
                    },
                    bodyStyles: {
                        fontSize: 10,
                        textColor: [0, 0, 0],
                        halign: 'center'
                    },
                    columnStyles: {
                        0: {
                            cellWidth: 80,
                            halign: 'left'
                        },
                        1: {
                            cellWidth: 20,
                            halign: 'center'
                        },
                        2: {
                            cellWidth: 20,
                            halign: 'center'
                        },
                        3: {
                            cellWidth: 20,
                            halign: 'center'
                        },
                        4: {
                            cellWidth: 25,
                            halign: 'center'
                        }
                    },
                    tableWidth: 'auto',
                    margin: {
                        left: 20,
                        right: 20
                    }
                });

                // FIRMAS
                const yFinal = doc.lastAutoTable.finalY + 20;
                doc.setFont('helvetica', 'bold');
                doc.setTextColor(0, 0, 0);
                doc.text("FIRMA MAESTRO", 45, yFinal, {
                    align: 'center'
                });
                doc.text("DIRECCIÓN", 150, yFinal, {
                    align: 'center'
                });
            });

            const nombreArchivo = `Boletines_${nombreCurso.replace(/\s+/g, '_')}.pdf`;
            if (options && options.download === false) {
                return doc.output('blob');
            }
            doc.save(nombreArchivo);
            return null;
        }
    </script>


</body>

</html>
