/**
 * voto.js — Sprint 10B + Fix 15A
 *
 * Sprint 10B: Validacion legacy mejorada, min/max desde data- attributes,
 *             dialogs custom para Zoom WebView
 * Fix 15A:    mostrarConfirmacion y mostrarAlerta con try-catch para
 *             evitar crash silencioso cuando Bootstrap.getInstance devuelve
 *             null justo despues de new bootstrap.Modal().show()
 */

function marcaOpcion(text) {
    var el = document.getElementById('opcionVoto');
    if (el) el.value = text;
}

/**
 * Lee min/max desde atributos data- del form.
 * votacion_activa.php los inyecta via PHP; candidatos.php usa los globales.
 * Default: 1 si no se encuentran.
 */
function getMinMax() {
    var form = document.getElementById('form1');
    var min  = (form && form.dataset.min) ? parseInt(form.dataset.min, 10) : 1;
    var max  = (form && form.dataset.max) ? parseInt(form.dataset.max, 10) : 1;
    if (isNaN(min) || min < 1) min = 1;
    if (isNaN(max) || max < 1) max = 1;
    return { min: min, max: max };
}

function valida() {
    var seleccionados = document.querySelectorAll('input[name="voto[]"]:checked');
    var mm = getMinMax();

    if (seleccionados.length === 0) {
        mostrarAlerta('Seleccione al menos ' + mm.min + ' candidato(s).');
        return;
    }
    if (seleccionados.length < mm.min) {
        mostrarAlerta('Por favor seleccione al menos ' + mm.min + ' candidato(s).');
        return;
    }
    if (seleccionados.length > mm.max) {
        mostrarAlerta('Maximo permitido: ' + mm.max + ' candidato(s).');
        return;
    }

    mostrarConfirmacion(
        'Esta seguro de registrar su voto?\nEsta accion no se puede deshacer.',
        function () { document.getElementById('form1').submit(); }
    );
}

function updateSelection(event) {
    var checkbox      = event.target;
    var seleccionados = document.querySelectorAll('input[name="voto[]"]:checked');
    var mm            = getMinMax();
    if (checkbox.checked && seleccionados.length > mm.max) {
        checkbox.checked = false;
        mostrarAlerta('Maximo permitido: ' + mm.max + ' opcion(es).');
    }
}

/**
 * Muestra alerta usando Bootstrap modal si esta disponible.
 * Fix 15A: try-catch completo — si Bootstrap falla, cae a alert() nativo.
 * Hace dispose() antes de crear nueva instancia para evitar doble init.
 */
function mostrarAlerta(msg) {
    var modalEl = document.getElementById('modalVotoAlerta');
    if (typeof bootstrap !== 'undefined' && modalEl) {
        try {
            document.getElementById('modalVotoAlertaMsg').textContent = msg;
            try {
                var ex = bootstrap.Modal.getInstance(modalEl);
                if (ex) ex.dispose();
            } catch(e) { /* no-op */ }
            new bootstrap.Modal(modalEl).show();
        } catch(e) {
            alert(msg);
        }
    } else {
        alert(msg);
    }
}

/**
 * Muestra confirmacion usando Bootstrap modal si esta disponible.
 * Fix 15A: getInstance() puede retornar null justo despues de show()
 * porque el modal aun no fue registrado. El try-catch garantiza que
 * onConfirm() siempre ejecute aunque hide() falle.
 */
function mostrarConfirmacion(msg, onConfirm) {
    var modalEl = document.getElementById('modalVotoConfirm');
    if (typeof bootstrap !== 'undefined' && modalEl) {
        try {
            document.getElementById('modalVotoConfirmMsg').textContent = msg;
            document.getElementById('modalVotoBtnConfirm').onclick = function () {
                // Intentar cerrar el modal — si falla, igual ejecutamos onConfirm
                try {
                    var inst = bootstrap.Modal.getInstance(modalEl);
                    if (inst) {
                        inst.hide();
                    } else {
                        // Fallback: ocultar manualmente si getInstance retorna null
                        modalEl.classList.remove('show');
                        modalEl.style.display = 'none';
                        document.body.classList.remove('modal-open');
                        var backdrop = document.querySelector('.modal-backdrop');
                        if (backdrop) backdrop.remove();
                    }
                } catch(e) { /* no-op — no bloquear el submit */ }
                onConfirm();
            };
            // Dispose instancia previa para evitar "already instantiated"
            try {
                var existing = bootstrap.Modal.getInstance(modalEl);
                if (existing) existing.dispose();
            } catch(e) { /* no-op */ }
            new bootstrap.Modal(modalEl).show();
        } catch(e) {
            // Si Bootstrap falla completamente, confirm() nativo como fallback
            if (confirm(msg)) onConfirm();
        }
    } else {
        if (confirm(msg)) onConfirm();
    }
}
