/**
 * form_helpers.js
 * Funciones de ayuda compartidas para los formularios de matrícula y edición.
 */

/**
 * Valida un RUN chileno (formato y dígito verificador).
 * @param {string} run
 * @returns {boolean}
 */
function validarRun(run) {
    run = run.replace(/\./g, '').replace(/-/g, '').toUpperCase();
    if (!/^\d{7,9}[0-9K]$/.test(run)) return false;
    let cuerpo = run.slice(0, -1);
    let dv = run.slice(-1);
    let suma = 0,
        multiplo = 2;
    for (let i = cuerpo.length - 1; i >= 0; i--) {
        suma += parseInt(cuerpo[i]) * multiplo;
        multiplo = multiplo < 7 ? multiplo + 1 : 2;
    }
    let dvEsperado = 11 - (suma % 11);
    dvEsperado = dvEsperado === 11 ? '0' : dvEsperado === 10 ? 'K' : dvEsperado.toString();
    return dv === dvEsperado;
}

/**
 * Renderiza la lista de familiares en el contenedor especificado.
 * @param {HTMLElement} containerEl - El elemento contenedor para la lista.
 * @param {Array} familiares - El array de objetos de familiares.
 * @param {boolean} conBotonEditar - Si se debe mostrar el botón de editar.
 */
function renderizarListaFamiliares(containerEl, familiares, conBotonEditar = false) {
    containerEl.innerHTML = '';
    if (familiares.length > 0) {
        const listGroup = document.createElement('ul');
        listGroup.className = 'list-group';
        familiares.forEach((familiar, index) => {
            const listItem = document.createElement('li');
            listItem.className = 'list-group-item d-flex justify-content-between align-items-center';

            const editarBtnHtml = conBotonEditar ?
                `<button type="button" class="btn btn-sm btn-outline-secondary btn-editar-familiar me-1" data-index="${index}">Editar</button>` :
                '';

            listItem.innerHTML = `
                <div>
                    <strong>${familiar.nombre} ${familiar.ap_paterno}</strong> (${familiar.run})
                    <small class="text-muted d-block">${familiar.parentesco || 'Sin parentesco'} | Rol: ${familiar.rol || 'No especificado'}</small>
                </div>
                <div>
                    ${editarBtnHtml}
                    <button type="button" class="btn btn-sm btn-outline-danger btn-quitar-familiar" data-index="${index}">Quitar</button>
                </div>
            `;
            listGroup.appendChild(listItem);
        });
        containerEl.appendChild(listGroup);
    }
}

/**
 * Limpia el formulario de apoderado/familiar.
 * @param {string[]} campos - Array con los nombres de los campos a limpiar (sin el prefijo 'apoderado_').
 */
function limpiarFormApoderado(campos) {
    campos.forEach(c => {
        const input = document.getElementById('apoderado_' + c);
        if (input) input.value = '';
    });
    document.querySelectorAll('input[name="apoderado_rol[]"]').forEach(chk => chk.checked = false);
}

/**
 * Muestra un error de validación en un campo del formulario.
 * @param {string} campo - El nombre del campo (sin el prefijo 'apoderado_').
 * @param {string} mensaje - El mensaje de error a mostrar.
 */
function mostrarError(campo, mensaje) {
    const input = document.getElementById(`apoderado_${campo}`);
    const feedback = document.getElementById(`apoderado_${campo}_feedback`);
    if (input) {
        input.classList.add('is-invalid');
        input.focus();
    }
    if (feedback) {
        feedback.textContent = mensaje;
    }
}

/**
 * Configura la verificación de RUN para un campo de familiar, buscando si ya existe en la BD.
 * @param {string} runInputId - ID del input del RUN.
 * @param {string} feedbackElId - ID del elemento para mostrar feedback.
 * @param {string[]} camposParaRellenar - Array con los nombres de los campos a rellenar si se encuentra el familiar.
 */
function configurarVerificacionRunFamiliar(runInputId, feedbackElId, camposParaRellenar) {
    const runInput = document.getElementById(runInputId);
    const feedbackEl = document.getElementById(feedbackElId);

    if (!runInput || !feedbackEl) return;

    runInput.addEventListener('blur', async () => {
        const run = runInput.value.trim();
        runInput.classList.remove('is-invalid', 'is-valid');
        feedbackEl.textContent = '';

        if (!run) return;

        if (!validarRun(run)) {
            runInput.classList.add('is-invalid');
            feedbackEl.textContent = 'El formato del RUN no es válido.';
            return;
        }

        try {
            const response = await fetch(src(`verificar_familiar.php?run=${encodeURIComponent(run)}`));
            const data = await response.json();

            if (!data.success) throw new Error(data.error || 'Error del servidor');

            if (data.existe) {
                runInput.classList.add('is-valid');
                feedbackEl.innerHTML = '<strong class="text-success">¡Familiar encontrado!</strong> Se han cargado sus datos.';
                const familiar = data.familiar;
                camposParaRellenar.forEach(c => {
                    const input = document.getElementById(`apoderado_${c}`);
                    if (input && familiar[c]) {
                        input.value = familiar[c];
                    }
                });
            } else {
                runInput.classList.add('is-valid');
            }
        } catch (error) {
            runInput.classList.add('is-invalid');
            feedbackEl.textContent = `Error al verificar: ${error.message}`;
        }
    });
}