(function () {
    'use strict';

    if (window.atencionSicologicaInitialized) {
        return;
    }
    window.atencionSicologicaInitialized = true;

    document.addEventListener('DOMContentLoaded', function () {
        // Elementos del DOM
        const tipoEnsenanza = document.getElementById('tipo_ensenanza');
        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 nuevaAtencionBtnWrapper = document.getElementById('nuevaAtencionBtnWrapper');
        const btnNuevaAtencion = document.getElementById('btnNuevaAtencion');
        const formularioAtencion = document.getElementById('formularioAtencion');
        const formAtencion = document.getElementById('formAtencion');
        const btnCancelarAtencion = document.getElementById('btnCancelarAtencion');
        const tablaAtencionesDiv = document.getElementById('tablaAtencionesAlumno');
        const modalDetalle = new bootstrap.Modal(document.getElementById('modalDetalleAtencion'));

        // Estado de la aplicación
        let alumnoSeleccionadoId = null;
        let alumnoSeleccionadoNombre = '';
        let atencionEnEdicionId = null;
        let ordenActual = { campo: 'fecha_atencion', direccion: 'DESC' };
        let submitBloqueado = false;

        if (formularioAtencion) formularioAtencion.style.display = 'none';
        if (buscadorAlumno) buscadorAlumno.disabled = true;

        // --- FUNCIONES AUXILIARES ---
        function resetearFormulario() {
            if (formAtencion) {
                formAtencion.reset();
                atencionEnEdicionId = null;
                const submitBtn = formAtencion.querySelector('button[type="submit"]');
                if (submitBtn) submitBtn.textContent = 'Guardar Atención';
            }
        }

        function limpiarSeleccion() {
            alumnoSeleccionadoId = null;
            alumnoSeleccionadoNombre = '';
            if (etiquetaAlumno) etiquetaAlumno.style.display = 'none';
            if (nuevaAtencionBtnWrapper) nuevaAtencionBtnWrapper.style.display = 'none';
            if (formularioAtencion) formularioAtencion.style.display = 'none';
            if (tablaAtencionesDiv) tablaAtencionesDiv.style.display = 'none';
            if (tablaAlumnosCurso) tablaAlumnosCurso.innerHTML = '';
            if (resultadosBusqueda) resultadosBusqueda.innerHTML = '';
        }

        // --- 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';
            }
        });

        btnNuevaAtencion?.addEventListener('click', function () {
            resetearFormulario();
            if (formularioAtencion) formularioAtencion.style.display = 'block';
            if (nuevaAtencionBtnWrapper) nuevaAtencionBtnWrapper.style.display = 'none';
            formularioAtencion.scrollIntoView({
                behavior: 'smooth',
                block: 'start'
            });
        });

        btnCancelarAtencion?.addEventListener('click', function () {
            if (formularioAtencion) formularioAtencion.style.display = 'none';
            if (nuevaAtencionBtnWrapper) nuevaAtencionBtnWrapper.style.display = 'block';
            resetearFormulario();
        });

        formAtencion?.addEventListener('submit', function (e) {
            e.preventDefault();
            if (submitBloqueado) return;
            submitBloqueado = true;

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

            const esEdicion = atencionEnEdicionId !== null;
            const url = esEdicion ? src('atencion_sicologica_actualizar.php') : src('atencion_sicologica_guardar.php');

            const data = {
                alumno_id: alumnoSeleccionadoId,
                fecha_atencion: document.getElementById('fecha_atencion')?.value,
                motivo_atencion: document.getElementById('motivo_atencion')?.value,
                antecedentes: document.getElementById('antecedentes')?.value,
                ideacion: document.getElementById('ideacion')?.checked ? 1 : 0,
                planificacion: document.getElementById('planificacion')?.checked ? 1 : 0,
                intentos: document.getElementById('intentos')?.checked ? 1 : 0,
                medidas_acuerdos: document.getElementById('medidas_acuerdos')?.value,
                notas: document.getElementById('notas')?.value,
                cierre: document.getElementById('cierre')?.value,
            };

            if (esEdicion) data.id = atencionEnEdicionId;

            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.');
                        resetearFormulario();
                        cargarTablaAtenciones(alumnoSeleccionadoId);
                        if (formularioAtencion) formularioAtencion.style.display = 'none';
                        if (nuevaAtencionBtnWrapper) nuevaAtencionBtnWrapper.style.display = 'block';
                    } else {
                        alert(resp.msg || 'Error al guardar la atención.');
                    }
                })
                .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 = false;
                })
                .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.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>';
                })
                .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.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>';
                })
                .catch(error => {
                    tablaAlumnosCurso.innerHTML = '<div class="alert alert-danger">Error al cargar alumnos.</div>';
                });
        }

        function seleccionarAlumno(target) {
            alumnoSeleccionadoId = target.dataset.id;
            alumnoSeleccionadoNombre = target.dataset.nombre;

            if (etiquetaAlumno) {
                etiquetaAlumno.innerHTML = `<strong>Alumno:</strong> ${alumnoSeleccionadoNombre}`;
                etiquetaAlumno.style.display = 'block';
            }
            if (nuevaAtencionBtnWrapper) nuevaAtencionBtnWrapper.style.display = 'block';

            if (resultadosBusqueda) resultadosBusqueda.style.display = 'none';
            if (buscadorAlumno) buscadorAlumno.value = '';

            cargarTablaAtenciones(alumnoSeleccionadoId);

            // Scroll
            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 cargarTablaAtenciones(alumnoId, ordenCampo = ordenActual.campo, ordenDireccion = ordenActual.direccion) {
            if (!tablaAtencionesDiv) return;
            // Crear función para generar encabezados de tabla ordenables
            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>`;
            }


            tablaAtencionesDiv.innerHTML = '<div class="text-center p-3">Cargando atenciones...</div>';
            tablaAtencionesDiv.style.display = 'block';

            fetch(src(`atencion_sicologica_get.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) {
                        tablaAtencionesDiv.innerHTML = '<div class="alert alert-info">No hay atenciones psicológicas registradas para este alumno.</div>';
                        return;
                    }

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

                    tablaAtencionesDiv.innerHTML = `
                        <div class="card"><div class="card-body p-0">
                        <table class="table table-striped table-hover">
                            <thead><tr>${generarEncabezado('fecha_atencion', 'Fecha')}${generarEncabezado('motivo_atencion', 'Motivo')}<th>Profesional</th><th class="text-end">Acciones</th></tr></thead>
                            <tbody>${data.map(e => `
                                <tr data-atencion='${JSON.stringify(e).replace(/'/g, "&#39;")}'>
                                    <td>${e.fecha_atencion_formato} ${e.hora_atencion_formato}</td>
                                    <td>${e.motivo_atencion}</td>
                                    <td>${e.usuario_nombre || '-'}</td>
                                    <td class="text-end" style="min-width: 160px;">
                                        <div class="btn-group" role="group">
                                            <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
                    tablaAtencionesDiv.querySelectorAll('th[data-campo]').forEach(th => {
                        th.addEventListener('click', function () {
                            const campo = this.dataset.campo;
                            const direccion = this.dataset.direccion;
                            cargarTablaAtenciones(alumnoSeleccionadoId, campo, direccion);
                        });
                    });
                })
                .catch(error => {
                    tablaAtencionesDiv.innerHTML = `<div class="alert alert-danger">Error al cargar atenciones: ${error.message}</div>`;
                });
        }

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

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

            if (btn.classList.contains('btn-ver')) verAtencion(atencion);
            if (btn.classList.contains('btn-imprimir')) imprimirAtencion(atencion);
            if (btn.classList.contains('btn-editar')) editarAtencion(atencion);
            if (btn.classList.contains('btn-borrar')) borrarAtencion(atencion);
        });

        function editarAtencion(atencion) {
            resetearFormulario();
            atencionEnEdicionId = atencion.id;

            document.getElementById('fecha_atencion').value = atencion.fecha_atencion_iso;
            document.getElementById('motivo_atencion').value = atencion.motivo_atencion;
            document.getElementById('antecedentes').value = atencion.antecedentes;
            document.getElementById('ideacion').checked = atencion.ideacion == 1;
            document.getElementById('planificacion').checked = atencion.planificacion == 1;
            document.getElementById('intentos').checked = atencion.intentos == 1;
            document.getElementById('medidas_acuerdos').value = atencion.medidas_acuerdos;
            document.getElementById('notas').value = atencion.notas;
            document.getElementById('cierre').value = atencion.cierre;

            const submitBtn = formAtencion?.querySelector('button[type="submit"]');
            if (submitBtn) submitBtn.textContent = 'Actualizar Atención';

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

        function borrarAtencion(atencion) {
            if (confirm('¿Está seguro de que desea eliminar esta atención psicológica?')) {
                fetch(src('atencion_sicologica_borrar.php'), {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json'
                    },
                    body: JSON.stringify({
                        id: atencion.id
                    })
                })
                    .then(res => res.json())
                    .then(resp => {
                        if (resp.success) {
                            alert(resp.msg || 'Atención eliminada.');
                            cargarTablaAtenciones(alumnoSeleccionadoId);
                        } else {
                            alert(resp.msg || 'Error al eliminar.');
                        }
                    })
                    .catch(error => alert('Error de red: ' + error.message));
            }
        }

        function imprimirAtencion(atencion) {
            if (!atencion.id) {
                alert('No se puede imprimir: ID de atención no encontrado.');
                return;
            }
            const url = view(`atencion_sicologica_pdf.php?atencion_id=${atencion.id}&nocache=${Date.now()}`);
            window.open(url, '_blank');
        }

        function verAtencion(atencion) {
            const body = document.getElementById('modalDetalleBody');
            body.innerHTML = `
                <p><strong>Fecha y Hora:</strong> ${atencion.fecha_atencion_formato} ${atencion.hora_atencion_formato}</p>
                <p><strong>Profesional:</strong> ${atencion.usuario_nombre || '-'}</p>
                <p><strong>Motivo:</strong> ${atencion.motivo_atencion || ''}</p>
                <hr>
                <p><strong>Antecedentes:</strong><br>${(atencion.antecedentes || '').replace(/\n/g, '<br>')}</p>
                <p><strong>Riesgo Suicida:</strong><br>
                    - Ideación: ${atencion.ideacion == 1 ? 'Sí' : 'No'}<br>
                    - Planificación: ${atencion.planificacion == 1 ? 'Sí' : 'No'}<br>
                    - Intentos Anteriores: ${atencion.intentos == 1 ? 'Sí' : 'No'}
                </p>
                <p><strong>Medidas y Acuerdos:</strong><br>${(atencion.medidas_acuerdos || '').replace(/\n/g, '<br>')}</p>
                <p><strong>Notas Adicionales:</strong><br>${(atencion.notas || '').replace(/\n/g, '<br>')}</p>
                <p><strong>Cierre:</strong><br>${(atencion.cierre || '').replace(/\n/g, '<br>')}</p>
            `;
            modalDetalle.show();
        }
    });

})();