<?php
/**
 * evaluacionVisual.php
 * ---------------------
 * Página principal de evaluación visual-auditiva por paciente.
 *
 * GENEERAL:
 *   1. Verifica sesion activa con nivel de acceso valido
 *   2. Obtiene datos del paciente (nombre, fecha de nacimiento,
 *      semanas de gestación, fecha de edad corregida).
 *   3. Verifica si el paciente tiene evaluaciones previas:
 *      - Sin evaluaciones → redirige a iniciarEvaluacion.php
 *      - Con evaluaciones → muestra el formulario del mes siguiente
 *   4. Procesa el envío del formulario (btnEnviar) o marca de falta (btnFalta).
 *
 * CALCULO DE EDAD CORREGIDA:
 *   fecha_edad_corregida = fecha_nacimiento + (39 - semanas_gestacion) semanas
 *   - Si nació en semana 32 → se suman +7 semanas
 *   - Si nació en semana 39 → se suman 0 semanas (término)
 *   DATE_ADD acepta intervalos negativos de forma natural, por lo que
 *   NO se necesita ningún IF ni tope en la fórmula SQL.
 *
 * FUENTE DE VERDAD: La BD calcula fecha_edad_corregida.
 *   PHP solo la lee, formatea y usa para calcular días/meses/texto.
 *   NO se recalcula en PHP para evitar inconsistencias.
 *
 * PERCENTILES:
 *   Se calculan en PHP (al guardar) y también en JS (en tiempo real en el form).
 *   La lógica es idéntica en ambos lados: índice del array = puntaje total.
 *
 * REGLA DE TRES CEROS:
 *   Si en la evaluación visual o auditiva se acumulan 3 respuestas "0"
 *   consecutivas, los incisos siguientes se anulan (pasan a NULL).
 *   Se aplica tanto en PHP (al guardar) como en JS (en la UI).
 *
 * DEPENDENCIAS:
 *   - conex2.php       → función conectar() que retorna un objeto mysqli
 *   - includes/header.php → cabecera HTML compartida
 *   - jquery-3.3.1.min.js → jQuery para eventos de la UI
 *   - styles/evaluacionVisual.css
 *   - styles/header.css
 *
 * AUTOR ORIGINAL: Equipo INB / Visual-Auditiva
 * ÚLTIMA MODIFICACIÓN: 2026 — corrección de fórmula de edad corregida
 */

session_start();
date_default_timezone_set('America/Mexico_City');

// Guarda la URL actual en sesión para poder redirigir de vuelta tras un POST
$_SESSION['url'] = $_SESSION['url'] ?? $_SERVER['REQUEST_URI'];
$url = $_SESSION['url'];

// ─────────────────────────────────────────────────────────────────────────────
// CONTROL DE ACCESO
// Solo usuarios con sesión activa y nivel 2 (o superior) pueden entrar.
// ─────────────────────────────────────────────────────────────────────────────
if (isset($_SESSION['id']) && isset($_SESSION['level']) && (($_SESSION['level']) == 2 || ($_SESSION['level']))) {

    require_once('conex2.php');

    if (!function_exists('conectar')) {
        die('Error: no existe la función conectar() en conex2.php');
    }

    $GLOBALS['___conexion_visualauditiva'] = conectar();

    if (!$GLOBALS['___conexion_visualauditiva']) {
        die('Error de conexión a la base de datos');
    }

    if ($GLOBALS['___conexion_visualauditiva'] instanceof mysqli) {
        $GLOBALS['___conexion_visualauditiva']->set_charset('utf8');
    }

    // ─────────────────────────────────────────────────────────────────────────
    // FUNCIONES DE COMPATIBILIDAD
    // Se definen solo si no existen, para no romper si se carga este archivo
    // más de una vez o si el entorno ya tiene estas funciones.
    // ─────────────────────────────────────────────────────────────────────────

    if (!function_exists('resultados_mysql')) {
        /**
         * Ejecuta una consulta SQL y retorna el resultado.
         * Wrapper de mysqli_query usando la conexión global.
         */
        function resultados_mysql($consulta) {
            $conexion = $GLOBALS['___conexion_visualauditiva'] ?? null;
            if (!$conexion) return false;
            return mysqli_query($conexion, $consulta);
        }
    }

    if (!function_exists('mysql_fetch_assoc')) {
        /** Wrapper de mysqli_fetch_assoc para compatibilidad con código legado. */
        function mysql_fetch_assoc($resultado) {
            return $resultado ? mysqli_fetch_assoc($resultado) : false;
        }
    }

    if (!function_exists('mysql_num_rows')) {
        /** Wrapper de mysqli_num_rows para compatibilidad con código legado. */
        function mysql_num_rows($resultado) {
            return $resultado ? mysqli_num_rows($resultado) : 0;
        }
    }

    if (!function_exists('mysql_real_escape_string')) {
        /** Wrapper de mysqli_real_escape_string para compatibilidad con código legado. */
        function mysql_real_escape_string($cadena) {
            $conexion = $GLOBALS['___conexion_visualauditiva'] ?? null;
            if (!$conexion) return addslashes($cadena);
            return mysqli_real_escape_string($conexion, $cadena);
        }
    }

    // ─────────────────────────────────────────────────────────────────────────
    // MAPA DE PERCENTILES
    //
    // Estructura: $PERCENTILES_MAPA[mes][tipo][puntaje_total] = percentil
    //
    // - mes:    1 al 8 (mes de estudio del paciente)
    // - tipo:   'visual', 'auditivo', 'estudio(TOTAL)'
    // - índice: el puntaje total obtenido en esa área
    // - valor:  percentil correspondiente (1–96)
    //
    // Para consultar: $PERCENTILES_MAPA[3]['visual'][18] → percentil del puntaje 18
    //                                                       en visual del mes 3
    // ─────────────────────────────────────────────────────────────────────────
    $PERCENTILES_MAPA = [
        1 => [
            'visual' => [
                1,1,1,1,1,1,1,1,25,34,40,45,50,55,60,63,67,70,73,75,
                79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,
                79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,
                79,79,79,79,79,79,79,79,79
            ],
            'auditivo' => [
                1,1,1,1,1,61,63,64,66,67,68,70,71,73,74,75,77,79,79,
                79,79,79,79,79,79,79,79,79,79
            ],
            'estudio' => [
                1,1,1,1,1,1,1,1,1,1,1,23,25,33,40,42,44,46,48,50,52,
                54,56,58,60,62,65,67,70,73,75,77,79,79,79,79,79,79,79,
                79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,
                79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,
                79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79
            ]
        ],
        2 => [
            'visual' => [
                1,1,1,1,1,1,1,1,1,20,25,30,35,40,47,50,55,61,62,64,65,
                70,77,80,85,90,91,93,94,94,94,94,94,94,94,94,94,94,94,
                94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,
                94,94,94,94,94,94,94
            ],
            'auditivo' => [
                1,1,6,8,10,22,25,35,50,55,65,75,80,87,90,91,92,94,94,
                94,94,94,94,94,94,94,94,94,94
            ],
            'estudio' => [
                1,1,1,1,1,1,1,1,1,1,1,1,1,10,12,15,20,30,37,40,42,45,
                46,48,50,55,60,62,65,67,69,70,77,80,85,87,88,90,90,91,
                92,92,93,93,94,94,94,94,94,94,94,94,94,94,94,94,94,94,
                94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,
                94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94
            ]
        ],
        3 => [
            'visual' => [
                1,1,1,1,1,1,1,1,1,5,6,7,8,9,9,10,13,16,20,21,24,30,40,
                44,50,54,57,64,70,77,85,86,88,90,93,94,94,95,95,96,96,
                96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,
                96,96,96,96,96
            ],
            'auditivo' => [
                1,1,1,8,10,15,16,17,18,19,20,27,34,50,54,64,70,73,77,
                83,87,94,96,96,96,96,96,96,96
            ],
            'estudio' => [
                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,10,11,12,
                13,14,15,17,20,23,27,36,40,44,48,50,52,54,60,63,66,68,
                70,77,84,85,86,87,88,88,88,89,91,90,93,94,94,95,95,96,
                96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,
                96,96,96,96,96,96,96,96,96,96,96,96,96,96
            ]
        ],
        4 => [
            'visual' => [
                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,10,11,12,16,18,
                20,22,23,25,26,29,32,35,39,42,44,47,50,54,56,59,64,66,
                68,70,74,82,85,88,90,92,94,95,96,96,96,96,96,96,96,96,
                96,96,96,96,96
            ],
            'auditivo' => [
                1,1,1,1,1,3,4,5,6,8,10,12,16,17,18,20,23,29,33,38,42,
                50,53,62,71,84,86,91,95
            ],
            'estudio' => [
                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
                1,1,4,6,7,8,9,12,14,16,17,18,20,21,22,22,23,24,25,26,
                27,28,29,30,31,35,39,45,48,50,51,52,54,55,57,58,59,70,
                71,72,73,74,77,78,79,83,88,92,94,95,96,96,96,96,96,96,
                96,96,96,96,96,96,96,96,96,96,96
            ]
        ],
        5 => [
            'visual' => [
                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,4,4,5,6,9,11,16,
                17,17,18,19,20,21,22,26,31,33,34,35,36,38,42,50,54,56,
                58,59,60,61,64,66,67,68,69,72,77,83,89,91,92,93,94,95,
                96,96,96
            ],
            'auditivo' => [
                1,1,1,1,1,3,4,4,5,5,6,7,7,8,11,13,18,21,26,30,32,33,36,
                39,50,54,62,85,88
            ],
            'estudio' => [
                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,4,4,
                4,4,4,4,5,5,5,5,5,5,6,10,11,11,11,11,12,13,14,18,19,21,
                25,26,27,29,32,32,33,34,35,36,38,41,42,44,45,46,49,50,
                57,58,59,60,61,63,64,65,65,66,67,68,70,77,85,88,90,92,
                93,93,94,94,95,95,95,95
            ]
        ],
        6 => [
            'visual' => [
                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,4,4,5,6,6,7,7,7,
                8,8,9,10,13,14,14,15,16,17,19,20,20,21,22,25,26,27,28,
                35,36,37,39,40,41,43,46,50,53,64,66,68,70,71,72,77,87,94
            ],
            'auditivo' => [
                1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,4,5,7,8,9,14,15,18,29,
                33,50,64,76
            ],
            'estudio' => [
                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
                1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,4,6,8,9,10,12,13,13,13,
                14,14,14,15,15,16,17,18,19,20,21,22,23,24,24,25,26,28,
                29,30,36,37,38,39,40,44,47,50,53,57,61,66,69,70,71,72,
                77,80,83,90,94
            ]
        ],
        7 => [
            'visual' => [
                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
                1,5,6,6,7,8,8,9,9,9,9,10,10,11,11,11,12,12,13,15,17,22,
                23,23,24,25,29,33,37,39,40,42,48,50,59,67,76,82
            ],
            'auditivo' => [
                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8,10,11,13,
                21,34,46,50
            ],
            'estudio' => [
                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,5,6,6,7,8,
                8,8,8,9,9,9,9,10,10,10,10,11,11,11,11,11,12,12,13,21,22,
                23,24,25,26,28,30,32,34,38,42,48,50,59,63,67,71,80,85
            ]
        ],
        8 => [
            'visual' => [
                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
                1,1,1,1,1,1,1,1,1,11,13,14,15,16,18,19,20,21,21,22,22,
                23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,50,89
            ],
            'auditivo' => [
                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,15,20,21,24,26,
                28,30,55,60
            ],
            'estudio' => [
                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
                1,1,1,11,13,15,17,19,20,20,21,21,21,22,22,22,23,23,24,
                24,24,24,25,25,26,26,26,27,28,28,28,28,29,29,29,30,50,
                75,90
            ]
        ]
    ];

    // ─────────────────────────────────────────────────────────────────────────
    // FUNCIONES DE SOPORTE
    // ─────────────────────────────────────────────────────────────────────────

    /**
     * Valida que el mes de estudio esté en el rango permitido (1–8).
     * Retorna 0 si está fuera del rango.
     */
    function normalizar_mes_percentil($mes) {
        $mes = (int)$mes;
        return ($mes >= 1 && $mes <= 8) ? $mes : 0;
    }

    /**
     * Convierte el valor de un radio button en entero para sumarlo.
     * NULL, vacío o la cadena "NULL" se tratan como 0.
     */
    function valor_radio_numero($valor) {
        if ($valor === null || $valor === '' || strtoupper((string)$valor) === 'NULL') {
            return 0;
        }
        return (int)$valor;
    }

    /**
     * Convierte el valor de un radio button a texto SQL seguro.
     * NULL, vacío o la cadena "NULL" se convierten en el literal SQL NULL.
     */
    function valor_radio_sql($valor) {
        if ($valor === null || $valor === '' || strtoupper((string)$valor) === 'NULL') {
            return 'NULL';
        }
        return (string)((int)$valor);
    }

    /**
     * Aplica la regla de los tres ceros sobre el array $_POST.
     *
     * Si hay 3 respuestas "0" consecutivas, todos los incisos siguientes
     * se fuerzan a NULL (no se contabilizan).
     *
     * @param array  &$post        Referencia a $_POST
     * @param int    $totalIncisos Número total de incisos del área (32 visual, 14 auditivo)
     * @param string $sufijo       Sufijo del nombre del campo ('' visual, 'a' auditivo)
     */
    function aplicar_regla_tres_ceros_post(&$post, $totalIncisos, $sufijo = '') {
        $ceros    = 0;
        $seCorto  = false;

        for ($n = 1; $n <= $totalIncisos; $n++) {
            $campo = 'evaluacion' . $n . $sufijo;
            $valor = isset($post[$campo]) ? (string)$post[$campo] : 'NULL';

            if ($seCorto) {
                // A partir del corte, todo se anula
                $post[$campo] = 'NULL';
                continue;
            }

            if ($valor === '0') {
                $ceros++;
                if ($ceros >= 3) {
                    $seCorto = true;
                }
            }
        }
    }

    /**
     * Suma todos los incisos visuales (evaluacion1..32) desde $_POST.
     * Los valores NULL se cuentan como 0.
     */
    function sumar_visual_desde_post() {
        $total = 0;
        for ($n = 1; $n <= 32; $n++) {
            $total += valor_radio_numero($_POST['evaluacion' . $n] ?? 'NULL');
        }
        return $total;
    }

    /**
     * Suma todos los incisos auditivos (evaluacion1a..14a) desde $_POST.
     * Los valores NULL se cuentan como 0.
     */
    function sumar_auditivo_desde_post() {
        $total = 0;
        for ($n = 1; $n <= 14; $n++) {
            $total += valor_radio_numero($_POST['evaluacion' . $n . 'a'] ?? 'NULL');
        }
        return $total;
    }

    /**
     * Obtiene el percentil correspondiente al puntaje total en un mes y tipo dados.
     *
     * @param array  $mapa  El mapa completo de percentiles
     * @param int    $mes   Mes de estudio (1–8)
     * @param string $tipo  'visual', 'auditivo' o 'estudio'
     * @param int    $total Puntaje total obtenido
     * @return int|string   Percentil (1–96) o '' si no aplica
     */
    function obtener_percentil_mapa($mapa, $mes, $tipo, $total) {
        $mes = normalizar_mes_percentil($mes);
        if ($mes === 0) return '';

        if (!isset($mapa[$mes][$tipo]) || !is_array($mapa[$mes][$tipo])) return '';

        $total       = max(0, (int)$total);
        $lista       = $mapa[$mes][$tipo];
        $ultimoIndice = count($lista) - 1;

        if ($ultimoIndice < 0) return '';

        // Si el puntaje supera el último índice, se usa el último valor disponible
        $total = min($total, $ultimoIndice);

        return isset($lista[$total]) ? (int)$lista[$total] : '';
    }

    /**
     * Clasifica un percentil en: 'deficiente', 'normal' o 'acelerado'.
     * Retorna '' si el percentil es inválido o no existe.
     *
     * Rangos:
     *   1–24  → deficiente
     *  25–75  → normal
     *  76–96  → acelerado
     */
    function obtener_clasificacion_percentil($percentil) {
        if ($percentil === '' || $percentil === null) return '';
        $percentil = (int)$percentil;
        if ($percentil >= 1  && $percentil <= 24) return 'deficiente';
        if ($percentil >= 25 && $percentil <= 75) return 'normal';
        if ($percentil >= 76 && $percentil <= 96) return 'acelerado';
        return '';
    }

    // Serializar el mapa de percentiles para usarlo en el JS del cliente
    $PERCENTILES_JSON = json_encode($PERCENTILES_MAPA, JSON_UNESCAPED_UNICODE);

    // ─────────────────────────────────────────────────────────────────────────
    // OBTENER CLAVE DEL PACIENTE
    // Puede venir de dos campos POST distintos según el flujo que se use.
    // ─────────────────────────────────────────────────────────────────────────
    $miClavePaciente = $_POST['clavePaciente'] ?? ($_POST['claveEnviarPaciente'] ?? '');
    if ($miClavePaciente === '') {
        header('Location: index.php');
        exit;
    }
    $miClavePaciente = mysql_real_escape_string($miClavePaciente);

    // ─────────────────────────────────────────────────────────────────────────
    // CONSULTA DE DATOS DEL PACIENTE
    //
    // FÓRMULA DE EDAD CORREGIDA:
    //   DATE_ADD(fecha_nacimiento, INTERVAL (39 - semanas_gestacion) WEEK)
    //
    // - 39 semanas = término de referencia del sistema
    // - Si semanas_gestacion < 39 → intervalo positivo (se suma tiempo)
    // - Si semanas_gestacion = 39 → intervalo 0 (fecha sin cambio)
    // - Si semanas_gestacion > 39 → intervalo negativo (se resta tiempo)
    //
    // DATE_ADD acepta INTERVAL negativo, por eso NO se necesita IF ni tope.
    // ─────────────────────────────────────────────────────────────────────────
    $recuperarNombre = "SELECT clave_paciente,
                        CONCAT(apellido_paterno_paciente, ' ',
                               apellido_materno_paciente, ' ',
                               nombre_paciente) AS nombre,
                        fecha_nacimiento_paciente,
                        semanas_gestacion,
                        DATE_ADD(
                            fecha_nacimiento_paciente,
                            INTERVAL (39 - semanas_gestacion) WEEK
                        ) AS fecha_edad_corregida
                        FROM paciente
                        WHERE clave_paciente = '{$miClavePaciente}'";

    $hola     = resultados_mysql($recuperarNombre);
    $misDatos = mysql_fetch_assoc($hola);

    if (!$misDatos) {
        die('Paciente no encontrado');
    }

    // Fecha de nacimiento (para referencia interna, no se muestra directamente)
    $miFechaNacimiento = !empty($misDatos['fecha_nacimiento_paciente'])
        ? new DateTime($misDatos['fecha_nacimiento_paciente'])
        : new DateTime('now');

    $actual     = new DateTime('now');
    $difference = date_diff($miFechaNacimiento, $actual); // Diferencia cronológica, no usada en UI pero disponible

    // Semanas de gestación para mostrar en la tarjeta del paciente
    $misSemanas = (int)$misDatos['semanas_gestacion'];

    // ─────────────────────────────────────────────────────────────────────────
    // CÁLCULO DE EDAD CORREGIDA (FUENTE ÚNICA: la BD)
    //
    // Se usa fecha_edad_corregida calculada por MySQL.
    // PHP no recalcula para evitar inconsistencias con la fórmula SQL.
    // ─────────────────────────────────────────────────────────────────────────
    $fechaEdadCorregida = !empty($misDatos['fecha_edad_corregida'])
        ? new DateTime($misDatos['fecha_edad_corregida'])
        : new DateTime('now');

    $actual              = new DateTime('now');
    $differenceCorregida = date_diff($fechaEdadCorregida, $actual);

    $misDias         = $differenceCorregida->days;                        // Días desde edad corregida hasta hoy
    $misMeses        = round($differenceCorregida->days / 30);            // Meses aproximados
    $edadCorregidaTexto = $fechaEdadCorregida->format('d/m/Y');           // Texto para mostrar en UI

    // ─────────────────────────────────────────────────────────────────────────
    // EVALUACIONES PREVIAS DEL PACIENTE
    // Determina el mes que toca evaluar ($i) basado en las evaluaciones existentes.
    // ─────────────────────────────────────────────────────────────────────────
    $verMeses = "SELECT mes_estudio
                 FROM visualauditiva
                 WHERE clave_paciente = '{$miClavePaciente}'";

    $recuperarMeses = resultados_mysql($verMeses);
    $numRows        = mysql_num_rows($recuperarMeses);

    // ─────────────────────────────────────────────────────────────────────────
    // LÓGICA DE FLUJO SEGÚN ESTADO DEL PACIENTE
    // ─────────────────────────────────────────────────────────────────────────

    if (($numRows <= 0) && (!isset($_POST['btnIniciaEvaluacion'])) && (!isset($_POST['btnFalta'])) && (!isset($_POST['btnEnviar']))) {
        // El paciente no tiene evaluaciones y no viene de iniciarEvaluacion.php
        // → redirigir para inicializar el primer mes
        header('Location: iniciarEvaluacion.php?p=' . $miClavePaciente);
        exit;

    } elseif (($numRows <= 0) && (isset($_POST['btnIniciaEvaluacion'])) && (!isset($_POST['btnFalta'])) && (!isset($_POST['btnEnviar']))) {
        // El paciente acaba de ser inicializado desde iniciarEvaluacion.php
        // Se registra el área de procedencia si no existe
        $i = $_POST['mesIniciar'];

        $miClavePaciente   = mysql_real_escape_string($_POST['clavePaciente'] ?? $miClavePaciente);
        $miAreaProcedencia = mysql_real_escape_string($_POST['areaProcedencia'] ?? '');

        $verificarTabla = "SELECT * FROM visualauditivaprocedencia WHERE clave_paciente = '{$miClavePaciente}'";
        $num            = resultados_mysql($verificarTabla);
        $filas          = mysql_num_rows($num);

        if ($filas <= 0) {
            $insertaEnProcedencia = "INSERT INTO visualauditivaprocedencia VALUES (NULL, '{$miClavePaciente}', '{$miAreaProcedencia}')";
            resultados_mysql($insertaEnProcedencia);
        }

    } else {
        // El paciente ya tiene evaluaciones → el siguiente mes a evaluar
        // es el último mes registrado + 1
        $meses_ocupados = [];
        while ($meses = mysql_fetch_assoc($recuperarMeses)) {
            $meses_ocupados[] = $meses['mes_estudio'];
        }
        $i = end($meses_ocupados) + 1;
    }

    // ─────────────────────────────────────────────────────────────────────────
    // CONSULTAS ADICIONALES DEL PACIENTE
    // ─────────────────────────────────────────────────────────────────────────
    $consultaArea      = "SELECT area_procedencia FROM visualauditivaprocedencia WHERE clave_paciente = '{$miClavePaciente}'";
    $consultaRiesgo    = "SELECT Factor_de_riesgo FROM visualauditivafactoresriesgo WHERE clave_paciente = '{$miClavePaciente}'";
    $consultaPotenciales = "SELECT p.peaeeintfin, p.peveb_intfin FROM potenciales p WHERE clave_paciente = '{$miClavePaciente}'";

    $area               = mysql_fetch_assoc(resultados_mysql($consultaArea));
    $recuperarFactores  = resultados_mysql($consultaRiesgo);
    $numRiesgos         = mysql_num_rows($recuperarFactores);
    $recueraPotenciales = resultados_mysql($consultaPotenciales);

    // Separar potenciales visuales y auditivos
    $potencialesVisuales  = [];
    $potencialesAuditivos = [];

    if ($recueraPotenciales) {
        while ($p = mysql_fetch_assoc($recueraPotenciales)) {
            if (!empty($p['peveb_intfin']) && strlen(trim($p['peveb_intfin'])) > 2) {
                $potencialesVisuales[] = $p['peveb_intfin'];
            }
            if (!empty($p['peaeeintfin']) && strlen(trim($p['peaeeintfin'])) > 2) {
                $potencialesAuditivos[] = $p['peaeeintfin'];
            }
        }
    }

    if (empty($potencialesVisuales))  $potencialesVisuales[]  = 'Sin registro.';
    if (empty($potencialesAuditivos)) $potencialesAuditivos[] = 'Sin registro.';

    // Factores de riesgo
    if ($numRiesgos > 0) {
        $misRiesgos = [];
        while ($arrayRiesgos = mysql_fetch_assoc($recuperarFactores)) {
            $misRiesgos[] = $arrayRiesgos['Factor_de_riesgo'];
        }
    } else {
        $misRiesgos = ['Paciente sin factores de riesgo'];
    }

    // ─────────────────────────────────────────────────────────────────────────
    // PROCESO: MARCAR FALTA
    // Se inserta un registro con observaciones = 'FALTA' y sin datos de evaluación.
    // ─────────────────────────────────────────────────────────────────────────
    if (isset($_POST['btnFalta'])) {
        $mi2ClavePaciente = mysql_real_escape_string($_POST['claveEnviarPaciente'] ?? '');
        $mes    = $_POST['mesAEvaluar'] ?? 0;
        $dias   = $_POST['misDias']     ?? 0;
        $semanas = $_POST['misSemanas'] ?? 0;
        $meses  = $_POST['misMeses']    ?? 0;

        $insertarF = "INSERT INTO visualauditiva
                        (clave_paciente, mes_estudio, clave_encargada, observaciones,
                         edad_paciente_dias, edad_paciente_semanas, edad_paciente_meses)
                      VALUES
                        ('{$mi2ClavePaciente}', {$mes}, {$_SESSION['id']}, 'FALTA',
                         {$dias}, {$semanas}, {$meses})";

        resultados_mysql($insertarF);
        header("Location:" . $url);
        exit;
    }

    // ─────────────────────────────────────────────────────────────────────────
    // PROCESO: ENVIAR EVALUACIÓN COMPLETA
    // ─────────────────────────────────────────────────────────────────────────
    if (isset($_POST['btnEnviar'])) {

        // Aplica regla de los tres ceros antes de procesar los valores
        aplicar_regla_tres_ceros_post($_POST, 32, '');
        aplicar_regla_tres_ceros_post($_POST, 14, 'a');

        $mi2ClavePaciente = mysql_real_escape_string($_POST['claveEnviarPaciente'] ?? '');
        $mes    = normalizar_mes_percentil($_POST['mesAEvaluar'] ?? 0);
        $ob     = !empty($_POST['observaciones'])
                    ? "'" . mysql_real_escape_string($_POST['observaciones']) . "'"
                    : 'NULL';
        $dias   = (int)($_POST['misDias']    ?? 0);
        $semanas = (int)($_POST['misSemanas'] ?? 0);
        $meses  = (int)($_POST['misMeses']   ?? 0);

        // ── Manejo de fecha y hora del estudio ─────────────────────────────
        // El usuario puede elegir la fecha (no mayor a hoy).
        // Se combina con la hora actual del servidor para guardar fecha+hora completa.
        $fechaRaw = trim($_POST['fechaEstudio'] ?? '');

        if ($fechaRaw === '') {
            // Fallback: usa fecha y hora actuales del servidor
            $fechaEstudioSQL = "'" . date('Y-m-d H:i:s') . "'";
        } else {
            $fechaObj = DateTime::createFromFormat('Y-m-d', $fechaRaw);
            if ($fechaObj && $fechaObj->format('Y-m-d') === $fechaRaw) {
                $horaActual       = date('H:i:s');
                $fechaHoraCompleta = $fechaRaw . ' ' . $horaActual;
                $fechaEstudioSQL  = "'" . mysqli_real_escape_string(
                    $GLOBALS['___conexion_visualauditiva'],
                    $fechaHoraCompleta
                ) . "'";
            } else {
                die('Error: formato de fecha inválido.');
            }
        }
        // ───────────────────────────────────────────────────────────────────

        // Incisos visuales (1–32)
        $e = [];
        for ($n = 1; $n <= 32; $n++) {
            $e[$n] = valor_radio_sql($_POST['evaluacion' . $n] ?? 'NULL');
        }

        // Calcular total y percentil visual
        $totalVisual = sumar_visual_desde_post();
        $percentilV  = obtener_percentil_mapa($PERCENTILES_MAPA, $mes, 'visual', $totalVisual);
        $resultadoV  = mysql_real_escape_string(obtener_clasificacion_percentil($percentilV));

        // Incisos auditivos (1a–14a)
        $ea = [];
        for ($n = 1; $n <= 14; $n++) {
            $ea[$n] = valor_radio_sql($_POST['evaluacion' . $n . 'a'] ?? 'NULL');
        }

        // Calcular total y percentil auditivo
        $totalAuditivo = sumar_auditivo_desde_post();
        $percentilA    = obtener_percentil_mapa($PERCENTILES_MAPA, $mes, 'auditivo', $totalAuditivo);
        $resultadoA    = mysql_real_escape_string(obtener_clasificacion_percentil($percentilA));

        // Total y percentil general del estudio
        $totalEstudio         = $totalVisual + $totalAuditivo;
        $percentilEstudio     = obtener_percentil_mapa($PERCENTILES_MAPA, $mes, 'estudio', $totalEstudio);
        $clasificacionEstudio = mysql_real_escape_string(obtener_clasificacion_percentil($percentilEstudio));

        if ($mes === 0) {
            die('Error: el mes de estudio para percentiles debe estar entre 1 y 8.');
        }

        $insertar = "INSERT INTO visualauditiva VALUES (
            null,
            '{$mi2ClavePaciente}',
            {$mes},
            {$fechaEstudioSQL},
            {$dias},
            {$semanas},
            {$meses},
            " . (int)$_SESSION['id'] . ",
            {$e[1]},  {$e[2]},  {$e[3]},  {$e[4]},  {$e[5]},  {$e[6]},  {$e[7]},  {$e[8]},
            {$e[9]},  {$e[10]}, {$e[11]}, {$e[12]}, {$e[13]}, {$e[14]}, {$e[15]}, {$e[16]},
            {$e[17]}, {$e[18]}, {$e[19]}, {$e[20]}, {$e[21]}, {$e[22]}, {$e[23]}, {$e[24]},
            {$e[25]}, {$e[26]}, {$e[27]}, {$e[28]}, {$e[29]}, {$e[30]}, {$e[31]}, {$e[32]},
            {$totalVisual}, {$percentilV}, '{$resultadoV}',
            {$ea[1]},  {$ea[2]},  {$ea[3]},  {$ea[4]},  {$ea[5]},  {$ea[6]},  {$ea[7]},
            {$ea[8]},  {$ea[9]},  {$ea[10]}, {$ea[11]}, {$ea[12]}, {$ea[13]}, {$ea[14]},
            {$totalAuditivo}, {$percentilA}, '{$resultadoA}',
            {$totalEstudio}, {$percentilEstudio}, '{$clasificacionEstudio}',
            {$ob}
        )";

        $positivo = resultados_mysql($insertar);

        if (!$positivo) {
            die('Error al guardar: ' . mysqli_error($GLOBALS['___conexion_visualauditiva']));
        }

        header("Location:" . $url);
        exit;
    }
?>
<!DOCTYPE html>
<html>
<head>
    <title>Evaluación visual</title>

    <script src="jquery-3.3.1.min.js"></script>
    <script>
    /*
     * =========================================================================
     * JAVASCRIPT — Evaluación Visual-Auditiva
     *
     * Responsabilidades:
     *   1. Calcular en tiempo real el total, percentil y clasificación
     *      mientras el usuario selecciona respuestas.
     *   2. Aplicar la regla de los tres ceros en la UI (deshabilitar incisos).
     *   3. Validar que se haya ingresado la fecha antes de enviar.
     *
     * MAPA DE PERCENTILES:
     *   Se inyecta desde PHP como JSON. La lógica de consulta es idéntica
     *   a la de PHP: lista[puntaje_total] = percentil.
     * =========================================================================
     */
    var PERCENTILES_MAPA = <?php echo $PERCENTILES_JSON; ?>;

    /** Convierte un valor a entero seguro; retorna 0 si es NaN. */
    function numeroSeguro(valor) {
        var n = parseInt(valor, 10);
        return isNaN(n) ? 0 : n;
    }

    /** Lee el mes de estudio actual desde el campo oculto del formulario. */
    function obtenerMesActual() {
        var campo = document.getElementById('mes_estudio_actual');
        return campo ? numeroSeguro(campo.value) : 0;
    }

    /**
     * Consulta el percentil correspondiente en el mapa.
     * Equivalente JS a obtener_percentil_mapa() de PHP.
     */
    function obtenerPercentilJS(mes, tipo, total) {
        if (!PERCENTILES_MAPA || !PERCENTILES_MAPA[mes] || !PERCENTILES_MAPA[mes][tipo]) return '';
        var lista = PERCENTILES_MAPA[mes][tipo];
        if (total < 0) total = 0;
        if (total >= lista.length) total = lista.length - 1;
        return (typeof lista[total] === 'undefined' || lista[total] === null) ? '' : lista[total];
    }

    /**
     * Clasifica un percentil en 'deficiente', 'normal' o 'acelerado'.
     * Equivalente JS a obtener_clasificacion_percentil() de PHP.
     */
    function clasificarPercentilJS(percentil) {
        var p = numeroSeguro(percentil);
        if (!p)              return '';
        if (p >= 1  && p <= 24) return 'deficiente';
        if (p >= 25 && p <= 75) return 'normal';
        if (p >= 76 && p <= 96) return 'acelerado';
        return '';
    }

    /** Suma los radio buttons marcados de una clase CSS determinada. */
    function sumarSeleccionadosPorClase(nombreClase) {
        var elementos = document.getElementsByClassName(nombreClase);
        var total = 0;
        for (var i = 0; i < elementos.length; i++) {
            if (elementos[i].checked) total += numeroSeguro(elementos[i].value);
        }
        return total;
    }

    /** Asigna un valor a un campo por su ID. */
    function asignarValor(idCampo, valor) {
        var campo = document.getElementById(idCampo);
        if (campo) campo.value = valor;
    }

    function obtenerRadiosPorNombre(nombre) {
        return document.querySelectorAll('input[name="' + nombre + '"]');
    }

    function obtenerSeleccionadoPorNombre(nombre) {
        return document.querySelector('input[name="' + nombre + '"]:checked');
    }

    /**
     * Aplica la regla de los tres ceros en la interfaz de usuario.
     * Cuando se acumulan 3 respuestas "0" consecutivas, los incisos
     * siguientes se marcan como NULL y se deshabilitan visualmente.
     *
     * Equivalente UI de aplicar_regla_tres_ceros_post() en PHP.
     *
     * @param {number} totalIncisos  Cantidad de incisos del área
     * @param {string} sufijo        '' para visual, 'a' para auditivo
     * @param {string} claseFila     Clase CSS que se agrega a las filas anuladas
     */
    function aplicarReglaTresCerosUI(totalIncisos, sufijo, claseFila) {
        var ceros = 0, seCorto = false;
        var i, j, k, radios, seleccionado, valor, fila;

        for (i = 1; i <= totalIncisos; i++) {
            seleccionado = obtenerSeleccionadoPorNombre('evaluacion' + i + sufijo);
            valor        = seleccionado ? String(seleccionado.value) : 'NULL';

            if (seCorto) {
                // Forzar NULL y deshabilitar los radios que no sean NULL
                radios = obtenerRadiosPorNombre('evaluacion' + i + sufijo);
                for (k = 0; k < radios.length; k++) {
                    if (String(radios[k].value) === 'NULL') {
                        radios[k].checked  = true;
                        radios[k].disabled = false;
                    } else {
                        radios[k].checked  = false;
                        radios[k].disabled = true;
                    }
                }
                if (radios.length) {
                    fila = radios[0].closest('tr');
                    if (fila) fila.classList.add(claseFila);
                }
                continue;
            }

            if (valor === '0') {
                ceros++;
                if (ceros >= 3) seCorto = true;
            }

            // Habilitar todos los radios de este inciso (no cortado)
            radios = obtenerRadiosPorNombre('evaluacion' + i + sufijo);
            for (j = 0; j < radios.length; j++) radios[j].disabled = false;

            if (radios.length) {
                fila = radios[0].closest('tr');
                if (fila) fila.classList.remove(claseFila);
            }
        }
    }

    /**
     * Recalcula totales, percentiles y clasificaciones en tiempo real.
     * Se llama cada vez que el usuario cambia una selección.
     */
    function recalcularEvaluacion() {
        var mes = obtenerMesActual();

        aplicarReglaTresCerosUI(32, '',  'fila-cancelada-visual');
        aplicarReglaTresCerosUI(14, 'a', 'fila-cancelada-auditiva');

        var totalVisual   = sumarSeleccionadosPorClase('calcV');
        var totalAuditivo = sumarSeleccionadosPorClase('calcA');
        var totalEstudio  = totalVisual + totalAuditivo;

        var percentilVisual   = obtenerPercentilJS(mes, 'visual',   totalVisual);
        var percentilAuditivo = obtenerPercentilJS(mes, 'auditivo', totalAuditivo);
        var percentilEstudio  = obtenerPercentilJS(mes, 'estudio',  totalEstudio);

        asignarValor('sumV', totalVisual);
        asignarValor('sumA', totalAuditivo);
        asignarValor('sumT', totalEstudio);

        asignarValor('percentilVisual',   percentilVisual);
        asignarValor('resultadoVisual',   clasificarPercentilJS(percentilVisual));
        asignarValor('percentilAuditiva', percentilAuditivo);
        asignarValor('resultadoAuditiva', clasificarPercentilJS(percentilAuditivo));
        asignarValor('percentilTotal',    percentilEstudio);
        asignarValor('resultadoTotal',    clasificarPercentilJS(percentilEstudio));
    }

    /** Enlaza el evento change/click de todos los radios al recálculo automático. */
    function enlazarRecalculoAutomatico() {
        var elementosV = document.getElementsByClassName('calcV');
        var elementosA = document.getElementsByClassName('calcA');
        var i;
        for (i = 0; i < elementosV.length; i++) {
            elementosV[i].addEventListener('change', recalcularEvaluacion);
            elementosV[i].addEventListener('click',  recalcularEvaluacion);
        }
        for (i = 0; i < elementosA.length; i++) {
            elementosA[i].addEventListener('change', recalcularEvaluacion);
            elementosA[i].addEventListener('click',  recalcularEvaluacion);
        }
    }

    document.addEventListener('DOMContentLoaded', function () {
        enlazarRecalculoAutomatico();
        recalcularEvaluacion();

        // Validación de fecha obligatoria antes de enviar el formulario
        var form = document.getElementById('evaluationForm');
        if (form) {
            form.addEventListener('submit', function (e) {
                var fechaInput = document.getElementById('fechaEstudio');
                var fechaError = document.getElementById('fechaError');

                if (!fechaInput || !fechaInput.value || fechaInput.value.trim() === '') {
                    e.preventDefault();
                    if (fechaError) fechaError.style.display = 'inline';
                    fechaInput.focus();
                    fechaInput.style.border = '2px solid red';
                    return false;
                }

                if (fechaError) fechaError.style.display = 'none';
                fechaInput.style.border = '';
                return confirm('¿Enviar estudio?');
            });
        }
    });
    </script>

    <link rel="stylesheet" type="text/css" href="styles/evaluacionVisual.css">
    <link rel="stylesheet" href="styles/header.css">
</head>
<body>
<?php $tituloPagina = 'Evaluación del paciente'; ?>
<?php require_once('includes/header.php'); ?>

    <main class="evaluation-page">
        <section class="patient-card">

            <div class="patient-card__header">
                <div>
                    <p class="patient-card__eyebrow">Evaluación visual - auditiva</p>
                    <h2 class="patient-card__name"><?php echo htmlspecialchars($misDatos['nombre'], ENT_QUOTES, 'UTF-8'); ?></h2>
                </div>

                <div class="patient-card__actions">
                    <?php if ($i <= 8) { ?>
                        <div class="badges-row">
                            <div class="month-badge">
                                <span>Mes a evaluar</span>
                                <strong><?php echo $i; ?></strong>
                            </div>
                            <div class="month-badge month-badge--corregida">
                                <span>Fecha Edad Corregida</span>
                                <strong><?php echo $edadCorregidaTexto; ?></strong>
                            </div>
                        </div>
                    <?php } ?>
                    <a href="index.php" class="btn-inicio">Inicio</a>
                    <input type="submit" name="btnFalta" id="btnFalta" value="Marcar falta" onclick="return confirm('¿Poner Falta?')">
                </div>
            </div>

            <div class="patient-stats">
                <div class="patient-stat">
                    <span class="patient-stat__label">Días</span>
                    <strong class="patient-stat__value"><?php echo $misDias; ?></strong>
                </div>
                <div class="patient-stat">
                    <span class="patient-stat__label">Semanas de Gestación</span>
                    <strong class="patient-stat__value"><?php echo $misSemanas; ?></strong>
                </div>
                <div class="patient-stat">
                    <span class="patient-stat__label">Meses</span>
                    <strong class="patient-stat__value"><?php echo $misMeses; ?></strong>
                </div>
            </div>

            <div class="info-grid">
                <article class="info-card">
                    <h3 class="info-card__title">Área de procedencia</h3>
                    <p class="info-card__text">
                        <?php echo htmlspecialchars($area['area_procedencia'] ?? 'Sin registro.', ENT_QUOTES, 'UTF-8'); ?>
                    </p>
                </article>

                <article class="info-card">
                    <h3 class="info-card__title">Potenciales visuales</h3>
                    <ul class="info-list">
                        <?php foreach ($potencialesVisuales as $potencialVisual) { ?>
                            <li><?php echo htmlspecialchars($potencialVisual, ENT_QUOTES, 'UTF-8'); ?></li>
                        <?php } ?>
                    </ul>
                </article>

                <article class="info-card">
                    <h3 class="info-card__title">Potenciales auditivos</h3>
                    <ul class="info-list">
                        <?php foreach ($potencialesAuditivos as $potencialAuditivo) { ?>
                            <li><?php echo htmlspecialchars($potencialAuditivo, ENT_QUOTES, 'UTF-8'); ?></li>
                        <?php } ?>
                    </ul>
                </article>

                <article class="info-card info-card--wide">
                    <h3 class="info-card__title">Factores de riesgo</h3>
                    <p class="info-card__text">
                        <?php echo htmlspecialchars(implode(', ', $misRiesgos), ENT_QUOTES, 'UTF-8'); ?>
                    </p>
                </article>
            </div>
        </section>

        <?php if ($i <= 8) { ?>
            <div class="evaluation-toolbar">
                <form action="#" method="POST" class="absence-form">
                    <input type="hidden" name="claveEnviarPaciente" value="<?php echo htmlspecialchars($miClavePaciente, ENT_QUOTES, 'UTF-8'); ?>">
                    <input type="hidden" name="mesAEvaluar"  value="<?php echo $i; ?>">
                    <input type="hidden" name="misDias"      value="<?php echo $misDias; ?>">
                    <input type="hidden" name="misSemanas"   value="<?php echo $misSemanas; ?>">
                    <input type="hidden" name="misMeses"     value="<?php echo $misMeses; ?>">
                </form>
            </div>

            <form action="#" method="POST" class="evaluation-form" id="evaluationForm">
                <input type="hidden" id="mes_estudio_actual" value="<?php echo (int)$i; ?>">

                <!-- ── Fecha del estudio ──────────────────────────────────────── -->
                <section class="evaluation-panel evaluation-panel--fecha">
                    <div class="date-card">
                        <div class="date-card__header"></div>
                        <div class="date-field-wrap">
                            <label for="fechaEstudio" class="date-label">
                                <span>Fecha del estudio</span>
                                <span class="date-badge__requerido">*</span>
                            </label>
                            <p class="date-card__text">Selecciona la fecha en que se realizó la evaluación.</p>
                            <div class="date-input-shell">
                                <input
                                    type="date"
                                    id="fechaEstudio"
                                    name="fechaEstudio"
                                    max="<?php echo date('Y-m-d'); ?>"
                                    required
                                    class="date-input-main"
                                >
                            </div>
                            <span class="date-helper">No puede seleccionarse una fecha mayor a hoy.</span>
                            <span class="date-error-msg" id="fechaError">La fecha del estudio es obligatoria.</span>
                        </div>
                    </div>
                </section>

                <!-- ── Evaluación Visual ─────────────────────────────────────── -->
                <section class="evaluation-panel">
                    <div class="evaluation-panel__header">
                        <h2>Evaluación visual</h2>
                    </div>
                    <div class="table-scroll-wrap">
                        <div class="table-scroll-hint table-scroll-hint--tablet">
                            <span class="table-scroll-hint__icon">⇠ ⇢</span>
                            <span class="table-scroll-hint__text">Desliza la tabla de izquierda a derecha</span>
                        </div>
                        <div class="table-responsive">
                            <table class="evaluation-table">
                                <colgroup>
                                    <col class="col-inciso">
                                    <col class="col-null">
                                    <col class="col-cero">
                                    <col class="col-uno">
                                    <col class="col-dos">
                                </colgroup>
                                <thead>
                                    <tr>
                                        <th>Inciso</th>
                                        <th>Null</th>
                                        <th>0</th>
                                        <th>1</th>
                                        <th>2</th>
                                    </tr>
                                </thead>
                                <tbody>
                                    <?php
                                    // Incisos visuales — se generan dinámicamente para evitar
                                    // repetición de HTML. Los textos deben coincidir con la guía clínica.
                                    $incisos_visuales = [
                                        1  => 'Contacto visual con el adulto',
                                        2  => 'Contacto visual con el adulto al desplazarse',
                                        3  => 'Contemplación de tarjetas (25-30cm) en la línea media',
                                        4  => 'Contemplación de tarjetas (90cm) en la línea media',
                                        5  => 'Observación de tarjetas (25-30cm) a la derecha',
                                        6  => 'Observación de tarjetas (25-30cm) a la izquierda',
                                        7  => 'Seguimiento de tarjetas de la línea media a la derecha y a la izquierda, y viceversa',
                                        8  => 'Observación de un anillo cercano (25-30cm) en la línea media por 3 segundos',
                                        9  => 'Observación de su imagen frente al espejo (distancia 20cm)',
                                        10 => 'Fijación discriminativa entre dos tarjetas',
                                        11 => 'Seguimiento del desplazamiento de tarjetas aumentando la distancia (45-90cm)',
                                        12 => 'Seguimiento del desplazamiento del anillo horizontalmente',
                                        13 => 'Seguimiento del desplazamiento del anillo verticalmente',
                                        14 => 'Seguimiento del desplazamiento del anillo circularmente',
                                        15 => 'Seguimiento del desplazamiento de la tarjeta de derecha a izquierda, girando completamente la cabeza',
                                        16 => 'Seguimiento del desplazamiento de la tarjeta arriba-abajo flexionando y extendiendo completamente el cuello',
                                        17 => 'Observación de un cubo pequeño por 3 segundos',
                                        18 => 'Observación, prensión y manipulación de un anillo',
                                        19 => 'Observación, prensión y manipulación de un anillo oscilante',
                                        20 => 'Seguimiento visual y prensión de una varilla',
                                        21 => 'Seguimiento visual del trayecto de una pelota, con intento de tomarla',
                                        22 => 'Observación de una ficha',
                                        23 => 'Observación y aproximación a su imagen frente al espejo',
                                        24 => 'Seguimiento de la caída de un globo',
                                        25 => 'Alcanzar cubos colocados sobre la mesa',
                                        26 => 'Localización de una pelota oculta',
                                        27 => 'Observación y manipulación de la cuerda atada al anillo',
                                        28 => 'Búsqueda del rostro familiar oculto',
                                        29 => 'Estirar la mano al observar su imagen frente al espejo',
                                        30 => 'Tomar una pastilla y llevarla a la boca',
                                        31 => 'Tomar objetos y golpearlos sobre la mesa',
                                        32 => 'Tomar dos cubos con las manos',
                                    ];
                                    foreach ($incisos_visuales as $num => $texto) { ?>
                                    <tr>
                                        <td><?php echo $num . '.- ' . htmlspecialchars($texto, ENT_QUOTES, 'UTF-8'); ?></td>
                                        <td><input class="calcV" type="radio" name="evaluacion<?php echo $num; ?>" value="NULL" checked="checked"></td>
                                        <td><input class="calcV" type="radio" name="evaluacion<?php echo $num; ?>" value="0"></td>
                                        <td><input class="calcV" type="radio" name="evaluacion<?php echo $num; ?>" value="1"></td>
                                        <td><input class="calcV" type="radio" name="evaluacion<?php echo $num; ?>" value="2"></td>
                                    </tr>
                                    <?php } ?>
                                </tbody>
                            </table>
                        </div>
                    </div>
                    <div class="metrics-grid">
                        <div class="metric-card">
                            <label for="sumV">Total visual</label>
                            <input type="number" name="sumV" id="sumV" readonly="readonly">
                        </div>
                        <div class="metric-card">
                            <label for="percentilVisual">Percentil visual</label>
                            <input type="number" id="percentilVisual" name="percentilVisual" readonly="readonly">
                        </div>
                        <div class="metric-card metric-card--highlight">
                            <label for="resultadoVisual">Clasificación visual</label>
                            <input type="text" id="resultadoVisual" name="resultadoVisual" readonly="readonly">
                        </div>
                    </div>
                </section>

                <!-- ── Evaluación Auditiva ────────────────────────────────────── -->
                <section class="evaluation-panel">
                    <div class="evaluation-panel__header">
                        <h2>Evaluación auditiva</h2>
                    </div>
                    <div class="table-scroll-wrap">
                        <div class="table-scroll-hint table-scroll-hint--tablet">
                            <span class="table-scroll-hint__icon">⇠ ⇢</span>
                            <span class="table-scroll-hint__text">Desliza la tabla de izquierda a derecha</span>
                        </div>
                        <div class="table-responsive">
                            <table class="evaluation-table evaluation-table--small">
                                <colgroup>
                                    <col class="col-inciso">
                                    <col class="col-null">
                                    <col class="col-cero">
                                    <col class="col-uno">
                                    <col class="col-dos">
                                </colgroup>
                                <thead>
                                    <tr>
                                        <th>Inciso</th>
                                        <th>Null</th>
                                        <th>0</th>
                                        <th>1</th>
                                        <th>2</th>
                                    </tr>
                                </thead>
                                <tbody>
                                    <?php
                                    $incisos_auditivos = [
                                        1  => 'Respuesta a la voz humana',
                                        2  => 'Respuesta ante el sonido de una campana (30-45 cm)',
                                        3  => 'Respuesta ante el sonido de una campana a la derecha',
                                        4  => 'Respuesta ante sonidos de una campana a la izquierda',
                                        5  => 'Respuesta ante la voz humana girando la cabeza',
                                        6  => 'Respuesta ante sonidos de la campana girando la cabeza',
                                        7  => 'Respuesta al escuchar su nombre',
                                        8  => 'Respuesta ante la voz humana, localizando el origen de donde procede',
                                        9  => 'Respuesta discriminativa ante dos estímulos auditivos diferentes',
                                        10 => 'Respuesta ante el sonido de una sonaja que él agita',
                                        11 => 'Seguimiento del sonido de una campana en dirección arriba-abajo',
                                        12 => 'Seguimiento del sonido de una campana en dirección derecha-izquierda',
                                        13 => 'Búsqueda de sonidos sentado con movimientos oculares',
                                        14 => 'Repetición de sonidos cuando se le habla',
                                    ];
                                    foreach ($incisos_auditivos as $num => $texto) { ?>
                                    <tr>
                                        <td><?php echo $num . '.- ' . htmlspecialchars($texto, ENT_QUOTES, 'UTF-8'); ?></td>
                                        <td><input class="calcA" type="radio" name="evaluacion<?php echo $num; ?>a" value="NULL" checked="checked"></td>
                                        <td><input class="calcA" type="radio" name="evaluacion<?php echo $num; ?>a" value="0"></td>
                                        <td><input class="calcA" type="radio" name="evaluacion<?php echo $num; ?>a" value="1"></td>
                                        <td><input class="calcA" type="radio" name="evaluacion<?php echo $num; ?>a" value="2"></td>
                                    </tr>
                                    <?php } ?>
                                </tbody>
                            </table>
                        </div>
                    </div>
                    <div class="metrics-grid">
                        <div class="metric-card">
                            <label for="sumA">Total auditivo</label>
                            <input type="number" name="sumA" id="sumA" readonly="readonly">
                        </div>
                        <div class="metric-card">
                            <label for="percentilAuditiva">Percentil auditivo</label>
                            <input type="number" id="percentilAuditiva" name="percentilAuditiva" readonly="readonly">
                        </div>
                        <div class="metric-card metric-card--highlight">
                            <label for="resultadoAuditiva">Clasificación auditiva</label>
                            <input type="text" id="resultadoAuditiva" name="resultadoAuditiva" readonly="readonly">
                        </div>
                    </div>
                </section>

                <!-- ── Resumen y envío ────────────────────────────────────────── -->
                <section class="evaluation-panel evaluation-panel--final">
                    <div class="final-grid">
                        <div class="observations-card">
                            <label for="observaciones">Observaciones generales</label>
                            <textarea rows="6" cols="50" name="observaciones" id="observaciones" placeholder="Escribe aquí observaciones relevantes del estudio"></textarea>
                        </div>
                        <div class="study-summary">
                            <div class="metric-card">
                                <label for="sumT">Total evaluación</label>
                                <input type="number" name="sumT" id="sumT" readonly="readonly">
                            </div>
                            <div class="metric-card">
                                <label for="percentilTotal">Percentil total</label>
                                <input type="number" id="percentilTotal" name="percentilTotal" readonly="readonly">
                            </div>
                            <div class="metric-card metric-card--accent">
                                <label for="resultadoTotal">Clasificación final</label>
                                <input type="text" id="resultadoTotal" name="resultadoTotal" readonly="readonly">
                            </div>
                        </div>
                    </div>
                    <div class="form-submit">
                        <input class="calc btn-primary" type="submit" name="btnEnviar" value="Enviar evaluación">
                    </div>
                </section>

                <!-- Campos ocultos para el procesamiento del POST -->
                <input class="calc" type="hidden" name="claveEnviarPaciente" value="<?php echo htmlspecialchars($miClavePaciente, ENT_QUOTES, 'UTF-8'); ?>">
                <input class="calc" type="hidden" name="mesAEvaluar" value="<?php echo $i; ?>">
                <input type="hidden" name="misDias"    value="<?php echo $misDias; ?>">
                <input type="hidden" name="misSemanas" value="<?php echo $misSemanas; ?>">
                <input type="hidden" name="misMeses"   value="<?php echo $misMeses; ?>">
            </form>

        <?php } else { ?>
            <section class="completed-card">
                <h2>Este paciente ya completó sus 8 meses de evaluación</h2>
                <p>Puedes consultar sus resultados desde la pantalla principal.</p>
            </section>
        <?php } ?>
    </main>
</body>
</html>
<?php
} else {
    // Sin sesión válida→ login
    header('Location: index.php');
    exit;
}
?>