// ====== bible.js ======
// Módulo de Búsqueda Bíblica - MicroBeam

// ============================================
// VARIABLES GLOBALES
// ============================================

let listaVersiculosActuales = [];

let indicesSeleccionados = []; // NUEVO: Control de selección múltiple
let timerBusqueda = null;
let bibleCache = [];
let currentVersionKey = "RV1960";

let controlCitaDinamica = {
    libroName: "",
    esCapitulosPuros: false,
    capitulosLista: [],
    capituloInicial: null,
    capituloFinal: null,
    esDiscontinuo: false,
    versiculosListaPlana: [],
    versiculoInicial: null,
    versiculoFinal: null,
    anexosAnteriores: []
};

let navState = {
    phase: "books",
    selectedBookId: null,
    selectedBookName: "",
    selectedChapter: null
};



// ============================================
// METADATOS
// ============================================

const BOOK_METADATA = {
    1: "AT / Pentateuco", 2: "AT / Pentateuco", 3: "AT / Pentateuco", 4: "AT / Pentateuco", 5: "AT / Pentateuco",
    6: "AT / Históricos", 7: "AT / Históricos", 8: "AT / Históricos", 9: "AT / Históricos", 10: "AT / Históricos",
    11: "AT / Históricos", 12: "AT / Históricos", 13: "AT / Históricos", 14: "AT / Históricos", 15: "AT / Históricos",
    16: "AT / Históricos", 17: "AT / Históricos",
    18: "AT / Poéticos", 19: "AT / Poéticos", 20: "AT / Poéticos", 21: "AT / Poéticos", 22: "AT / Poéticos",
    23: "AT / Profetas Mayores", 24: "AT / Profetas Mayores", 25: "AT / Profetas Mayores", 26: "AT / Profetas Mayores",
    27: "AT / Profetas Mayores",
    28: "AT / Profetas Menores", 29: "AT / Profetas Menores", 30: "AT / Profetas Menores", 31: "AT / Profetas Menores",
    32: "AT / Profetas Menores", 33: "AT / Profetas Menores", 34: "AT / Profetas Menores", 35: "AT / Profetas Menores",
    36: "AT / Profetas Menores", 37: "AT / Profetas Menores", 38: "AT / Profetas Menores", 39: "AT / Profetas Menores",
    40: "NT / Evangelios", 41: "NT / Evangelios", 42: "NT / Evangelios", 43: "NT / Evangelios",
    44: "NT / Histórico",
    45: "NT / Epístolas Paulinas", 46: "NT / Epístolas Paulinas", 47: "NT / Epístolas Paulinas",
    48: "NT / Epístolas Paulinas", 49: "NT / Epístolas Paulinas", 50: "NT / Epístolas Paulinas",
    51: "NT / Epístolas Paulinas", 52: "NT / Epístolas Paulinas", 53: "NT / Epístolas Paulinas",
    54: "NT / Epístolas Paulinas", 55: "NT / Epístolas Paulinas", 56: "NT / Epístolas Paulinas",
    57: "NT / Epístolas Paulinas",
    58: "NT / Epístolas Generales", 59: "NT / Epístolas Generales", 60: "NT / Epístolas Generales",
    61: "NT / Epístolas Generales", 62: "NT / Epístolas Generales", 63: "NT / Epístolas Generales",
    64: "NT / Epístolas Generales", 65: "NT / Epístolas Generales",
    66: "NT / Profético"
};

// ============================================
// REFERENCIAS DOM (SOLO LAS QUE NO ESTÁN EN proyector.js)
// ============================================

const txtSmartSearch = document.getElementById('txtSmartSearch');
const resultsContainer = document.getElementById('resultsContainer');
const lblCount = document.getElementById('lblCount');
const btnPrevVerseReplica = document.getElementById('btnPrevVerseReplica');
const btnNextVerseReplica = document.getElementById('btnNextVerseReplica');
const slideBgOpacity = document.getElementById('slideBgOpacity');
const valBgOpacity = document.getElementById('valBgOpacity');
const chkStretchBg = document.getElementById('chkStretchBg');
const btnToggleSettings = document.getElementById('btnToggleSettings');
const settingsContent = document.getElementById('settingsContent');
const chkSplitVerse = document.getElementById('chkSplitVerse');
const grpSplitLength = document.getElementById('grpSplitLength');
const slideSplitLength = document.getElementById('slideSplitLength');
const valSplitLength = document.getElementById('valSplitLength');
const pullTopIndicator = document.getElementById('pullTopIndicator');
const pullBottomIndicator = document.getElementById('pullBottomIndicator');
const btnNavMenu = document.getElementById('btnNavMenu');
const navDropdownMenu = document.getElementById('navDropdownMenu');
const navDropdownList = document.getElementById('navDropdownList');
const btnNavBack = document.getElementById('btnNavBack');
const lblNavPhase = document.getElementById('lblNavPhase');
const slideFontSize = document.getElementById('slideFontSize');
const valFontSize = document.getElementById('valFontSize');

// ============================================
// INICIALIZACIÓN
// ============================================

function init() {
    seleccionarVersion("RV1960");
    inicializarGestosTactilesResultados();
    configurarManejadoresMenuNav();
    window.cerrarProyeccionAlSalir();
}

// ============================================
// CONFIGURACIÓN DE AJUSTES
// ============================================

if (btnToggleSettings && settingsContent) {
    btnToggleSettings.onclick = function() {
        settingsContent.classList.toggle('show');
        btnToggleSettings.innerText = settingsContent.classList.contains('show') ? "[ − ]" : "[ + ]";
    };
}

if (slideBgOpacity) {
    slideBgOpacity.addEventListener('input', function() {
        if (valBgOpacity) valBgOpacity.innerText = this.value + "%";
        window.cambiarBrilloFondo(this.value);
    });
}
/*
if (chkStretchBg) {
    chkStretchBg.addEventListener('change', function() {
        window.cambiarEstiradoFondo(this.checked);
    });
}*/

if (slideFontSize) {

// [NUEVO] Recuperar valores guardados de localStorage (o usar 7 por defecto)
    window.savedBibleFontSize = parseFloat(localStorage.getItem('cfgBibleFontSize')) || 7;
    window.savedSongFontSize = parseFloat(localStorage.getItem('cfgSongFontSize')) || 8.5;

    // Asignar el valor inicial al slider dependiendo del modo actual al cargar
    const isCancionesActivo = document.getElementById('songsControls') && 
                              document.getElementById('songsControls').style.display !== 'none';
    const initialSize = isCancionesActivo ? window.savedSongFontSize : window.savedBibleFontSize;
    
    slideFontSize.value = initialSize;
    if (valFontSize) valFontSize.innerText = initialSize + "vw";

    // Al mover el slider
    slideFontSize.addEventListener('input', function() {
        if (valFontSize) valFontSize.innerText = this.value + "vw";
        const isCancionesActivo = document.getElementById('songsControls') &&
                                  document.getElementById('songsControls').style.display !== 'none';
        
        if (isCancionesActivo) {
            window.savedSongFontSize = parseFloat(this.value);
            // [NUEVO] Guardar en localStorage para canciones
            localStorage.setItem('cfgSongFontSize', this.value);
        } else {
            window.savedBibleFontSize = parseFloat(this.value);
            // [NUEVO] Guardar en localStorage para biblia
            localStorage.setItem('cfgBibleFontSize', this.value);
        }
        window.cambiarTamanoFuenteProyeccion(this.value);
    });
}

if (chkSplitVerse) {
    // Recuperar estado al cargar
    const savedSplit = localStorage.getItem('cfgSplitVerse');
    if (savedSplit !== null) {
        chkSplitVerse.checked = savedSplit === 'true';
        if (grpSplitLength) grpSplitLength.classList.toggle('disabled', !chkSplitVerse.checked);
    }
    
    chkSplitVerse.addEventListener('change', function() {
        if (grpSplitLength) grpSplitLength.classList.toggle('disabled', !this.checked);
        localStorage.setItem('cfgSplitVerse', this.checked); // Guardar nuevo estado
        const bibleDiv = document.getElementById('bibleControls');
        if (bibleDiv && bibleDiv.style.display !== 'none') procesarBusquedaInmediata(false);
    });
}

if (slideSplitLength) {
    // Recuperar tamaño al cargar
    const savedLength = localStorage.getItem('cfgSplitLength');
    if (savedLength !== null) {
        slideSplitLength.value = savedLength;
        if (valSplitLength) valSplitLength.innerText = savedLength;
    }

    slideSplitLength.addEventListener('input', function() {
        if (valSplitLength) valSplitLength.innerText = this.value;
        localStorage.setItem('cfgSplitLength', this.value); // Guardar nuevo valor
        const bibleDiv = document.getElementById('bibleControls');
        if (bibleDiv && bibleDiv.style.display !== 'none') procesarBusquedaInmediata(false);
    });
}

// ============================================
// FUNCIONES DE CARGA DE VERSIONES
// ============================================

function seleccionarVersion(versionKey) {
    if (resultsContainer) {
        resultsContainer.innerHTML = `
            <div class="loader-wrapper">
                <div class="spinner"></div>
                <div style="color: var(--text-muted);">Cargando 'biblia_${versionKey.toLowerCase()}'...</div>
            </div>
        `;
    }
    if (txtSmartSearch) txtSmartSearch.disabled = true;

    if (window.BIBLE_VERSIONS && window.BIBLE_VERSIONS[versionKey]) {
        cargarVersionBiblia(versionKey);
    } else {
        const script = document.createElement('script');
        script.src = `biblia_${versionKey.toLowerCase()}.js`;
        script.onload = () => {
            if (window.BIBLE_VERSIONS && window.BIBLE_VERSIONS[versionKey]) {
                cargarVersionBiblia(versionKey);
            } else if (resultsContainer) {
                resultsContainer.innerHTML = `<div style="padding:20px;color:#ff6b6b;">⚠️ Error: estructura inválida.</div>`;
            }
        };
        script.onerror = () => {
            if (resultsContainer) {
                resultsContainer.innerHTML = `<div style="padding:20px;color:#ff6b6b;">⚠️ No se encontró biblia_${versionKey.toLowerCase()}.js</div>`;
            }
            if (txtSmartSearch) txtSmartSearch.disabled = false;
        };
        document.head.appendChild(script);
    }
}

function cargarVersionBiblia(versionKey) {
    const vData = window.BIBLE_VERSIONS[versionKey];
    if (!vData) return;
    currentVersionKey = versionKey;
    const lblActiveVer = document.getElementById('lblActiveVersion');
    if (lblActiveVer) lblActiveVer.innerText = `Versión: ${vData.name}`;
    document.querySelectorAll('.version-btn').forEach(btn => {
        btn.classList.toggle('active', btn.getAttribute('data-version') === versionKey);
    });
    if (resultsContainer) resultsContainer.innerHTML = `<div class="loader-wrapper"><div class="spinner"></div></div>`;
    setTimeout(() => {
        bibleCache = vData.data.map(v => ({
            bookId: v[0],
            libroName: vData.books[v[0] - 1] || `Libro ${v[0]}`,
            chapter: v[1],
            verse: v[2],
            textoLimpio: v[3],
            textoNorm: normalizarTexto(v[3])
        }));
        if (txtSmartSearch) {
            txtSmartSearch.disabled = false;
            if (txtSmartSearch.value.trim().length >= 2) {
                procesarBusquedaInmediata(false);
            } else if (resultsContainer) {
                resultsContainer.innerHTML = `<div style="padding:20px;color:var(--text-muted);">Versión '${versionKey}' lista. Usa el menú ▼ o el buscador.</div>`;
            }
        }
    }, 50);
}

document.querySelectorAll('.version-btn').forEach(btn => {
    btn.onclick = () => seleccionarVersion(btn.getAttribute('data-version'));
});

// ============================================
// FUNCIONES DE UTILIDAD
// ============================================

function normalizarTexto(texto) {
    if (!texto) return "";
    return texto.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "")
        .replace(/[.,\/#!$%\^&\*;:{}=\-_`~()?"']/g, "").replace(/\s+/g, " ").trim();
}

function ejecutarAutocorrecciónSagrada(input) {
    const palabras = [
        { regex: /\bdios\b/gi, reemplazo: "Dios" },
        { regex: /\bjesus\b/gi, reemplazo: "Jesús" },
        { regex: /\bjesús\b/gi, reemplazo: "Jesús" },
        { regex: /\bcristo\b/gi, reemplazo: "Cristo" },
        { regex: /\bjesucristo\b/gi, reemplazo: "Jesucristo" },
        { regex: /\bespiritu\s+santo\b/gi, reemplazo: "Espíritu Santo" }
    ];
    let texto = input.value;
    let cambio = false;
    let start = input.selectionStart;
    palabras.forEach(p => {
        if (texto.match(p.regex)) {
            texto = texto.replace(p.regex, p.reemplazo);
            cambio = true;
        }
    });
    if (cambio) { input.value = texto; input.setSelectionRange(start, start); }
}

function dividirTextoEnBloques(texto, maxChars) {
    let palabras = texto.split(" "), lineas = [], actual = "";
    palabras.forEach(palabra => {
        if ((actual + " " + palabra).trim().length <= maxChars) {
            actual = (actual + " " + palabra).trim();
        } else {
            if (actual) lineas.push(actual);
            actual = palabra;
        }
    });
    if (actual) lineas.push(actual);
    return lineas;
}

function ejecutarQueryUnica(book, cap, ver) {
    return bibleCache.find(r => r.bookId === book && r.chapter === cap && r.verse === ver) || null;
}

// ============================================
// CONSTRUCCIÓN DE CITAS
// ============================================

function construirCitaFormateadaExigida() {
    if (!controlCitaDinamica.libroName) return "";
    let cuerpo = controlCitaDinamica.libroName + " ";
    if (controlCitaDinamica.esCapitulosPuros) {
        cuerpo += controlCitaDinamica.capitulosLista.join(", ");
        return `${cuerpo} (${currentVersionKey})`;
    }
    if (controlCitaDinamica.anexosAnteriores.length > 0) {
        let anexos = controlCitaDinamica.anexosAnteriores.map(a =>
            a.vMin === a.vMax ? `${controlCitaDinamica.libroName} ${a.cap}:${a.vMin}` :
                                `${controlCitaDinamica.libroName} ${a.cap}:${a.vMin}-${a.vMax}`
        );
        cuerpo = anexos.join(", ") + ", " + controlCitaDinamica.libroName + " ";
    }
    if (controlCitaDinamica.esDiscontinuo) {
        let chunks = [], i = 0, vList = controlCitaDinamica.versiculosListaPlana;
        while (i < vList.length) {
            let start = vList[i], end = start;
            while (i + 1 < vList.length && vList[i + 1] === end + 1) { end = vList[i + 1]; i++; }
            chunks.push(start === end ? start : `${start}-${end}`);
            i++;
        }
        cuerpo += `${controlCitaDinamica.capituloInicial}:${chunks.join(', ')}`;
    } else {
        if (controlCitaDinamica.capituloInicial === controlCitaDinamica.capituloFinal) {
            cuerpo += controlCitaDinamica.capituloInicial;
            if (controlCitaDinamica.versiculoInicial !== null) {
                cuerpo += (controlCitaDinamica.versiculoInicial === controlCitaDinamica.versiculoFinal) ?
                    ":" + controlCitaDinamica.versiculoInicial :
                    ":" + controlCitaDinamica.versiculoInicial + "-" + controlCitaDinamica.versiculoFinal;
            }
        } else {
            cuerpo += `${controlCitaDinamica.capituloInicial}:${controlCitaDinamica.versiculoInicial}-${controlCitaDinamica.capituloFinal}:${controlCitaDinamica.versiculoFinal}`;
        }
    }
    return `${cuerpo} (${currentVersionKey})`;
}

// ============================================
// BÚSQUEDA Y PROCESAMIENTO
// ============================================

if (txtSmartSearch) {
    txtSmartSearch.onclick = function() { /*this.select(); */};
    
    txtSmartSearch.addEventListener('keyup', function(e) {
        if (e.key === "Enter") { 
            // Limpiamos los temporizadores si el usuario presiona Enter para forzar la búsqueda
            clearTimeout(timerBusqueda); 
            if (window.timerFormato) clearTimeout(window.timerFormato);
            procesarBusquedaInmediata(true); 
        }
    });
    
    txtSmartSearch.addEventListener('input', function() {
        ejecutarAutocorrecciónSagrada(this);
        
        // 1. Limpiamos cualquier temporizador previo (núcleo del debounce)
        clearTimeout(timerBusqueda);
        if (window.timerFormato) clearTimeout(window.timerFormato);
        
        // 2. Programamos la búsqueda para que se ejecute solo si pasan 250ms sin escribir
        timerBusqueda = setTimeout(() => {
            procesarBusquedaInmediata(false); // Realiza la búsqueda
            
            // 3. Mantenemos el auto-formateo visual original tras 2 segundos de inactividad
            // (Sumamos 1750ms a los 250ms que ya pasaron para dar el total de 2000ms originales)
            if (this.value.trim().match(/[0-9]+/)) {
                window.timerFormato = setTimeout(() => procesarBusquedaInmediata(true), 1750);
            }
        }, 250);
    });
}

function procesarBusquedaInmediata(actualizarCaja = false) {
    if (!txtSmartSearch) return;
    const query = txtSmartSearch.value.trim();
    if (query.length < 2 || bibleCache.length === 0) return;
    let queryEstandar = query.replace(/\.([0-9]+)/g, ":$1");

    if (queryEstandar.match(/[0-9]+/)) {
        const parts = queryEstandar.match(/^([1-3]?\s*[a-zA-ZáéíóúÁÉÍÓÚñÑ]+)\s*(.*)/);
        if (!parts) return;
        const libroBuscadoNorm = normalizarTexto(parts[1]);
        const stringNumeros = parts[2].trim();
        const segmentado = stringNumeros.match(/^([0-9\s,]+)(?:[:.;]\s*(.*))?/);
        controlCitaDinamica = { libroName: "", esCapitulosPuros: false, capitulosLista: [], capituloInicial: null, capituloFinal: null, esDiscontinuo: false, versiculosListaPlana: [], versiculoInicial: null, versiculoFinal: null, anexosAnteriores: [] };
        let capitulosSQL = [], versiculosFinales = [];

        if (segmentado) {
            const capRaw = segmentado[1], verRaw = segmentado[2];
            if (!verRaw) {
                capitulosSQL = capRaw.split(',').map(c => parseInt(c.trim())).filter(c => !isNaN(c));
                controlCitaDinamica.esCapitulosPuros = true;
                controlCitaDinamica.capitulosLista = capitulosSQL;
                if (capitulosSQL.length > 0) {
                    controlCitaDinamica.capituloInicial = capitulosSQL[0];
                    controlCitaDinamica.capituloFinal = capitulosSQL[capitulosSQL.length - 1];
                }
            } else {
                const capituloUnico = parseInt(capRaw.trim());
                controlCitaDinamica.capituloInicial = capituloUnico;
                controlCitaDinamica.capituloFinal = capituloUnico;
                let fragmentos = verRaw.split(',');
                if (fragmentos.length > 1) controlCitaDinamica.esDiscontinuo = true;
                fragmentos.forEach(frag => {
                    frag = frag.trim();
                    if (frag.includes('-')) {
                        const rango = frag.split('-');
                        const inicio = parseInt(rango[0].trim()), fin = parseInt(rango[1].trim());
                        if (!isNaN(inicio) && !isNaN(fin)) {
                            if (controlCitaDinamica.versiculoInicial === null || inicio < controlCitaDinamica.versiculoInicial)
                                controlCitaDinamica.versiculoInicial = inicio;
                            if (controlCitaDinamica.versiculoFinal === null || fin > controlCitaDinamica.versiculoFinal)
                                controlCitaDinamica.versiculoFinal = fin;
                            for (let i = inicio; i <= fin; i++) {
                                if (!versiculosFinales.includes(i)) versiculosFinales.push(i);
                                if (!controlCitaDinamica.versiculosListaPlana.includes(i))
                                    controlCitaDinamica.versiculosListaPlana.push(i);
                            }
                        }
                    } else {
                        const v = parseInt(frag);
                        if (!isNaN(v)) {
                            if (controlCitaDinamica.versiculoInicial === null || v < controlCitaDinamica.versiculoInicial)
                                controlCitaDinamica.versiculoInicial = v;
                            if (controlCitaDinamica.versiculoFinal === null || v > controlCitaDinamica.versiculoFinal)
                                controlCitaDinamica.versiculoFinal = v;
                            if (!versiculosFinales.includes(v)) versiculosFinales.push(v);
                            if (!controlCitaDinamica.versiculosListaPlana.includes(v))
                                controlCitaDinamica.versiculosListaPlana.push(v);
                        }
                    }
                });
            }
        }

        let filtrados = bibleCache.filter(row => {
            const nombreNorm = normalizarTexto(row.libroName);
            if (!nombreNorm.includes(libroBuscadoNorm)) return false;
            if (!/^[1-3]/.test(libroBuscadoNorm) && /^[1-3]/.test(nombreNorm)) return false;
            controlCitaDinamica.libroName = row.libroName;
            return controlCitaDinamica.esCapitulosPuros ?
                capitulosSQL.includes(row.chapter) :
                (row.chapter === controlCitaDinamica.capituloInicial && versiculosFinales.includes(row.verse));
        });

        if (controlCitaDinamica.esDiscontinuo && filtrados.length > 0) {
            let ordenados = [];
            controlCitaDinamica.versiculosListaPlana.forEach(vNum => {
                filtrados.filter(v => v.verse === vNum).forEach(m => ordenados.push(m));
            });
            filtrados = ordenados;
        }
        filtrarYRenderizarDesdeCache(filtrados);
        if (controlCitaDinamica.libroName && actualizarCaja) {
            txtSmartSearch.value = construirCitaFormateadaExigida().replace(` (${currentVersionKey})`, "");
        }
    } else {
        if (query.length < 3) return;
        controlCitaDinamica = { libroName: "", esCapitulosPuros: false, capitulosLista: [], capituloInicial: null, capituloFinal: null, esDiscontinuo: false, versiculosListaPlana: [], versiculoInicial: null, versiculoFinal: null, anexosAnteriores: [] };
        const frags = query.split(/\s+/);
        const incluir = [], excluir = [];
        frags.forEach(f => {
            if (f.startsWith('-') && f.length > 1) excluir.push(normalizarTexto(f.substring(1)));
            else if (f.length >= 2) incluir.push(normalizarTexto(f));
        });
        if (incluir.length === 0) return;
        const filtrados = bibleCache.filter(row =>
            incluir.every(p => row.textoNorm.includes(p)) &&
            !excluir.some(p => row.textoNorm.includes(p))
        ).slice(0, 250);
        filtrarYRenderizarDesdeCache(filtrados);
    }
}

// ============================================
// RENDERIZADO
// ============================================

function filtrarYRenderizarDesdeCache(rows) {
    listaVersiculosActuales = [];
    indicesSeleccionados = []; // NUEVO: Limpiar selección anterior
    const maxChars = slideSplitLength ? parseInt(slideSplitLength.value) : 70;
    const debePartir = chkSplitVerse && chkSplitVerse.checked;
    rows.forEach(row => {
        if (debePartir && row.textoLimpio.length > maxChars) {
            const bloques = dividirTextoEnBloques(row.textoLimpio, maxChars);
            const letras = "abcdefghijklmnopqrstuvwxyz";
            bloques.forEach((bloque, idx) => {
                listaVersiculosActuales.push({
                    bookId: row.bookId, chapter: row.chapter, verse: row.verse,
                    libroName: row.libroName, sufijo: letras[idx] || `_${idx}`, texto: bloque
                });
            });
        } else {
            listaVersiculosActuales.push({
                bookId: row.bookId, chapter: row.chapter, verse: row.verse,
                libroName: row.libroName, sufijo: "", texto: row.textoLimpio
            });
        }
    });
    pintarListaDOM();
}

function pintarListaDOM() {
    if (!resultsContainer) return;
    resultsContainer.innerHTML = "";
    const total = listaVersiculosActuales.length;
    if (lblCount) lblCount.innerText = `ENCONTRADOS (${total} ${total === 1 ? "versículo" : "versículos"})`;
    listaVersiculosActuales.forEach((v, i) => {
        const div = document.createElement('div');
        div.className = "verse-item";
        div.id = "vItem_" + i;
        div.innerHTML = `<strong>${v.libroName} ${v.chapter}:${v.verse}${v.sufijo}</strong><br><span class="v-text">${v.texto}</span>`;
        //div.onclick = () => ProyectarPorIndex(i);
        div.onclick = (e) => manejarClickVersiculo(e, i);
        resultsContainer.appendChild(div);
    });
    if (total === 0) resultsContainer.innerHTML = `<div style="padding:20px;text-align:center;color:var(--text-muted)">Sin resultados.</div>`;
}

// ============================================
// PROYECCIÓN
// ============================================
// ============================================
// PROYECCIÓN (ACTUALIZADO MULTI-SELECCIÓN)
// ============================================

function manejarClickVersiculo(e, index) {
    if (e.shiftKey) {
    
    // EVITAR QUE EL TEXTO SE SELECCIONE (SOMBRERO AZUL)
        window.getSelection().removeAllRanges();
        // Modo multi-selección
        const pos = indicesSeleccionados.indexOf(index);
        if (pos > -1) {
            indicesSeleccionados.splice(pos, 1); // Deseleccionar si ya estaba
        } else {
            indicesSeleccionados.push(index); // Agregar a la selección
        }
        // Ordenar para mantener la coherencia cronológica de la lectura
        indicesSeleccionados.sort((a, b) => a - b);
    } else {
        // Selección normal (clic simple)
        indicesSeleccionados = [index];
    }

    actualizarClasesUI();

    if (indicesSeleccionados.length > 0) {
        ProyectarSeleccionMultiple();
    } else {
        window.limpiarProyeccion();
    }
}

function ProyectarPorIndex(index) {
    // Esta función se mantiene para atajos de teclado (flechas)
    if (index < 0 || index >= listaVersiculosActuales.length) return;
    indicesSeleccionados = [index];
    actualizarClasesUI();
    
    const target = document.getElementById("vItem_" + index);
    if (target) {
        target.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
    }
    
    ProyectarSeleccionMultiple();
}

function actualizarClasesUI() {
    document.querySelectorAll('.verse-item').forEach((el, i) => {
        if (indicesSeleccionados.includes(i)) {
            el.classList.add('active');
        } else {
            el.classList.remove('active');
        }
    });
}

function ProyectarSeleccionMultiple() {
    if (indicesSeleccionados.length === 0) return;

    let textoProyectar = "";
    let primerItem = listaVersiculosActuales[indicesSeleccionados[0]];
    let ultimoItem = listaVersiculosActuales[indicesSeleccionados[indicesSeleccionados.length - 1]];

    // Concatenar textos con sus indicadores
    indicesSeleccionados.forEach(idx => {
        const item = listaVersiculosActuales[idx];
        textoProyectar += `<span class="v-num-sup">${item.verse}${item.sufijo}</span>${item.texto} `;
    });

    // Construcción de la referencia dinámica
    let ref;
    if (indicesSeleccionados.length === 1) {
        ref = controlCitaDinamica.libroName
            ? construirCitaFormateadaExigida()
            : `${primerItem.libroName} ${primerItem.chapter}:${primerItem.verse} (${currentVersionKey})`;
    } else {
        // Referencia para múltiples versículos seleccionados
        const mismoLibro = primerItem.libroName === ultimoItem.libroName;
        const mismoCap = primerItem.chapter === ultimoItem.chapter;

        if (mismoLibro && mismoCap) {
            ref = `${primerItem.libroName} ${primerItem.chapter}:${primerItem.verse}-${ultimoItem.verse} (${currentVersionKey})`;
        } else {
            ref = `${primerItem.libroName} ${primerItem.chapter}:${primerItem.verse} - ${ultimoItem.libroName} ${ultimoItem.chapter}:${ultimoItem.verse} (${currentVersionKey})`;
        }
    }

    window.proyectarTexto(textoProyectar.trim(), ref, window.savedBibleFontSize);
}

function obtenerIndexActivo() {
    // Si hay selección múltiple, toma el último para que la flecha hacia abajo seleccione el siguiente correctamenete
    return indicesSeleccionados.length > 0 ? indicesSeleccionados[indicesSeleccionados.length - 1] : -1;
}
function ProyectarPorIndexFuncional(index) {
    if (index < 0 || index >= listaVersiculosActuales.length) return;

    document.querySelectorAll('.verse-item').forEach(i => i.classList.remove('active'));

    const target = document.getElementById("vItem_" + index);
    if (target) {
        target.classList.add('active');
        target.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
    }

    const item = listaVersiculosActuales[index];

    const txtOriginal =
        `<span class="v-num-sup">${item.verse}${item.sufijo}</span>${item.texto}`;

    const ref = controlCitaDinamica.libroName
        ? construirCitaFormateadaExigida()
        : `${item.libroName} ${item.chapter}:${item.verse} (${currentVersionKey})`;

    window.proyectarTexto(txtOriginal, ref, window.savedBibleFontSize);
}

function obtenerIndexActivo() {
    const active = document.querySelector('.verse-item.active');
    return active ? parseInt(active.id.split("_")[1]) : -1;
}

// ============================================
// NAVEGACIÓN ANTERIOR / SIGUIENTE
// ============================================

function agregarAnterior(conEnfoque = false) {
    if (listaVersiculosActuales.length === 0) return;
    const pivot = listaVersiculosActuales[0];
    let vPrev = pivot.verse - 1, cPrev = pivot.chapter, bPrev = pivot.bookId;
    if (vPrev < 1) {
        cPrev = pivot.chapter - 1;
        if (cPrev < 1) return;
        const versiculosCap = bibleCache.filter(r => r.bookId === bPrev && r.chapter === cPrev);
        vPrev = versiculosCap.length > 0 ? Math.max(...versiculosCap.map(r => r.verse)) : 1;
    }
    const nuevo = ejecutarQueryUnica(bPrev, cPrev, vPrev);
    if (nuevo) {
        actualizarControlCita(nuevo, "anterior");
        agregarVersiculoALista(nuevo, "anterior");
        pintarListaDOM();
        if (conEnfoque) {
            document.querySelectorAll('.verse-item').forEach(i => i.classList.remove('active'));
            const target = document.getElementById("vItem_0");
            if (target) { target.classList.add('active'); target.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); }
        } else {
            const idx = obtenerIndexActivo();
            if (idx !== -1) document.getElementById("vItem_" + (idx + 1))?.classList.add('active');
        }
    }
}

function agregarSiguiente(conEnfoque = false) {
    if (listaVersiculosActuales.length === 0) return;
    const pivot = listaVersiculosActuales[listaVersiculosActuales.length - 1];
    let vNext = pivot.verse + 1, cNext = pivot.chapter, bNext = pivot.bookId;
    let nuevo = ejecutarQueryUnica(bNext, cNext, vNext);
    if (!nuevo) { cNext = pivot.chapter + 1; vNext = 1; nuevo = ejecutarQueryUnica(bNext, cNext, vNext); }
    if (nuevo) {
        actualizarControlCita(nuevo, "siguiente");
        agregarVersiculoALista(nuevo, "siguiente");
        pintarListaDOM();
        if (conEnfoque) {
            document.querySelectorAll('.verse-item').forEach(i => i.classList.remove('active'));
            const lastIdx = listaVersiculosActuales.length - 1;
            const target = document.getElementById("vItem_" + lastIdx);
            if (target) { target.classList.add('active'); target.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); }
        } else {
            const idx = obtenerIndexActivo();
            if (idx !== -1) document.getElementById("vItem_" + idx)?.classList.add('active');
        }
    }
}

function actualizarControlCita(nuevo, direccion) {
    if (!controlCitaDinamica.libroName) return;
    if (controlCitaDinamica.esCapitulosPuros || controlCitaDinamica.esDiscontinuo) {
        controlCitaDinamica.esCapitulosPuros = false;
        controlCitaDinamica.esDiscontinuo = false;
        controlCitaDinamica.capituloInicial = nuevo.chapter;
        controlCitaDinamica.capituloFinal = nuevo.chapter;
        controlCitaDinamica.versiculoInicial = nuevo.verse;
        controlCitaDinamica.versiculoFinal = nuevo.verse;
        return;
    }
    if (direccion === "anterior") {
        if (nuevo.chapter < controlCitaDinamica.capituloInicial) {
            let anexo = controlCitaDinamica.anexosAnteriores.find(a => a.cap === nuevo.chapter);
            if (anexo) {
                if (nuevo.verse < anexo.vMin) anexo.vMin = nuevo.verse;
                if (nuevo.verse > anexo.vMax) anexo.vMax = nuevo.verse;
            } else {
                controlCitaDinamica.anexosAnteriores.unshift({ cap: nuevo.chapter, vMin: nuevo.verse, vMax: nuevo.verse });
            }
        } else if (nuevo.chapter === controlCitaDinamica.capituloInicial) {
            if (nuevo.verse < controlCitaDinamica.versiculoInicial)
                controlCitaDinamica.versiculoInicial = nuevo.verse;
        }
    } else {
        if (nuevo.chapter > controlCitaDinamica.capituloFinal) {
            controlCitaDinamica.capituloFinal = nuevo.chapter;
            controlCitaDinamica.versiculoFinal = nuevo.verse;
        } else if (nuevo.chapter === controlCitaDinamica.capituloFinal) {
            if (controlCitaDinamica.versiculoFinal === null || nuevo.verse > controlCitaDinamica.versiculoFinal)
                controlCitaDinamica.versiculoFinal = nuevo.verse;
        }
    }
    if (txtSmartSearch) {
        txtSmartSearch.value = construirCitaFormateadaExigida().replace(` (${currentVersionKey})`, "");
    }
}

function agregarVersiculoALista(nuevo, direccion) {
    const maxChars = slideSplitLength ? parseInt(slideSplitLength.value) : 70;
    const debePartir = chkSplitVerse && chkSplitVerse.checked;
    const letras = "abcdefghijklmnopqrstuvwxyz";
    const crear = (texto, sufijo) => ({
        bookId: nuevo.bookId, chapter: nuevo.chapter, verse: nuevo.verse,
        libroName: nuevo.libroName, sufijo: sufijo, texto: texto
    });
    if (debePartir && nuevo.textoLimpio.length > maxChars) {
        const bloques = dividirTextoEnBloques(nuevo.textoLimpio, maxChars);
        if (direccion === "anterior") {
            for (let i = bloques.length - 1; i >= 0; i--) {
                listaVersiculosActuales.unshift(crear(bloques[i], letras[i] || `_${i}`));
            }
        } else {
            bloques.forEach((b, idx) => listaVersiculosActuales.push(crear(b, letras[idx] || `_${idx}`)));
        }
    } else {
        if (direccion === "anterior") listaVersiculosActuales.unshift(crear(nuevo.textoLimpio, ""));
        else listaVersiculosActuales.push(crear(nuevo.textoLimpio, ""));
    }
}

if (btnPrevVerseReplica) btnPrevVerseReplica.onclick = () => agregarAnterior(true);
if (btnNextVerseReplica) btnNextVerseReplica.onclick = () => agregarSiguiente(true);

// ============================================
// GESTOS TÁCTILES
// ============================================

function inicializarGestosTactilesResultados() {
    if (!resultsContainer) return;
    let startY = 0, currentY = 0, tracking = false;
    const LIMIT = 80;
    resultsContainer.addEventListener('touchstart', function(e) {
        const bibleDiv = document.getElementById('bibleControls');
        if (bibleDiv && bibleDiv.style.display === 'none') return;
        if (e.touches.length !== 1) return;
        if (resultsContainer.scrollTop === 0 || Math.ceil(resultsContainer.scrollTop + resultsContainer.clientHeight) >= resultsContainer.scrollHeight) {
            startY = e.touches[0].clientY;
            tracking = true;
        }
    }, { passive: true });
    resultsContainer.addEventListener('touchmove', function(e) {
        const bibleDiv = document.getElementById('bibleControls');
        if (bibleDiv && bibleDiv.style.display === 'none') return;
        if (!tracking) return;
        currentY = e.touches[0].clientY;
        const diff = currentY - startY;
        const atTop = resultsContainer.scrollTop === 0;
        const atBottom = Math.ceil(resultsContainer.scrollTop + resultsContainer.clientHeight) >= resultsContainer.scrollHeight;
        if ((atTop && diff > 0) || (atBottom && diff < 0)) {
            if (e.cancelable) e.preventDefault();
        }
        if (atTop && diff > 0) {
            if (pullTopIndicator) { pullTopIndicator.style.display = "block"; pullTopIndicator.style.opacity = Math.min(diff / LIMIT, 1); }
        } else if (atBottom && diff < 0) {
            if (pullBottomIndicator) { pullBottomIndicator.style.display = "block"; pullBottomIndicator.style.opacity = Math.min(Math.abs(diff) / LIMIT, 1); }
        } else {
            if (pullTopIndicator) pullTopIndicator.style.display = "none";
            if (pullBottomIndicator) pullBottomIndicator.style.display = "none";
        }
    }, { passive: false });
    resultsContainer.addEventListener('touchend', function() {
        const bibleDiv = document.getElementById('bibleControls');
        if (bibleDiv && bibleDiv.style.display === 'none') return;
        if (!tracking) return;
        tracking = false;
        const diff = currentY - startY;
        if (resultsContainer.scrollTop === 0 && diff >= LIMIT) agregarAnterior(true);
        else if (Math.ceil(resultsContainer.scrollTop + resultsContainer.clientHeight) >= resultsContainer.scrollHeight && diff <= -LIMIT) agregarSiguiente(true);
        if (pullTopIndicator) pullTopIndicator.style.display = "none";
        if (pullBottomIndicator) pullBottomIndicator.style.display = "none";
    }, { passive: true });
}

// ============================================
// MENÚ DE NAVEGACIÓN
// ============================================

function configurarManejadoresMenuNav() {
    if (!btnNavMenu || !navDropdownMenu || !btnNavBack) return;
    btnNavMenu.onclick = function(e) {
        e.stopPropagation();
        navDropdownMenu.style.display = navDropdownMenu.style.display === "flex" ? "none" : "flex";
        if (navDropdownMenu.style.display === "flex") renderizarFaseMenu("books");
    };
    btnNavBack.onclick = function(e) {
        e.stopPropagation();
        if (navState.phase === "chapters") renderizarFaseMenu("books");
        else if (navState.phase === "verses") renderizarFaseMenu("chapters");
    };
    document.addEventListener('click', () => navDropdownMenu.style.display = "none");
    navDropdownMenu.onclick = e => e.stopPropagation();
}

function renderizarFaseMenu(fase) {
    if (!navDropdownList || !btnNavBack || !lblNavPhase) return;
    navState.phase = fase;
    navDropdownList.innerHTML = "";
    navDropdownList.scrollTop = 0;

    if (fase === "books") {
        btnNavBack.style.display = "none";
        lblNavPhase.innerText = "Seleccione Libro";
        let vistos = [];
        bibleCache.forEach(item => {
            if (!vistos.some(l => l.id === item.bookId)) vistos.push({ id: item.bookId, name: item.libroName });
        });
        vistos.forEach(lib => {
            const li = document.createElement('li');
            li.className = "nav-dropdown-item";
            li.innerText = `${lib.name} (${BOOK_METADATA[lib.id] || "AT"})`;
            li.onclick = function() {
                navState.selectedBookId = lib.id;
                navState.selectedBookName = lib.name;
                if (txtSmartSearch) txtSmartSearch.value = lib.name + " ";
                renderizarFaseMenu("chapters");
            };
            navDropdownList.appendChild(li);
        });
    } else if (fase === "chapters") {
        btnNavBack.style.display = "block";
        lblNavPhase.innerText = `${navState.selectedBookName} -> Capítulos`;
        let caps = [];
        bibleCache.forEach(item => {
            if (item.bookId === navState.selectedBookId && !caps.includes(item.chapter)) caps.push(item.chapter);
        });
        caps.sort((a, b) => a - b);
        caps.forEach(c => {
            const li = document.createElement('li');
            li.className = "nav-dropdown-item";
            li.innerText = `Cap. ${c}`;
            li.onclick = function() {
                navState.selectedChapter = c;
                if (txtSmartSearch) txtSmartSearch.value = `${navState.selectedBookName} ${c}:`;
                renderizarFaseMenu("verses");
            };
            navDropdownList.appendChild(li);
        });
    } else if (fase === "verses") {
        btnNavBack.style.display = "block";
        lblNavPhase.innerText = `${navState.selectedBookName} ${navState.selectedChapter} -> Versículos`;
        let vss = [];
        bibleCache.forEach(item => {
            if (item.bookId === navState.selectedBookId && item.chapter === navState.selectedChapter) vss.push(item.verse);
        });
        vss.sort((a, b) => a - b);
        vss.forEach(v => {
            const li = document.createElement('li');
            li.className = "nav-dropdown-item";
            li.innerText = `V. ${v}`;
            li.onclick = function() {
                if (txtSmartSearch) txtSmartSearch.value = `${navState.selectedBookName} ${navState.selectedChapter}:${v}`;
                if (navDropdownMenu) navDropdownMenu.style.display = "none";
                procesarBusquedaInmediata(false);
            };
            navDropdownList.appendChild(li);
        });
    }
}

// ============================================
// BOTÓN "X" PARA LIMPIAR BUSCADOR
// ============================================

const btnClearBibleSearch = document.getElementById('btnClearBibleSearch');
if (txtSmartSearch && btnClearBibleSearch) {
    txtSmartSearch.addEventListener('input', function() {
        btnClearBibleSearch.style.display = this.value.length > 0 ? 'block' : 'none';
    });
    btnClearBibleSearch.addEventListener('click', function() {
        txtSmartSearch.value = '';
        txtSmartSearch.dispatchEvent(new Event('input'));
        txtSmartSearch.focus();
        this.style.display = 'none';
    });
}

// ============================================
// ATALOS DE TECLADO
// ============================================

window.addEventListener('keydown', function(e) {
    const isBibleMode = document.getElementById('bibleControls') && document.getElementById('bibleControls').style.display !== 'none';
    if (!isBibleMode) return;

    const isTyping = e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA' || e.target.isContentEditable;
    if (isTyping && e.code !== 'Escape') return;

    if (e.code === 'Escape') {
        e.preventDefault();
        if (e.shiftKey) {
            window.cambiarFondoProyeccion(""); // Quitar fondo
        } else {
            window.limpiarProyeccion(); // Limpiar texto
        }
        return;
    }

    if (["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", "Space", "Spacebar"].includes(e.code) || e.key === " ") {
        e.preventDefault();
        const idx = obtenerIndexActivo();
        if ((e.code === "ArrowUp" || e.code === "ArrowLeft") && idx > 0) {
            ProyectarPorIndex(idx - 1);
        } else if ((e.code === "ArrowDown" || e.code === "ArrowRight" || e.key === " ") && idx < listaVersiculosActuales.length - 1) {
            ProyectarPorIndex(idx + 1);
        } else if (idx === -1 && listaVersiculosActuales.length > 0) {
            ProyectarPorIndex(0);
        }
    }
});

// ============================================
// INICIALIZACIÓN
// ============================================

init();
