(function () {
    'use strict';

    if (window.entrevistaAlumnoInitialized) {
        console.warn('entrevista_alumno.js ya fue inicializado');
        return;
    }
    window.entrevistaAlumnoInitialized = true;

    document.addEventListener('DOMContentLoaded', function () {
        const grado = document.getElementById('grado');
        const buscadorAlumno = document.getElementById('buscadorAlumno');
        const resultadosBusqueda = document.getElementById('resultadosBusqueda');
        const tablaAlumnosCurso = document.getElementById('tablaAlumnosCurso');
        const etiquetaAlumno = document.getElementById('etiqueta_alumno_seleccionado');
        const nuevaEntrevistaBtnWrapper = document.getElementById('nuevaEntrevistaBtnWrapper');
        const btnNuevaEntrevista = document.getElementById('btnNuevaEntrevista');
        const formularioEntrevista = document.getElementById('formularioEntrevista');
        const formEntrevista = document.getElementById('formEntrevista');
        const btnCancelar = document.getElementById('btnCancelarEntrevista');
        const tipoEnsenanza = document.getElementById('tipo_ensenanza');
        const tablaEntrevistasDiv = document.getElementById('tablaEntrevistasAlumno');

        let alumnosSeleccionados = []; // Array de {id: X, nombre: 'Y'}
        let entrevistaEnEdicionId = null;
        let ordenActual = { campo: 'fecha_entrevista', direccion: 'DESC' };
        let submitBloqueado = false;

        // --- INICIALIZACIÓN ---
        if (formularioEntrevista) formularioEntrevista.style.display = 'none';
        if (buscadorAlumno) buscadorAlumno.disabled = true;

        // --- FUNCIONES AUXILIARES ---

        function mostrarAlerta(mensaje, tipo = 'info', tiempo = 3500) {
            // (Tu función mostrarAlerta existente)
        }

        function resetearFormularioEntrevista() {
            if (formEntrevista) {
                formEntrevista.reset();
                const fechaInput = document.getElementById('fecha_entrevista');
                if (fechaInput) fechaInput.disabled = false;
                entrevistaEnEdicionId = null;
                const submitBtn = formEntrevista?.querySelector('button[type="submit"]');
                if (submitBtn) submitBtn.textContent = 'Guardar entrevista';
            }
        }

        function limpiarSeleccion() {
            alumnosSeleccionados = [];
            actualizarEtiquetaAlumnos();
            if (nuevaEntrevistaBtnWrapper) nuevaEntrevistaBtnWrapper.style.display = 'none';
            if (formularioEntrevista) formularioEntrevista.style.display = 'none';
            if (tablaEntrevistasDiv) tablaEntrevistasDiv.style.display = 'none';
            // No limpiamos tablas de búsqueda para permitir seguir seleccionando
            document.querySelectorAll('.alumno-item').forEach(el => el.classList.remove('active', 'table-primary'));
        }

        function actualizarEtiquetaAlumnos() {
            if (!etiquetaAlumno) return;
            
            if (alumnosSeleccionados.length === 0) {
                etiquetaAlumno.style.display = 'none';
                etiquetaAlumno.innerHTML = '';
                if (nuevaEntrevistaBtnWrapper) nuevaEntrevistaBtnWrapper.style.display = 'none';
                return;
            }

            let html = '<div class="d-flex flex-wrap gap-2 align-items-center">';
            html += '<span class="me-2"><i class="bi bi-people-fill"></i> Seleccionados (' + alumnosSeleccionados.length + '):</span>';
            alumnosSeleccionados.forEach(al => {
                html += `
                    <span class="badge bg-primary d-flex align-items-center p-2" style="font-size: 0.9em; box-shadow: 0 2px 4px rgba(0,0,0,0.1);">
                        ${al.nombre}
                        <i class="bi bi-x-circle ms-2 cursor-pointer btn-quitar-alumno" data-id="${al.id}" style="font-size: 1.1em;"></i>
                    </span>`;
            });
            html += `<button type="button" class="btn btn-sm btn-outline-danger ms-auto" id="btnLimpiarTodo" title="Limpiar todos"><i class="bi bi-trash"></i></button>`;
            html += '</div>';
            
            etiquetaAlumno.innerHTML = html;
            etiquetaAlumno.style.display = 'block';
            if (nuevaEntrevistaBtnWrapper) nuevaEntrevistaBtnWrapper.style.display = 'block';

            // Listener para quitar individualmente
            etiquetaAlumno.querySelectorAll('.btn-quitar-alumno').forEach(btn => {
                btn.onclick = (e) => {
                    e.stopPropagation();
                    const id = btn.dataset.id;
                    alumnosSeleccionados = alumnosSeleccionados.filter(a => a.id != id);
                    actualizarEtiquetaAlumnos();
                    if (alumnosSeleccionados.length > 0 && !entrevistaEnEdicionId) {
                        // Recargar tabla solo si queda alguien y no estamos editando
                        cargarTablaEntrevistas(alumnosSeleccionados[0].id);
                    }
                    marcarSeleccionadosEnTablas();
                };
            });

            // Listener para limpiar todo
            const btnLimpiar = document.getElementById('btnLimpiarTodo');
            if (btnLimpiar) btnLimpiar.onclick = limpiarSeleccion;
        }

        function marcarSeleccionadosEnTablas() {
            document.querySelectorAll('.alumno-item').forEach(el => {
                const id = el.dataset.id;
                const isSelected = alumnosSeleccionados.some(a => a.id == id);
                if (isSelected) {
                    el.classList.add('active', 'table-primary');
                } else {
                    el.classList.remove('active', 'table-primary');
                }
            });
        }

        // --- LÓGICA DE EVENTOS ---

        tipoEnsenanza?.addEventListener('change', function () {
            cargarGrados(this.value);
            if (grado) grado.value = '';
            if (buscadorAlumno) buscadorAlumno.value = '';
            limpiarSeleccion();
        });

        grado?.addEventListener('change', function () {
            if (buscadorAlumno) {
                buscadorAlumno.disabled = !this.value;
                buscadorAlumno.value = '';
            }
            limpiarSeleccion();
            if (this.value) {
                mostrarTablaAlumnosPorGrado(this.value, tipoEnsenanza.value);
            }
        });

        buscadorAlumno?.addEventListener('input', function () {
            const q = this.value.trim();
            if (q.length >= 2) {
                buscarAlumnos();
            } else {
                if (resultadosBusqueda) resultadosBusqueda.style.display = 'none';
            }
        });

        btnNuevaEntrevista?.addEventListener('click', function () {
            resetearFormularioEntrevista();
            if (formularioEntrevista) formularioEntrevista.style.display = 'block';
            if (nuevaEntrevistaBtnWrapper) nuevaEntrevistaBtnWrapper.style.display = 'none';
            formularioEntrevista.scrollIntoView({ behavior: 'smooth', block: 'start' });
        });

        btnCancelar?.addEventListener('click', function () {
            if (formularioEntrevista) formularioEntrevista.style.display = 'none';
            if (nuevaEntrevistaBtnWrapper) nuevaEntrevistaBtnWrapper.style.display = 'block';
            resetearFormularioEntrevista();
        });

        formEntrevista?.addEventListener('submit', function (e) { // El listener anidado fue eliminado.
            e.preventDefault();
            if (submitBloqueado) return;
            submitBloqueado = true;

            const submitBtn = formEntrevista.querySelector('button[type="submit"]');
            if (submitBtn) submitBtn.disabled = true;

            const esEdicion = entrevistaEnEdicionId !== null;
            const url = esEdicion ? src('actualizar_entrevista_alumno.php') : src('guardar_entrevista_alumno.php');

            const data = {
                alumno_ids: alumnosSeleccionados.map(a => a.id),
                fecha_entrevista: document.getElementById('fecha_entrevista')?.value || '',
                motivo: document.getElementById('motivo_entrevista')?.value || '',
                observaciones: document.getElementById('observaciones_entrevista')?.value || '',
                acuerdos_compromisos: document.getElementById('acuerdos_entrevista')?.value || ''
            };

            if (esEdicion) data.id = entrevistaEnEdicionId;

            fetch(url, {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify(data)
            })
                .then(res => res.json())
                .then(resp => {
                    if (resp.success) {
                        alert(resp.msg || 'Operación realizada con éxito.');
                        resetearFormularioEntrevista();
                        if (alumnosSeleccionados.length > 0) {
                            cargarTablaEntrevistas(alumnosSeleccionados[0].id);
                        }
                        if (formularioEntrevista) formularioEntrevista.style.display = 'none';
                        if (nuevaEntrevistaBtnWrapper) nuevaEntrevistaBtnWrapper.style.display = 'block';
                    } else {
                        alert(resp.msg || 'Error al guardar la entrevista.');
                    }
                })
                .catch(error => {
                    alert('Error de red o servidor: ' + error.message);
                })
                .finally(() => {
                    submitBloqueado = false;
                    if (submitBtn) submitBtn.disabled = false;
                });
        });

        // --- FUNCIONES DE CARGA DE DATOS (FETCH) ---

        function cargarGrados(tipoId) {
            if (!grado) return;
            grado.innerHTML = '<option value="">Cargando grados...</option>';
            grado.disabled = true;
            if (!tipoId) {
                grado.innerHTML = '<option value="">Selecciona tipo de enseñanza primero</option>';
                if (buscadorAlumno) buscadorAlumno.disabled = true;
                return;
            }

            fetch(src(`grados_por_ensenanza.php?tipo_ensenanza_id=${tipoId}`))
                .then(res => res.json())
                .then(data => {
                    grado.innerHTML = '<option value="">Selecciona grado</option>';
                    data.forEach(gr => grado.innerHTML += `<option value="${gr.id}">${gr.nombre}</option>`);
                    grado.disabled = false;
                    if (buscadorAlumno) buscadorAlumno.disabled = true; // Deshabilitar búsqueda libre si hay grados
                })
                .catch(error => {
                    grado.innerHTML = '<option value="">Error al cargar grados</option>';
                });
        }

        function buscarAlumnos() {
            if (!resultadosBusqueda || !buscadorAlumno) return;
            const q = buscadorAlumno.value.trim();
            const grado_id = grado?.value;
            const tipo_ensenanza_id = tipoEnsenanza?.value;

            let url = src(`buscar_matriculados.php?q=${encodeURIComponent(q)}`);
            if (grado_id) url += `&grado_id=${grado_id}`;
            if (tipo_ensenanza_id) url += `&tipo_ensenanza_id=${tipo_ensenanza_id}`;

            resultadosBusqueda.style.display = 'block';
            resultadosBusqueda.innerHTML = '<div class="list-group-item">Buscando...</div>';

            fetch(url)
                .then(res => res.json())
                .then(data => {
                    resultadosBusqueda.innerHTML = data.length > 0
                        ? data.map(al => `
                            <button type="button" class="list-group-item list-group-item-action alumno-item" data-id="${al.id || al.alumno_id}" data-nombre="${al.ap_paterno} ${al.ap_materno}, ${al.nombre}">
                                <strong>${al.ap_paterno} ${al.ap_materno}, ${al.nombre}</strong> (${al.run})
                            </button>`).join('')
                        : '<div class="list-group-item">No se encontraron alumnos.</div>';
                    marcarSeleccionadosEnTablas();
                })
                .catch(error => {
                    resultadosBusqueda.innerHTML = '<div class="list-group-item text-danger">Error al buscar.</div>';
                });
        }

        function mostrarTablaAlumnosPorGrado(grado_id, tipo_ensenanza_id) {
            if (!tablaAlumnosCurso) return;
            tablaAlumnosCurso.innerHTML = '<div class="text-center p-3">Cargando alumnos...</div>';

            let url = src(`buscar_matriculados.php?grado_id=${encodeURIComponent(grado_id)}`);
            if (tipo_ensenanza_id) url += `&tipo_ensenanza_id=${encodeURIComponent(tipo_ensenanza_id)}`;

            fetch(url)
                .then(res => res.json())
                .then(data => {
                    tablaAlumnosCurso.innerHTML = data.length > 0
                        ? `<div class="card"><div class="card-body p-0"><table class="table table-hover">
                            <thead><tr><th>Alumno</th><th>RUN</th></tr></thead>
                            <tbody>${data.map(al => `
                                <tr class="alumno-item" data-id="${al.id || al.alumno_id}" data-nombre="${al.ap_paterno} ${al.ap_materno}, ${al.nombre}" style="cursor:pointer;">
                                    <td><strong>${al.ap_paterno} ${al.ap_materno}, ${al.nombre}</strong></td>
                                    <td>${al.run}</td>
                                </tr>`).join('')}
                            </tbody></table></div></div>`
                        : '<div class="alert alert-info">No hay alumnos en este curso.</div>';
                    marcarSeleccionadosEnTablas();
                })
                .catch(error => {
                    tablaAlumnosCurso.innerHTML = '<div class="alert alert-danger">Error al cargar alumnos.</div>';
                });
        }

        function seleccionarAlumno(target) {
            if (entrevistaEnEdicionId) {
                // Si estamos editando, solo permitimos seleccionar UN alumno (o el mismo)
                alumnosSeleccionados = [{
                    id: target.dataset.id,
                    nombre: target.dataset.nombre
                }];
                // Bloquear otros click mientras se edita? No, mejor solo resetear el array
            } else {
                const id = target.dataset.id;
                const nombre = target.dataset.nombre;
                const index = alumnosSeleccionados.findIndex(a => a.id == id);
                
                if (index > -1) {
                    // Si ya estaba, lo quitamos
                    alumnosSeleccionados.splice(index, 1);
                } else {
                    // Si no estaba, lo añadimos
                    alumnosSeleccionados.push({ id, nombre });
                }
            }

            actualizarEtiquetaAlumnos();
            marcarSeleccionadosEnTablas();

            if (resultadosBusqueda) {
                // No ocultar búsqueda para permitir multi-selección cómoda, pero limpiar el input si se desea
                // buscadorAlumno.value = ''; 
            }

            if (alumnosSeleccionados.length > 0) {
                // Al seleccionar, cargamos las entrevistas del PRIMER alumno seleccionado para tener contexto
                cargarTablaEntrevistas(alumnosSeleccionados[0].id);
            }

            // Hacer scroll opcional si es el primero
            if (alumnosSeleccionados.length === 1) {
                setTimeout(() => {
                    const navbar = document.querySelector('.navbar.fixed-top');
                    const navHeight = navbar ? navbar.offsetHeight : 0;
                    if (etiquetaAlumno) {
                        const rect = etiquetaAlumno.getBoundingClientRect();
                        const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
                        const top = rect.top + scrollTop - navHeight - 10;
                        window.scrollTo({ top, behavior: 'smooth' });
                    }
                }, 300);
            }
        }

        resultadosBusqueda?.addEventListener('click', e => {
            const target = e.target.closest('.alumno-item');
            if (target) seleccionarAlumno(target);
        });

        tablaAlumnosCurso?.addEventListener('click', e => {
            const target = e.target.closest('.alumno-item');
            if (target) seleccionarAlumno(target);
        });

        function cargarTablaEntrevistas(alumnoId, ordenCampo = ordenActual.campo, ordenDireccion = ordenActual.direccion) {
            if (!tablaEntrevistasDiv) return;
            tablaEntrevistasDiv.innerHTML = '<div class="text-center p-3">Cargando entrevistas...</div>';
            tablaEntrevistasDiv.style.display = 'block';

            fetch(src(`listar_entrevistas_alumnos.php?alumno_id=${alumnoId}&orden_campo=${ordenCampo}&orden_direccion=${ordenDireccion}`))
                .then(res => res.json())
                .then(result => {
                    if (!result.success) throw new Error(result.error || 'Error desconocido');

                    const data = result.data;
                    if (data.length === 0) {
                        tablaEntrevistasDiv.innerHTML = '<div class="alert alert-info">No hay entrevistas registradas para este alumno.</div>';
                        return;
                    }

                    ordenActual = { campo: ordenCampo, direccion: ordenDireccion };

                    function generarEncabezado(campo, texto) {
                        const esActivo = ordenActual.campo === campo;
                        const siguienteDireccion = esActivo && ordenActual.direccion === 'ASC' ? 'DESC' : 'ASC';
                        const icono = esActivo ? (ordenActual.direccion === 'ASC' ? '↑' : '↓') : '<span style="opacity:0.3">↕</span>';
                        return `<th style="cursor: pointer; user-select: none;" data-campo="${campo}" data-direccion="${siguienteDireccion}" title="Ordenar por ${texto}">${texto} ${icono}</th>`;
                    }

                    tablaEntrevistasDiv.innerHTML = `
                        <div class="card"><div class="card-body p-0">
                        <table class="table table-hover">
                            <thead><tr>
                                ${generarEncabezado('fecha_entrevista', 'Fecha')}
                                ${generarEncabezado('motivo', 'Motivo')}
                                ${generarEncabezado('nombre_entrevistador', 'Entrevistador')}
                                ${generarEncabezado('usuario_modificacion_nombre', 'Modificado por')}
                                ${generarEncabezado('fecha_modificacion', 'Fecha Modif.')}
                                <th class="text-end">Acciones</th></tr></thead>
                            <tbody>${data.map(e => `
                                <tr data-entrevista='${JSON.stringify(e).replace(/'/g, "&#39;")}'>
                                    <td>${e.fecha_entrevista_formato} ${e.hora_entrevista_formato}</td>
                                    <td>${e.motivo}</td>
                                    <td>${e.nombre_entrevistador}</td>
                                    <td>${e.usuario_modificacion_nombre || '-'}</td>
                                    <td>${e.fecha_modificacion_formato}</td>
                                    <td class="text-end" style="min-width: 160px;">
                                        <div class="btn-group" role="group" aria-label="Acciones de entrevista">
                                            <button class="btn btn-sm btn-info btn-ver" title="Ver"><i class="bi bi-eye"></i></button>
                                            <button class="btn btn-sm btn-secondary btn-imprimir" title="Imprimir"><i class="bi bi-printer"></i></button>
                                            <button class="btn btn-sm btn-warning btn-editar" title="Editar"><i class="bi bi-pencil"></i></button>
                                            <button class="btn btn-sm btn-danger btn-borrar" title="Borrar"><i class="bi bi-trash"></i></button>
                                        </div>
                                    </td>
                                </tr>`).join('')}
                            </tbody>
                        </table>
                        </div></div>`;
                })
                .then(() => {
                    // Añadir listeners a los nuevos encabezados de la tabla
                    tablaEntrevistasDiv.querySelectorAll('th[data-campo]').forEach(th => {
                        th.addEventListener('click', function () {
                            const campo = this.dataset.campo;
                            const direccion = this.dataset.direccion;
                            cargarTablaEntrevistas(alumnoId, campo, direccion);
                        });
                    });
                })
                .catch(error => {
                    tablaEntrevistasDiv.innerHTML = `<div class="alert alert-danger">Error al cargar entrevistas: ${error.message}</div>`;
                });
        }

        tablaEntrevistasDiv?.addEventListener('click', e => {
            const btn = e.target.closest('button');
            if (!btn) return;

            const tr = btn.closest('tr');
            const entrevista = JSON.parse(tr.dataset.entrevista.replace(/&#39;/g, "'"));

            if (btn.classList.contains('btn-ver')) verEntrevista(entrevista);
            if (btn.classList.contains('btn-editar')) editarEntrevista(entrevista);
            if (btn.classList.contains('btn-borrar')) borrarEntrevista(entrevista);
            if (btn.classList.contains('btn-imprimir')) imprimirEntrevista(entrevista);
        });

        function editarEntrevista(entrevista) {
            resetearFormularioEntrevista();
            entrevistaEnEdicionId = entrevista.id;

            const fechaInput = document.getElementById('fecha_entrevista');
            if (fechaInput) fechaInput.disabled = true; // No se puede cambiar la fecha al editar

            document.getElementById('fecha_entrevista').value = entrevista.fecha_entrevista_iso;
            document.getElementById('motivo_entrevista').value = entrevista.motivo;
            document.getElementById('observaciones_entrevista').value = entrevista.observaciones;
            document.getElementById('acuerdos_entrevista').value = entrevista.acuerdos;

            const submitBtn = formEntrevista?.querySelector('button[type="submit"]');
            if (submitBtn) submitBtn.textContent = 'Actualizar entrevista';

            if (formularioEntrevista) formularioEntrevista.style.display = 'block';
            if (nuevaEntrevistaBtnWrapper) nuevaEntrevistaBtnWrapper.style.display = 'none';
            formularioEntrevista.scrollIntoView({ behavior: 'smooth' });
        }

        function borrarEntrevista(entrevista) {
            if (confirm('¿Está seguro de que desea eliminar esta entrevista?')) {
                fetch(src('borrar_entrevista_alumno.php'), {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify({ id: entrevista.id })
                })
                    .then(res => res.json())
                    .then(resp => {
                        if (resp.success) {
                            alert(resp.msg || 'Entrevista eliminada.');
                            cargarTablaEntrevistas(entrevista.alumno_id);
                        } else {
                            alert(resp.msg || 'Error al eliminar.');
                        }
                    })
                    .catch(error => alert('Error de red: ' + error.message));
            }
        }

        function imprimirEntrevista(entrevista) {
            if (!entrevista.id) {
                alert('No se puede imprimir: ID de entrevista no encontrado.');
                return;
            }
            const url = `${view("entrevista_alumno_pdf.php")}?entrevista_id=${entrevista.id}&nocache=${Date.now()}`;
            window.open(url, '_blank');
        }

        function verEntrevista(entrevista) {
            let modal = document.getElementById('modalVerEntrevistaAlumno');
            if (!modal) {
                modal = document.createElement('div');
                modal.id = 'modalVerEntrevistaAlumno';
                modal.className = 'modal fade';
                modal.tabIndex = -1;
                modal.innerHTML = `
                    <div class="modal-dialog modal-lg">
                        <div class="modal-content">
                            <div class="modal-header">
                                <h5 class="modal-title">Detalle de Entrevista con Alumno</h5>
                                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Cerrar"></button>
                            </div>
                            <div class="modal-body" id="modalVerEntrevistaAlumnoBody"></div>
                            <div class="modal-footer">
                                <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cerrar</button>
                            </div>
                        </div>
                    </div>
                `;
                document.body.appendChild(modal);
            }

            const body = modal.querySelector('#modalVerEntrevistaAlumnoBody');
            body.innerHTML = `
                <p><b>Fecha y Hora:</b> ${entrevista.fecha_entrevista_formato} ${entrevista.hora_entrevista_formato}</p>
                <p><b>Entrevistador:</b> ${entrevista.nombre_entrevistador || '-'}</p>
                <p><b>Modificado por:</b> ${entrevista.usuario_modificacion_nombre || '-'}</p>
                <p><b>Fecha Modificación:</b> ${entrevista.fecha_modificacion_formato || '-'}</p>
                <hr>
                <p><b>Motivo:</b> ${entrevista.motivo || ''}</p>
                <p><b>Observaciones:</b><br>${(entrevista.observaciones || '').replace(/\n/g, '<br>')}</p>
                <p><b>Acuerdos y Compromisos:</b><br>${(entrevista.acuerdos || '').replace(/\n/g, '<br>')}</p>
            `;
            const modalObj = new bootstrap.Modal(modal);
            modalObj.show();
        }
    });
})();