// ====== notasdetexto.js ======
// Módulo de Notas de Texto - MicroBeam

const defaultNotes = [
    { id: 'n1', name: "Bienvenida", titleText: "Bienvenidos", titleAlign: "center", contentText: "**a  CASA**\n❤️  \n\n\nEsperamos que este tiempo sea de bendición para tu vida.", contentAlign: "center", contentCols: "1", footerText: "", footerAlign: "center", fontSize: 4.7 },
    { id: 'n2', name: "📖 Título y versículo central", titleText: "TÍTULO DE LA PRÉDICA", titleAlign: "center", contentText: "\n\n\nLibro 1:1\n\n\n", contentAlign: "center", contentCols: "1", footerText: "Pr. Nombre del Pastor", footerAlign: "center", fontSize: 4.6 },
    { id: 'n3', name: "📚 Versículos", titleText: "VERSÍCULOS DE LA PRÉDICA", titleAlign: "center", contentText: "SAMUEL 12:7\nJEREMIAS 29:11-13\nJUECES 21:25\n1 REYES 18:20-21\nSALMO 145,123\nNÚMEROS 13-14\n2 CORINTIOS 11:24-31\n2 TIMOTEO 4:8\nJUAN 20:24-25\nLUCAS 24:13-16\nLUCAS 24:5-6\nROMANOS 8:9,10\nMATEO 27:52\nJUAN 11:17-27,29\nJUAN 10:18\nSALMOS 59:3", contentAlign: "center", contentCols: "2", footerText: "Pr. Nombre del Pastor", footerAlign: "left", fontSize: 3.8 },
    { id: 'n4', name: "📖 Resumen", titleText: "EL PUEBLO DE ISRAEL EN MEDIO DE LAS CRISIS", titleAlign: "center", contentText: "PRIMERA CRISIS: Dios los sacó con poder de Egipto \n\\* pero *dudaron* cuando vieron gigantes \n\\* prefirieron *creer al miedo* y no a la promesa \n**Resultado **: 40 años dando vueltas en el desierto. \n> Hay crisis que no vienen del enemigo, si no de la incredulidad. Cuando dudamos, no sabemos si somos o no somos cristianos...\nSEGUNDA CRISIS : la duda  (1 reyes 18:20-21)..\n\n* El ciclo del pecado: Cuando Dios no gobierna el corazón, __el caos__ gobierna la nación.\n1.pecado, 2. opresión, 3. clamor, 4.liberación\n> La crisis no es el final del pueblo de Dios: es el escenario donde Dios muestra su fidelidad.\n\n", contentAlign: "left", contentCols: "1", footerText: "Svo. Nombre Completo del Predicador - SERVICIO DE AYUNO JUNIO DE 2026", footerAlign: "left", fontSize: 2.2 },
    { id: 'n5', name: "📖 Resumen (Pantalla panorámica)", titleText: "EL AMOR DE DIOS", titleAlign: "center", contentText: "**EL AMOR ETERNO DE DIOS**\n\nDios nos amó antes de que nosotros le buscáramos. (Jeremías 31:3)\nSu amor nace de Su propia naturaleza. (1 Juan 4:8)\nNo depende de nuestros méritos sino de Su gracia. (Efesios 2:4-5)\nDesde la creación ha mostrado Su bondad hacia la humanidad. (Salmo 136:1)\nSu misericordia se renueva cada mañana. (Lamentaciones 3:22-23)\n\n:::**EL AMOR REVELADO EN CRISTO**\n\nJesús es la mayor demostración del amor del Padre. (Juan 3:16)\nCristo entregó voluntariamente Su vida por nosotros. (Romanos 5:8)\nEn la cruz encontramos perdón y reconciliación. (Colosenses 1:20)\nSu sacrificio abrió el camino hacia Dios. (Hebreos 10:19-22)\nLa salvación es un regalo de gracia. (Efesios 2:8-9)\nEn Cristo recibimos nueva vida. (2 Corintios 5:17)\n\n:::**EL AMOR QUE TRANSFORMA NUESTRA VIDA**\n\nEl amor de Dios cambia nuestro corazón. (Ezequiel 36:26)\nNos llama a vivir en santidad. (1 Pedro 1:15-16)\nAprendemos a perdonar como Él nos perdonó. (Efesios 4:32)\nEl orgullo da paso a la humildad. (Filipenses 2:3-5)\nEl Espíritu Santo produce fruto en nosotros. (Gálatas 5:22-23)\nToda transformación glorifica a Dios. (Romanos 12:1-2)\n\n:::**AMAR A DIOS Y AL PRÓJIMO**\n\nEl mayor mandamiento es amar a Dios. (Mateo 22:37)\nEl segundo es amar al prójimo. (Mateo 22:39)\nEl amor identifica a los discípulos de Cristo. (Juan 13:34-35)\nDebemos amar con hechos y en verdad. (1 Juan 3:18)\nEl servicio expresa el amor cristiano. (Gálatas 5:13)\n\n:::**PERMANECER EN EL AMOR DE DIOS**\n\nPermanecer en Cristo produce fruto. (Juan 15:4-5)\nLa oración fortalece nuestra comunión con Dios. (1 Tesalonicenses 5:17)\nLa Palabra alimenta nuestra fe. (2 Timoteo 3:16-17)\nLa adoración acerca nuestro corazón al Señor. (Salmo 95:1-2)\nLa obediencia trae bendición. (Juan 15:10)\nDebemos perseverar hasta el fin. (Mateo 24:13)\n\n:::**LA ESPERANZA DEL AMOR ETERNO**\n\nDios ha preparado una herencia para Sus hijos. (1 Pedro 1:3-4)\nNuestra ciudadanía está en los cielos. (Filipenses 3:20)\nCristo volverá por Su iglesia. (Juan 14:1-3)\nViviremos para siempre en Su presencia. (Apocalipsis 21:3-4)\nYa no habrá dolor ni muerte. (Apocalipsis 21:4)\nToda lágrima será enjugada. (Apocalipsis 21:4)\nEl Señor hará nuevas todas las cosas. (Apocalipsis 21:5)", contentAlign: "left", contentCols: "6", footerText: "Svo. Nombre Completo del Predicador", footerAlign: "right", fontSize: 1 },
    { id: 'n6', name: "❤️ TESTIMONIOS", titleText: "TESTIMONIOS DEL AMOR DE DIOS", titleAlign: "center", contentText: "\n\nEste es un espacio para dar gloria a Dios\npor su fidelidad y sus bondades.\n\nPuedes compartir un testimonio breve.\n\n", contentAlign: "center", contentCols: "1", footerText: "Jesucristo es el Señor", footerAlign: "center", fontSize: 4.1 },
    { id: 'n7', name: "Avisos varios", titleText: "ATENCIÓN", titleAlign: "center", contentText: "Propietario(a) del\nvehículo de placas __________:\n\nPor favor verificar el estado de su vehículo\nen el parqueadero.\n\n", contentAlign: "center", contentCols: "1", footerText: "SERVICIO SOCIAL", footerAlign: "center", fontSize: 4.3 },
    { id: 'n8', name: "Anuncio Escuela Bíblica", titleText: "👧 Escuela Bíblica (KIDS)", titleAlign: "center", contentText: "\nLos niños pueden dirigirse\na la Escuela Bíblica.\n\nNuestros servidores ya están preparados para darles un mensaje de parte de Dios en su lenguaje.\n\n", contentAlign: "center", contentCols: "1", footerText: "Salón 4 - Sótano de la congregación", footerAlign: "right", fontSize: 4.0 },
    { id: 'n9', name: "Ejemplos de Formato", titleText: "NOTACION ESPECIAL PARA FORMATO DE TEXTO", titleAlign: "right", contentText: "__La notación sirve solo en el área de *Contenido*__\n\n**Dios es bueno** para que salga en Negrilla.\n\n __Amén__ para que salga Subrayado.\n\n*Aleluya* para que salga en Cursiva.\n\n~~pecado~~ para que salga Tachado.\n\n> El Señor es mi pastor .... **(Salmos 23)** para generar un bloque de cita elegante \n\n::: : : : para forzar que el texto salte a la siguiente columna (ideal  en 2 o más columnas).\n\n1^er^ lugar para superíndices (y=x^2^ es una parábola)\n\nH~2~O para subíndices.\n\nDoble =: == Esto es importante== para resaltar el texto.", contentAlign: "left", contentCols: "2", footerText: "Sede Central - Todos los derechos reservados (R) 2026", footerAlign: "left", fontSize: 2.4 }
];

let notesData = [];
let activeNoteId = null;

// Referencias DOM principales
const btnModeNotes = document.getElementById('btnModeNotes');
const notesControls = document.getElementById('notesControls');
const noteEditorContainer = document.getElementById('noteEditorContainer');
const notesListUI = document.getElementById('notesList');
//const slideFontSize = document.getElementById('slideFontSize');
const lblFontSize = document.getElementById('valFontSize'); // <-- Corregido el ID según tu HTML

// Referencias del Editor
const txtTitle = document.getElementById('txtNoteTitle');
const txtContent = document.getElementById('txtNoteContent');
const txtFooter = document.getElementById('txtNoteFooter');
const selCols = document.getElementById('selNoteColumns');
const alignButtons = document.querySelectorAll('.align-btn');

function initNotesMode() {
    loadNotesFromStorage();
    renderNotesList();
    if (notesData.length > 0) selectNote(notesData[0].id);
}

function loadNotesFromStorage() {
    const saved = localStorage.getItem('microbeam_notes');
    if (saved) {
        try { notesData = JSON.parse(saved); } catch(e) { notesData = [...defaultNotes]; }
        // Migración por si hay notas viejas sin 'name'
        notesData.forEach(n => { if (!n.name) n.name = n.titleText || "Nueva Nota"; });
    } else {
        notesData = JSON.parse(JSON.stringify(defaultNotes));
    }
}

function saveNotesToStorage() {
    localStorage.setItem('microbeam_notes', JSON.stringify(notesData));
}

function renderNotesList() {
    notesListUI.innerHTML = "";
    notesData.forEach((note, index) => {
        const li = document.createElement('li');
        li.className = `note-item ${note.id === activeNoteId ? 'active' : ''}`;
        li.draggable = true;
        li.dataset.id = note.id;
        li.dataset.index = index;
        
        // Contenedor del nombre de la nota editable con doble clic
        const nameSpan = document.createElement('span');
        nameSpan.style.cssText = "overflow:hidden; text-overflow:ellipsis; white-space:nowrap; flex:1;";
        nameSpan.textContent = note.name || "Sin nombre";
        nameSpan.title = "Doble clic para editar nombre";
        
        nameSpan.addEventListener('dblclick', (e) => {
            e.stopPropagation();
            const input = document.createElement('input');
            input.type = "text";
            input.value = note.name;
            input.style.cssText = "width:100%; background:#26262b; color:white; border:1px solid var(--accent); padding:2px; border-radius:3px;";
            
            const saveName = () => {
                note.name = input.value.trim() || "Sin nombre";
                saveNotesToStorage();
                renderNotesList();
            };
            
            input.addEventListener('blur', saveName);
            input.addEventListener('keydown', (ek) => { if(ek.key === 'Enter') saveName(); });
            
            li.replaceChild(input, nameSpan);
            input.focus();
            input.select();
        });

        li.appendChild(nameSpan);
        /*li.onclick = (e) => {
            if(e.target.tagName !== 'INPUT') selectNote(note.id);
        };*/
        
                li.onclick = function(e) {
    if (e.shiftKey) {
        // Seleccionar la nota
        selectNote(note.id);
        // Proyectarla inmediatamente
        projectCurrentNote(); 
    } else {
        selectNote(note.id);
    }
};
        
        // Eventos Drag & Drop
        li.addEventListener('dragstart', (e) => { e.dataTransfer.setData('text/plain', index); li.style.opacity = '0.5'; });
        li.addEventListener('dragend', () => li.style.opacity = '1');
        li.addEventListener('dragover', (e) => { e.preventDefault(); li.style.borderTop = '2px solid var(--accent)'; });
        li.addEventListener('dragleave', () => li.style.borderTop = '');
        li.addEventListener('drop', (e) => {
            e.preventDefault();
            li.style.borderTop = '';
            const draggedIdx = parseInt(e.dataTransfer.getData('text/plain'));
            const targetIdx = index;
            if (draggedIdx !== targetIdx && !isNaN(draggedIdx)) {
                const movedItem = notesData.splice(draggedIdx, 1)[0];
                notesData.splice(targetIdx, 0, movedItem);
                saveNotesToStorage();
                renderNotesList();
            }
        });
        
        notesListUI.appendChild(li);
    });
}

function selectNote(id) {
    activeNoteId = id;
    const note = notesData.find(n => n.id === id);
    if (!note) return;
    
    // Textos
    txtTitle.value = note.titleText;
    txtContent.value = note.contentText;
    txtFooter.value = note.footerText;
    selCols.value = note.contentCols;
    
    // Aplicar Alineación Visual tanto en botones como dentro del campo de texto
    updateAlignUI('title', note.titleAlign);
    updateAlignUI('content', note.contentAlign);
    updateAlignUI('footer', note.footerAlign);
    
    // Sincronizar UI del Tamaño de Fuente específico de esta nota
    if (slideFontSize && lblFontSize) {
        slideFontSize.value = note.fontSize;
        lblFontSize.innerText = parseFloat(note.fontSize).toFixed(1) + "vw";
        
        // ❌ SE ELIMINÓ EL ENVÍO AUTOMÁTICO (postMessage) AL PROYECTOR AQUÍ
        // Para evitar que altere la proyección en vivo de otros módulos (Biblia/Canciones).
        // El tamaño solo se aplicará al dar clic en "Proyectar Nota" o al mover el slider manualmente.
    }
    
    // Refrescar estado visual de la lista
    document.querySelectorAll('.note-item').forEach(li => {
        li.classList.toggle('active', li.dataset.id === id);
    });
}

// Función que controla la apariencia de los botones y la justificación real del texto
function updateAlignUI(target, alignValue) {
    document.querySelectorAll(`.align-btn[data-target="${target}"]`).forEach(btn => {
        btn.classList.toggle('active', btn.dataset.align === alignValue);
    });
    
    if (target === 'title') txtTitle.style.textAlign = alignValue;
    if (target === 'content') txtContent.style.textAlign = alignValue;
    if (target === 'footer') txtFooter.style.textAlign = alignValue;
}

// Autoguardado al escribir o cambiar columnas
[txtTitle, txtContent, txtFooter, selCols].forEach(el => {
    el.addEventListener('input', () => {
        const note = notesData.find(n => n.id === activeNoteId);
        if (note) {
            note.titleText = txtTitle.value;
            note.contentText = txtContent.value;
            note.footerText = txtFooter.value;
            note.contentCols = selCols.value;
            saveNotesToStorage();
        }
    });
});

// Clics en los botones de alineación
alignButtons.forEach(btn => {
    btn.addEventListener('click', function() {
        const target = this.dataset.target;
        const align = this.dataset.align;
        updateAlignUI(target, align);
        
        const note = notesData.find(n => n.id === activeNoteId);
        if (note) {
            if (target === 'title') note.titleAlign = align;
            if (target === 'content') note.contentAlign = align;
            if (target === 'footer') note.footerAlign = align;
            saveNotesToStorage();
        }
    });
});

// Autoguardar tamaño de fuente para cada nota
if (slideFontSize) {
    slideFontSize.addEventListener('input', (e) => {
        if (document.getElementById('btnModeNotes').classList.contains('active')) {
            const note = notesData.find(n => n.id === activeNoteId);
            if (note) {
                note.fontSize = parseFloat(e.target.value);
                saveNotesToStorage();
            }
        }
    });
}

// Nuevo / Eliminar
// Nuevo / Eliminar
document.getElementById('btnAddNote').addEventListener('click', () => {
    const newId = 'n' + Date.now();
    const newNote = {
        id: newId, name: "Nueva Nota", titleText: "", titleAlign: "center",
        contentText: "", contentAlign: "center", contentCols: "1",
        footerText: "", footerAlign: "center", fontSize: 7.0
    };

    // Buscar el índice de la nota que está seleccionada actualmente
    const activeIndex = notesData.findIndex(n => n.id === activeNoteId);
    
    if (activeIndex !== -1) {
        // Insertar la nueva nota justo en la posición siguiente (debajo)
        notesData.splice(activeIndex + 1, 0, newNote);
    } else {
        // Si por alguna razón no hay ninguna seleccionada, la añade al final
        notesData.push(newNote);
    }

    saveNotesToStorage();
    renderNotesList();
    selectNote(newId);
});

document.getElementById('btnDeleteNote').addEventListener('click', () => {
    if (!activeNoteId) return;
    const note = notesData.find(n => n.id === activeNoteId);
    
    // Mensaje de confirmación personalizado con el nombre de la nota
    if (confirm(`¿Estás seguro de eliminar la nota "${note.name}"?`)) {
        notesData = notesData.filter(n => n.id !== activeNoteId);
        saveNotesToStorage();
        if (notesData.length > 0) { 
            renderNotesList();
            selectNote(notesData[0].id); 
        } else { 
            activeNoteId = null; 
            txtTitle.value = ""; txtContent.value = ""; txtFooter.value = ""; 
            renderNotesList(); 
        }
    }
});

// ==========================================
// ANALIZADOR DE MARKDOWN Y PROYECCIÓN
// ==========================================
function parseMarkdown(text) {
    if (!text) return "";
    
    // 1. Limpiar caracteres invisibles que traen los copypaste y rompen el markdown (Ej. U+202D)
    text = text.replace(/[\u200B-\u200D\uFEFF\u202A-\u202E]/g, "");

    let html = text.replace(/</g, "&lt;").replace(/>/g, "&gt;");
    
    // Escapar caracteres especiales
    html = html.replace(/\\\*/g, "&#42;");
    html = html.replace(/\\_/g, "&#95;");
    html = html.replace(/\\~/g, "&#126;");
    html = html.replace(/\\=/g, "&#61;");
    html = html.replace(/\\\^/g, "&#94;");
    html = html.replace(/\\&gt;/g, "&#62;");

    // 🟢 ARREGLO CITAS: Ahora usa margin: 2px 0 (menos espacio vertical al final)
    html = html.replace(/^\s*&gt;\s+(.*)$/gm, '<blockquote style="border-left: 4px solid var(--accent, #0076ff); padding: 2px 0 2px 10px; margin: 2px 0; font-style: italic; color: #ffbd6b;">$1</blockquote>');
    
    html = html.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>');
    html = html.replace(/__(.*?)__/g, '<u>$1</u>');
    html = html.replace(/\*(.*?)\*/g, '<em>$1</em>');
    html = html.replace(/_([^_]+)_/g, '<em>$1</em>');
    html = html.replace(/~~(.*?)~~/g, '<s>$1</s>');
    html = html.replace(/==(.*?)==/g, '<mark style="background-color: rgba(255, 235, 59, 0.4); color: #fff; padding: 0 4px; border-radius: 3px;">$1</mark>');
    
    // Detecta el texto entre ;; y le aplica color negro
    html = html.replace(
    /;;(.*?);;/g,
    '<span style="color: black; text-shadow: 0 0 2px #fff, 0 0 6px #fff;">$1</span>'
);
    html = html.replace(/\^([^\^]+)\^/g, '<sup>$1</sup>');
    html = html.replace(/~([^~]+)~/g, '<sub>$1</sub>');
    html = html.replace(/:::/g, '<div style="break-after: column;"></div>');
    html = html.replace(/\n/g, '<br>');
    
    return html;
}

// 🟢 ARREGLO: Permitir arrastrar y soltar texto dentro del área de Contenido sin bloqueos de la app
// 🟢 ARREGLO: Aislar todos los eventos de arrastre en el textarea para que la 
// aplicación global no active bordes ni cambie la UI general cuando arrastras texto.
['dragenter', 'dragover', 'dragleave', 'drop'].forEach(evt => {
    txtContent.addEventListener(evt, (e) => {
        e.stopPropagation(); 
    });
});
//txtContent.addEventListener('drop', (e) => e.stopPropagation());

document.getElementById('btnProjectNote').addEventListener('click', () => {
    const note = notesData.find(n => n.id === activeNoteId);
    if (!note) return;
    
    let htmlSalida = `<div style="display: inline-block; width: 100%;">`;
    
    if (note.titleText.trim() !== "") {
        htmlSalida += `<div style="text-align:${note.titleAlign}; font-size:1.1em; font-weight:bold; margin-bottom:0.5em; color:#ffbd6b;">${note.titleText}</div>`;
    }
    
    if (note.contentText !== "") {
        // Al quitar el .trim(), respetará los 'Enters' que pongas al inicio y al final
        let textFormatted = parseMarkdown(note.contentText);
        htmlSalida += `<div style="text-align:${note.contentAlign}; font-weight: 500; column-count:${note.contentCols}; column-gap:2em; font-size:0.9em; width:100%; word-wrap:break-word;">${textFormatted}</div>`;
    }
    
    if (note.footerText.trim() !== "") {
        // 🟢 ARREGLO: Aumentado el font-size de 0.6em a 0.8em para que sea más legible
        htmlSalida += `<div style="text-align:${note.footerAlign}; font-size:0.8em; margin-top:1em; opacity:0.8; font-style:italic; font-weight:bold;">${note.footerText}</div>`;
    }

    htmlSalida += `</div>`;

    if (window.isProjectionReady && window.proyectarTexto) {
        window.proyectarTexto(htmlSalida, "", note.fontSize);
    } else {
        alert("Primero debes abrir la ventana de proyección.");
    }
});

// ==========================================
// PROYECTAR NOTA ACTUAL (reutilizable)
// ==========================================
function projectCurrentNote() {
    const note = notesData.find(n => n.id === activeNoteId);
    if (!note) {
        alert("No hay una nota seleccionada.");
        return;
    }

    let htmlSalida = `<div style="display: inline-block; width: 100%;">`;
    
    if (note.titleText.trim() !== "") {
        htmlSalida += `<div style="text-align:${note.titleAlign}; font-size:1.1em; font-weight:bold; margin-bottom:0.5em; color:#ffbd6b;">${note.titleText}</div>`;
    }
    
    if (note.contentText !== "") {
        let textFormatted = parseMarkdown(note.contentText);
        htmlSalida += `<div style="text-align:${note.contentAlign}; font-weight: 500; column-count:${note.contentCols}; column-gap:2em; font-size:0.9em; width:100%; word-wrap:break-word;">${textFormatted}</div>`;
    }
    
    if (note.footerText.trim() !== "") {
        htmlSalida += `<div style="text-align:${note.footerAlign}; font-size:0.8em; margin-top:1em; opacity:0.8; font-style:italic; font-weight:bold;">${note.footerText}</div>`;
    }

    htmlSalida += `</div>`;

    if (window.isProjectionReady && window.proyectarTexto) {
        window.proyectarTexto(htmlSalida, "", note.fontSize);
    } else {
        alert("Primero debes abrir la ventana de proyección.");
    }
}

// 🟢 ARREGLO: Lógica del Botón Descargar (Con soporte para Shift + Click)
document.getElementById('btnDownloadNote').addEventListener('click', (e) => {
    if (e.shiftKey) {
        // Descargar TODAS las notas juntas
        if (notesData.length === 0) {
            alert("No hay notas para descargar.");
            return;
        }
        let allContent = "";
        notesData.forEach((note, idx) => {
            allContent += `--- ${note.name} ---\n\n`;
            if (note.titleText.trim()) allContent += note.titleText + "\n\n";
            if (note.contentText.trim()) allContent += note.contentText + "\n\n";
            if (note.footerText.trim()) allContent += note.footerText + "\n\n";
            if (idx < notesData.length - 1) allContent += "\n=========================\n\n";
        });

        descargarArchivoTxt(allContent, "MicroBeam_Todas_Las_Notas.txt");
    } else {
        // Descargar SOLO la nota actual
        const note = notesData.find(n => n.id === activeNoteId);
        if (!note) return;

        let contentToDownload = "";
        if (note.titleText.trim()) contentToDownload += note.titleText + "\n\n";
        if (note.contentText.trim()) contentToDownload += note.contentText + "\n\n";
        if (note.footerText.trim()) contentToDownload += note.footerText;

        descargarArchivoTxt(contentToDownload, (note.name || "MicroBeam_Nota") + ".txt");
    }
});

// Función de apoyo para no repetir código de descarga
function descargarArchivoTxt(contenido, nombreArchivo) {
    const blob = new Blob([contenido], { type: "text/plain;charset=utf-8" });
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = nombreArchivo;
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
    URL.revokeObjectURL(url);
}

// 🟢 NUEVO: Lógica del Botón Duplicar
document.getElementById('btnDuplicateNote').addEventListener('click', () => {
    if (!activeNoteId) return;
    
    // Buscar la posición exacta de la nota actual
    const noteIndex = notesData.findIndex(n => n.id === activeNoteId);
    if (noteIndex === -1) return;
    
    const noteToCopy = notesData[noteIndex];
    const newId = 'n' + Date.now();
    
    // Crear la copia exacta pero con nuevo ID y nombre modificado
    const duplicatedNote = {
        ...noteToCopy,
        id: newId,
        name: noteToCopy.name + " (copia)"
    };
    
    // Insertarla inmediatamente debajo en la lista
    notesData.splice(noteIndex + 1, 0, duplicatedNote);
    
    saveNotesToStorage();
    renderNotesList();
    selectNote(newId); // Seleccionar automáticamente la nueva nota copiada
});

// ==========================================
// CONTROL DE UI Y BOTONES DE MODO
// ==========================================

if (btnModeNotes) {
    btnModeNotes.addEventListener('click', () => {
        // Remover estado de todos y activar solo Notas
        document.querySelectorAll('.mode-btn').forEach(btn => btn.classList.remove('active'));
        btnModeNotes.classList.add('active');
        
        // Paneles Izquierdos
        document.getElementById('bibleControls').style.display = 'none';
        document.getElementById('songsControls').style.display = 'none';
        notesControls.style.display = 'flex';
        
        // Paneles Derechos
        document.getElementById('resultsContainer').style.display = 'none';
        document.getElementById('songResultsContainer').style.display = 'none';
        
        // Ocultar encabezados ajenos
        const headerRight = document.getElementById('rightPanelHeaderContainer');
        const navBiblia = document.getElementById('bibleNavControls');
        const pullTop = document.getElementById('pullTopIndicator');
        const pullBottom = document.getElementById('pullBottomIndicator');
        
        if (headerRight) headerRight.style.display = 'none';
        if (navBiblia) navBiblia.style.display = 'none';
        if (pullTop) pullTop.style.display = 'none';
        if (pullBottom) pullBottom.style.display = 'none';
        
        noteEditorContainer.style.display = 'flex';

        if (activeNoteId) selectNote(activeNoteId);
    });
}

// Interceptar eventos de los otros modos para Restaurar la UI
document.getElementById('btnModeBible').addEventListener('click', () => {
    document.querySelectorAll('.mode-btn').forEach(btn => btn.classList.remove('active'));
    document.getElementById('btnModeBible').classList.add('active');

    notesControls.style.display = 'none';
    noteEditorContainer.style.display = 'none';
    
    // Restaurar encabezados de Biblia
    const headerRight = document.getElementById('rightPanelHeaderContainer');
    const navBiblia = document.getElementById('bibleNavControls');
    if (headerRight) headerRight.style.display = 'flex';
    if (navBiblia) navBiblia.style.display = 'grid';
    // 🌟 MOSTRAR BOTÓN DE COPIAR EN MODO BIBLIA
    document.getElementById('btnCopyBibleResults').style.display = 'flex';
    
    document.getElementById('resultsContainer').style.display = 'block';
    
    // [NUEVO] Restaurar el valor del slider guardado para la Biblia
    const savedBibleSize = parseFloat(localStorage.getItem('cfgBibleFontSize')) || 7;
    const slideFontSize = document.getElementById('slideFontSize');
    const valFontSize = document.getElementById('valFontSize');
    if (slideFontSize) {
        slideFontSize.value = savedBibleSize;
        if (valFontSize) valFontSize.innerText = savedBibleSize + "vw";
        window.savedBibleFontSize = savedBibleSize; 
    }
});

document.getElementById('btnModeSongs').addEventListener('click', () => {
    document.querySelectorAll('.mode-btn').forEach(btn => btn.classList.remove('active'));
    document.getElementById('btnModeSongs').classList.add('active');

    notesControls.style.display = 'none';
    noteEditorContainer.style.display = 'none';
    // 🌟 OCULTAR BOTÓN DE COPIAR EN MODO CANCIONES
    document.getElementById('btnCopyBibleResults').style.display = 'none';
    
    // Restaurar encabezado de canciones
    const headerRight = document.getElementById('rightPanelHeaderContainer');
    const navBiblia = document.getElementById('bibleNavControls');
    if (headerRight) headerRight.style.display = 'flex';
    if (navBiblia) navBiblia.style.display = 'none'; // Canciones no usa navegación por flechas
    
    document.getElementById('songResultsContainer').style.display = 'block';
    
    // [NUEVO] Restaurar el valor del slider guardado para Canciones
    const savedSongSize = parseFloat(localStorage.getItem('cfgSongFontSize')) || 7;
    const slideFontSize = document.getElementById('slideFontSize');
    const valFontSize = document.getElementById('valFontSize');
    if (slideFontSize) {
        slideFontSize.value = savedSongSize;
        if (valFontSize) valFontSize.innerText = savedSongSize + "vw";
        window.savedSongFontSize = savedSongSize; 
    }
});

// Iniciar módulo
initNotesMode();

// ==========================================================================
// LÓGICA COHESIVA PARA LOS BOTONES DE FORMATO DE CONTENIDO (MARKDOWN)
// ==========================================================================
document.querySelectorAll('.format-btn').forEach(btn => {
    btn.addEventListener('click', function(e) {
        e.preventDefault();
        
        const openTag = this.dataset.open || '';
        const closeTag = this.dataset.close || '';
        const textarea = document.getElementById('txtNoteContent');
        
        if (!textarea) return;

        // Capturar posiciones del cursor y selección actual
        const start = textarea.selectionStart;
        const end = textarea.selectionEnd;
        const text = textarea.value;
        const selectedText = text.substring(start, end);

        // Construir la cadena formateada
        const replacement = openTag + selectedText + closeTag;

        // Inyectar el texto en el documento
        textarea.value = text.substring(0, start) + replacement + text.substring(end);

        // Devolver foco y recalcular selección de manera orgánica
        textarea.focus();
        if (selectedText.length > 0) {
            // Mantener seleccionado el bloque completo con sus nuevas etiquetas
            textarea.setSelectionRange(start, start + replacement.length);
        } else {
            // Si no había selección, posicionar el cursor justo en medio de los tags
            textarea.setSelectionRange(start + openTag.length, start + openTag.length);
        }

        // 🔄 Disparar nativamente el evento 'input' para activar el autoguardado en LocalStorage
        textarea.dispatchEvent(new Event('input', { bubbles: true }));
    });

    // Pequeño realce estético interactivo al pasar el mouse (efecto hover)
    btn.addEventListener('mouseover', () => btn.style.borderColor = 'var(--accent, #0076ff)');
    btn.addEventListener('mouseout', () => btn.style.borderColor = '#4a4a55');
});

// ==========================================================================
// 🧹 ACCIÓN: QUITAR TODO FORMATO ESPECÍFICO A LA SELECCIÓN ACTUAL
// ==========================================================================
document.getElementById('btnClearFormatting').addEventListener('click', () => {
    const txtArea = document.getElementById('txtNoteContent');
    if (!txtArea) return;

    const start = txtArea.selectionStart;
    const end = txtArea.selectionEnd;

    // Condición: Si no hay texto sombreado, salir inmediatamente
    if (start === end) return;

    const textoCompleto = txtArea.value;
    let fragmento = textoCompleto.substring(start, end);

    // 1. **negrita**
    fragmento = fragmento.replace(/\*\*([\s\S]*?)\*\*/g, '$1');

    // 2. __subrayado__
    fragmento = fragmento.replace(/__([\s\S]*?)__/g, '$1');

    // 3. *cursiva*
    fragmento = fragmento.replace(/\*([\s\S]*?)\*/g, '$1');

    // 4. ~~tachado~~
    fragmento = fragmento.replace(/~~([\s\S]*?)~~/g, '$1');

    // 5. ==resaltado==
    fragmento = fragmento.replace(/==([\s\S]*?)==/g, '$1');

    // 6. ^superíndice^
    fragmento = fragmento.replace(/\^([\s\S]*?)\^/g, '$1');

    // 7. ~subíndice~ (Nota: Se procesa después de tachado para no romperlo)
    fragmento = fragmento.replace(/~([\s\S]*?)~/g, '$1');

    // 8. > cita (Elimina el caracter '>' al inicio de las líneas en el bloque)
    fragmento = fragmento.split('\n').map(linea => linea.replace(/^(\s*>\s*)/, '')).join('\n');

    // 9. ::: (salto de columna → lo reemplaza por un salto de línea común para conservar fluidez)
    fragmento = fragmento.replace(/:::/g, '\n');

    // 10. ;;textoColorNegro;;
    fragmento = fragmento.replace(/;;([\s\S]*?);;/g, '$1');

    // 11. Limpieza adicional opcional de espacios dobles creados por los recortes
    fragmento = fragmento.replace(/[ \t]+/g, ' ');

    // Reconstruir el documento inyectando el fragmento plano
    txtArea.value = textoCompleto.substring(0, start) + fragmento + textoCompleto.substring(end);

    // Devolver el enfoque al editor manteniendo la selección sobre el trozo limpio
    txtArea.focus();
    txtArea.selectionStart = start;
    txtArea.selectionEnd = start + fragmento.length;

    // Disparar la sincronización para que se guarde en LocalStorage y renderice en la pantalla
    txtArea.dispatchEvent(new Event('input'));

    // Animación visual de confirmación en el botón (Borde verde)
    const btn = document.getElementById('btnClearFormatting');
    const colorOrig = btn.style.color;
    btn.style.color = '#22c55e';
    btn.style.borderColor = '#22c55e';
    setTimeout(() => {
        btn.style.color = colorOrig;
        btn.style.borderColor = '#4a4a55';
    }, 1000);
});

// ==========================================================================
// 🔄 MOTOR DE HISTORIAL COMPLETO (DESHACER Ctrl+Z / REHACER Ctrl+Y)
// ==========================================================================
let undoStack = [];
let redoStack = []; // Pila dedicada para rehacer
const maxHistoryStates = 40;
const txtAreaNotes = document.getElementById('txtNoteContent');

// Función nativa para salvaguardar el estado actual en la pila de Deshacer
function saveUndoState() {
    if (!txtAreaNotes) return;
    // Si el estado actual es idéntico al último guardado, no duplicar
    if (undoStack.length > 0 && undoStack[undoStack.length - 1] === txtAreaNotes.value) return;
    
    undoStack.push(txtAreaNotes.value);
    redoStack = []; // Cada vez que el usuario hace una acción nueva, se limpia la pila de Rehacer
    
    if (undoStack.length > maxHistoryStates) {
        undoStack.shift(); 
    }
}

// Escuchar comandos del teclado para Deshacer y Rehacer
if (txtAreaNotes) {
    txtAreaNotes.addEventListener('keydown', (e) => {
        const key = e.key.toLowerCase();
        
        // ↩️ DESHACER: Ctrl + Z
        if ((e.ctrlKey || e.metaKey) && key === 'z') {
            e.preventDefault();
            if (undoStack.length > 0) {
                // El estado actual se manda a Rehacer antes de restaurar el anterior
                redoStack.push(txtAreaNotes.value);
                
                const previousState = undoStack.pop();
                txtAreaNotes.value = previousState;
                txtAreaNotes.dispatchEvent(new Event('input'));
            }
        } 
        // ↪️ REHACER: Ctrl + Y
        else if ((e.ctrlKey || e.metaKey) && key === 'y') {
            e.preventDefault();
            if (redoStack.length > 0) {
                // El estado actual se manda a Deshacer antes de restaurar el siguiente
                undoStack.push(txtAreaNotes.value);
                
                const nextState = redoStack.pop();
                txtAreaNotes.value = nextState;
                txtAreaNotes.dispatchEvent(new Event('input'));
            }
        } 
        // Captura de puntos de control automáticos al escribir libremente
        else {
            if (['Enter', ' ', 'Backspace', 'Delete'].includes(e.key)) {
                saveUndoState();
            }
        }
    });
}

// ==========================================================================
// 🎨 LÓGICA: INYECTAR FORMATO TEXTO COLOR NEGRO
// ==========================================================================
document.getElementById('btnColorBlack').addEventListener('click', () => {
    if (!txtAreaNotes) return;
    saveUndoState();

    const start = txtAreaNotes.selectionStart;
    const end = txtAreaNotes.selectionEnd;
    const texto = txtAreaNotes.value;

    const textoSeleccionado = texto.substring(start, end);
    const textoFormateado = `;;${textoSeleccionado};;`;

    txtAreaNotes.value = texto.substring(0, start) + textoFormateado + texto.substring(end);
    txtAreaNotes.focus();
    txtAreaNotes.setSelectionRange(start + 2, start + 2 + textoSeleccionado.length);
    txtAreaNotes.dispatchEvent(new Event('input'));
});

// ==========================================================================
// 🔠 LÓGICA: ALTERNAR CASOS DE TEXTO (MAYÚSCULAS ↔ CAPITAL ↔ MINÚSCULAS)
// ==========================================================================
document.getElementById('btnToggleCase').addEventListener('click', () => {
    if (!txtAreaNotes) return;
    saveUndoState();

    const start = txtAreaNotes.selectionStart;
    const end = txtAreaNotes.selectionEnd;
    const texto = txtAreaNotes.value;

    let selStart = (start === end) ? 0 : start;
    let selEnd = (start === end) ? texto.length : end;
    let selectedText = texto.substring(selStart, selEnd);

    if (!selectedText.trim()) return;

    let nuevoTexto = "";
    if (selectedText === selectedText.toUpperCase()) {
        nuevoTexto = selectedText.toLowerCase();
    } else if (selectedText === selectedText.toLowerCase()) {
        nuevoTexto = selectedText.replace(/\b\w/g, l => l.toUpperCase());
    } else {
        nuevoTexto = selectedText.toUpperCase();
    }

    txtAreaNotes.value = texto.substring(0, selStart) + nuevoTexto + texto.substring(selEnd);
    txtAreaNotes.focus();
    txtAreaNotes.setSelectionRange(selStart, selStart + nuevoTexto.length);
    txtAreaNotes.dispatchEvent(new Event('input'));
});

// ==========================================================================
// 📖 LÓGICA REFORZADA: ALTERNAR CITAS BÍBLICAS (LÍNEAS ↔ COMAS)
// ==========================================================================
document.getElementById('btnToggleBibleQuotes').addEventListener('click', () => {
    if (!txtAreaNotes) return;

    const start = txtAreaNotes.selectionStart;
    const end = txtAreaNotes.selectionEnd;
    let selStart, selEnd, selectedText;

    if (start === end) {
        selStart = 0;
        selEnd = txtAreaNotes.value.length;
        selectedText = txtAreaNotes.value;
    } else {
        selStart = start;
        selEnd = end;
        selectedText = txtAreaNotes.value.substring(start, end);
    }

    if (selectedText.trim() === '') return;

    let normalized = selectedText.toUpperCase();
    normalized = normalized.replace(/(\d)\.(\d)/g, '$1:$2');

    // Lista Maestra de Validación y Mapeo de Libros
    const libros = [
        "GÉNESIS", "GENESIS", "ÉXODO", "EXODO", "LEVÍTICO", "LEVITICO", "NÚMEROS", "NUMEROS", "DEUTERONOMIO",
        "JOSUÉ", "JOSUE", "JUECES", "RUT", "1 SAMUEL", "2 SAMUEL", "1 REYES", "2 REYES", "1 CRÓNICAS", "2 CRÓNICAS", 
        "1 CRONICAS", "2 CRONICAS", "ESDRAS", "NEHEMÍAS", "NEHEMIAS", "ESTER", "JOB", "SALMOS", "SALMO", 
        "PROVERBIOS", "ECLESIASTÉS", "ECLESIASTES", "CANTARES", "ISAÍAS", "ISAIAS", "JEREMÍAS", "JEREMIAS", 
        "LAMENTACIONES", "EZEQUIEL", "DANIEL", "OSEAS", "JOEL", "AMÓS", "AMOS", "ABDÍAS", "ABDIAS", "JONÁS", 
        "JONAS", "MIQUEAS", "NAHÚM", "NAHUM", "HABACUC", "SOFONÍAS", "SOFONIAS", "HAGEO", "ZACARÍAS", "ZACARIAS", 
        "MALAQUÍAS", "MALAQUIAS", "MATEO", "MARCOS", "LUCAS", "JUAN", "HECHOS", "ROMANOS", "1 CORINTIOS", 
        "2 CORINTIOS", "GÁLATAS", "GALATAS", "EFESIOS", "FILIPENSES", "COLOSENSES", "1 TESALONICENSES", 
        "2 TESALONICENSES", "1 TIMOTEO", "2 TIMOTEO", "TITO", "FILEMÓN", "FILEMON", "HEBREOS", "SANTIAGO", 
        "1 PEDRO", "2 PEDRO", "1 JUAN", "2 JUAN", "3 JUAN", "JUDAS", "APOCALIPSIS"
    ];

    libros.sort((a, b) => b.length - a.length);
    const escaped = libros.map(l => l.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'));
    const regex = new RegExp('\\b(' + escaped.join('|') + ')\\b', 'g');

    // 🚀 VALIDACIÓN CRÍTICA ANTES DE GUARDAR HISTORIAL O PROCESAR:
    // Comprobar si el texto seleccionado contiene al menos UN libro válido de la Biblia
    if (!regex.test(normalized)) {
        return; // Salida silenciosa. No hace nada si es un texto cualquiera.
    }

    // Si pasó la validación, ahora sí guardamos el estado en el Historial para deshacer
    saveUndoState(); 

    let newText;
    const hasNewline = normalized.includes('\n');

    if (hasNewline) {
        // Formato líneas → convertir a comas
        const lines = normalized.split('\n')
            .map(s => s.trim())
            .filter(s => s.length > 0)
            .map(s => s.replace(/^, /, '').replace(/, $/, ''));
        newText = lines.join(', ');
        newText = newText.replace(/,{2,}/g, ', ').replace(/^, /, '').replace(/, $/, '');
    } else {
        // Formato comas → dividir en líneas usando los libros encontrados
        let marked = normalized.replace(regex, '|||$&');
        let parts = marked.split('|||').map(s => s.trim()).filter(s => s.length > 0);

        if (parts.length === 0) {
            parts = [normalized];
        }

        parts = parts.map(p => p.replace(/^,\s*/, '').replace(/\s*,+$/, '').trim()).filter(p => p.length > 0);
        newText = parts.join('\n');
    }

    // Modificar el DOM e inyectar el cambio
    txtAreaNotes.value = txtAreaNotes.value.substring(0, selStart) + newText + txtAreaNotes.value.substring(selEnd);
    txtAreaNotes.focus();
    txtAreaNotes.setSelectionRange(selStart, selStart + newText.length);
    txtAreaNotes.dispatchEvent(new Event('input'));
});
