document.addEventListener("DOMContentLoaded", function () {
    const formulario = document.getElementById("formulario-datos-extendido");
    const buscarBtn = document.getElementById("buscarBtn");
    const paisSelect = document.getElementById("id_pais");
    const inputCodigoPostal = document.getElementById("codigo_postal");
    const inputButtonBuscarCodigoPostal = document.getElementById("buscarBtn");
    const estadoSelect = document.getElementById("id_estado");
    const municipioSelect = document.getElementById("id_municipio");
    const coloniaSelect = document.getElementById("id_colonia");
    const giroSelect = document.getElementById("id_giro");
    const nivelEstudioSelect = document.getElementById("id_nivel");
    const motivoExamenSelect = document.getElementById("motivo_examen");
    const selectCalificacionServicio = document.getElementById("calificacion_servicio");
    const dataListEmpresasInstituciones = document.getElementById("sugerencias_ei");
    const motivoOtroContainer = document.getElementById("motivo_otro_container");
    const motivoOtroInput = document.getElementById("motivo_otro");

    llenarSelectGiro();
    llenarSelectNivelesEstudio();
    llenarDataListEmpresasInstituciones();
    llenarSelectMotivoExamen();

    // FUNCIONES - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    function llenarSelectGiro() {
        // URL para la solicitud
        let url = "../controllers/CatalogosController.php?obtener=giros";

        // Realiza una solicitud HTTP GET a la URL especificada
        fetch(url)
            .then(response => {
                // Verifica si la respuesta del servidor es exitosa
                if (!response.ok) {
                    throw new Error("llenarSelectGiro(): Error en la respuesta del servidor.");
                }

                // Convertir la respuesta a JSON
                return response.json();
            })
            .then(data => {
                // Verifica si se recibieron datos
                if (data.length > 0) {

                    // Añade las opciones de giros al elemento select
                    data.forEach(row => {
                        giroSelect.innerHTML += "<option value='" + row.id_giro + "'>" + row.descripcion + "</option>";
                    });
                } else {
                    alert("llenarSelectGiro(): No se encontraron datos para los giros.");
                }
            })
            .catch(error => {
                console.error("llenarSelectGiro(): Error en la solicitud. ", error);
            });
    }

    function llenarSelectNivelesEstudio(){
        let url = "../controllers/CatalogosController.php?obtener=nivelesestudio";
        // Petición fetch y llenado de select
        fetch(url)
            .then(response => {
                if (!response.ok) {
                    throw new Error("llenarSelectNivelesEstudio(): Error en la respuesta del servidor.");
                }
                return response.json();
            })
            .then(data => {
                if (data.length > 0) {
                    data.forEach(row => {
                        nivelEstudioSelect.innerHTML += "<option value='" + row.id_nivel + "'>" + row.descripcion + "</option>";
                    });
                } else {
                    alert("llenarSelectNivelesEstudio(): No se encontraron datos para los giros.");
                }
            })
            .catch(error => {
                console.error("llenarSelectNivelesEstudio(): Error en la solicitud. ", error);
            });
    }
    //##################################################################################################################
    function llenarSelectMotivoExamen() {
        // URL para la solicitud
        let url = "../controllers/CatalogosController.php?obtener=motivos";

        // Realiza una solicitud HTTP GET a la URL especificada
        fetch(url)
            .then(response => {
                // Verifica si la respuesta del servidor es exitosa
                if (!response.ok) {
                    throw new Error("Error en la respuesta del servidor.");
                }

                // Convertir la respuesta a JSON
                return response.json();
            })
            .then(data => {
                // Verifica si se recibieron datos
                if (data.length > 0) {

                    // Añade las opciones de motivos al elemento select
                    data.forEach(row => {
                        motivoExamenSelect.innerHTML += "<option value='" + row.id + "'>" + row.descripcion + "</option>";
                    });
                } else {
                    console.log("llenarSelectMotivoExamen(): No se encontraron datos.");
                }
            })
            .catch(error => {
                console.error("llenarSelectMotivoExamen(): ", error);
            });
    }
    // #################################################################################################################

    function llenarDataListEmpresasInstituciones(){
        let url = "../controllers/CatalogosController.php?obtener=empresasinstituciones";
        fetch(url)
            .then(response => response.json())
            .then(data => {
                if (data.length > 0) {
                    data.forEach(row => {
                        dataListEmpresasInstituciones.innerHTML += "<option value='" + row.nombre_empresa_institucion + "'>" + row.nombre_empresa_institucion + "</option>";
                    });
                } else {
                    console.log("llenarDataListEmpresasInstituciones(): No se encontraron datos para las empresas o instituciones.");
                }
            })
            .catch(error => {
            console.error("llenarDataListEmpresasInstituciones(): Error en la solicitud. ", error);
            });

    }

    // Función para obtener fecha en formato: 2025-04-27 09:05:18
    function obtenerFechaActual() {
        const ahora = new Date();

        const anio = ahora.getFullYear();
        const mes = String(ahora.getMonth() + 1).padStart(2, '0'); // Mes comienza en 0
        const dia = String(ahora.getDate()).padStart(2, '0');

        const horas = String(ahora.getHours()).padStart(2, '0');
        const minutos = String(ahora.getMinutes()).padStart(2, '0');
        const segundos = String(ahora.getSeconds()).padStart(2, '0');

        return `${anio}-${mes}-${dia} ${horas}:${minutos}:${segundos}`;
    }

    function selectPaisValido(){
        return paisSelect.value !== "NULL";
    }
    function selectNivelEstudioValido(){
        return nivelEstudioSelect.value !== "NULL";
    }
    function selectGiroValido(){
        return giroSelect.value !== "NULL";
    }
    function selectCalificacionServicioValido(){
        return selectCalificacionServicio.value !== "NULL";
    }

    function selectEstadoValido(){
        if(paisSelect.value === "1"){
            return estadoSelect.value !== "NULL";
        }
        return true;
    }
    function selectMunicipioValido(){
        if(paisSelect.value === "1"){
            return municipioSelect.value !== "NULL";
        }
        return true;
    }
    function selectColoniaValido(){
        if(paisSelect.value === "1"){
            return coloniaSelect.value !== "NULL";
        }
        return true;
    }

    function validarMotivoOtro(){
        if(motivoExamenSelect.value === "9"){
            return motivoOtroInput.value.trim() !== "";
        }
        return true;
    }

    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - FUNCIONES

    // EVENTOS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    // Event listener para mostrar/ocultar el campo de motivo personalizado
    motivoExamenSelect.addEventListener("change", function() {
        if (motivoExamenSelect.value === "9") { // "Otro"
            motivoOtroContainer.style.display = "block";
            motivoOtroInput.setAttribute("required", "");
        } else {
            motivoOtroContainer.style.display = "none";
            motivoOtroInput.removeAttribute("required");
            motivoOtroInput.value = "";
        }
    });

    // Añadir un evento de cambio al select de país
    paisSelect.addEventListener("change", function() {
        // Si el país es México, habilitar el campo de código postal
        if (paisSelect.value === "1") {
            inputCodigoPostal.removeAttribute("disabled");
            inputButtonBuscarCodigoPostal.removeAttribute("disabled");
        } else {
            inputCodigoPostal.value = "";
            inputCodigoPostal.setAttribute("disabled", "");
            inputButtonBuscarCodigoPostal.setAttribute("disabled", "");
            estadoSelect.removeAttribute("required");
            municipioSelect.removeAttribute("required");
            coloniaSelect.removeAttribute("required");
            estadoSelect.setAttribute("disabled", "");
            municipioSelect.setAttribute("disabled", "");
            coloniaSelect.setAttribute("disabled", "");
            estadoSelect.innerHTML = "<option value='NULL'>Seleccione su estado</option>";
            municipioSelect.innerHTML = "<option value='NULL'>Seleccione su municipio</option>";
            coloniaSelect.innerHTML = "<option value='NULL'>Seleccione su colonia</option>";
        }
    });

    //Añadir un evento al boton de buscar
    buscarBtn.addEventListener("click", function () {
        let inputCodigoPostal = document.getElementById("codigo_postal").value;

        //verificar si el codigo postal esta vacio
        if (inputCodigoPostal) {

            // Limpia los selects antes de llenarlos
            estadoSelect.innerHTML = "<option value='NULL'>Seleccione su estado</option>";
            municipioSelect.innerHTML = "<option value='NULL'>Seleccione su municipio</option>";
            coloniaSelect.innerHTML = "<option value='NULL'>Seleccione su colonia</option>";

            // Construye la URL para la solicitud
            let url = "../controllers/CatalogosController.php?codigo_postal=" + encodeURIComponent(inputCodigoPostal);

            // Realiza una solicitud HTTP GET a la URL especificada
            fetch(url)
                .then(response => {
                    //console.log("Estado de la respuesta:", response.status);
                    //console.log("Contenido de la respuesta:", response.json());

                    // Verifica si la respuesta del servidor es exitosa
                    if (!response.ok) {
                        throw new Error("Error en la respuesta del servidor");
                    }

                    // Convertir la respuesta a JSON
                    return response.json();
                })
                .then(data => {
                    // Verifica si se recibieron datos
                    if (data.length > 0) {

                        // Quitar disable a los selects
                        estadoSelect.removeAttribute("disabled");
                        estadoSelect.setAttribute("required", "required");
                        municipioSelect.removeAttribute("disabled");
                        municipioSelect.setAttribute("required", "required");
                        coloniaSelect.removeAttribute("disabled");
                        coloniaSelect.setAttribute("required", "required");

                        //Crea conjuntos para almacenar estados, ciudades y colonias
                        let estados = new Map();
                        let municipios = new Map();
                        let colonias = new Map();

                        // Itera sobre cada fila de datos recibidos
                        data.forEach(row => {
                            //console.log(row);
                            estados.set(row['id_estado'], row['estado']);
                            municipios.set(row['id_municipio'], row['municipio']);
                            colonias.set(row['id_colonia'], row['colonia']);
                        });

                        // Añade las opciones de estados al elemento select
                        for (let [id_estado, estado] of estados) {
                            estadoSelect.innerHTML += "<option value='" + id_estado + "'>" + estado + "</option>";
                        }

                        // Añade las opciones de ciudades al elemento select
                        for (let [id_municipio, municipio] of municipios) {
                            municipioSelect.innerHTML += "<option value='" + id_municipio + "'>" + municipio + "</option>";
                        }

                        // Añade las opciones de colonias al elemento select
                        for (let [id_colonia, colonia] of colonias) {
                            coloniaSelect.innerHTML += "<option value='" + id_colonia + "'>" + colonia + "</option>";
                        }

                    } else {
                        alert("No se encontraron datos para el código postal ingresado.");
                    }
                })
                .catch(error => {
                    console.error("Error en la solicitud:", error);
                });
        } else {
            alert("Por favor, ingrese un código postal.");
        }
    });

    formulario.addEventListener("submit", async(event) => {
        event.preventDefault();

        // Obtener valores de los campos
        const idCandidato = document.getElementById('id_candidato').value;
        const idPais = document.getElementById('id_pais').value;
        const codigoPostal = document.getElementById('codigo_postal').value;
        const idEstado = document.getElementById('id_estado').value;
        const idMunicipio = document.getElementById('id_municipio').value;
        const idColonia = document.getElementById('id_colonia').value;

        const idNivel = document.getElementById('id_nivel').value;
        const idGiro = document.getElementById('id_giro').value;
        const nombreEmpresa = document.getElementById('nombre_empresa').value.trim();
        const motivoExamen = document.getElementById('motivo_examen').value;
        const motivoOtro = document.getElementById('motivo_otro').value.trim();

        const calificacionServicio = document.getElementById('calificacion_servicio').value;
        const consentimientoPub = document.getElementById('consentimiento_pub').checked;

        const fechaSalida = obtenerFechaActual();


        let validaciones = [];

        if(!selectPaisValido()){
            validaciones.push("⦁ Seleccione un país. ");
        }
        if(!selectNivelEstudioValido()){
            validaciones.push("⦁ Seleccione un nivel de estudio.");
        }
        if(!selectGiroValido()){
            validaciones.push("⦁ Seleccione un giro. ");
        }
        if(!selectCalificacionServicioValido()){
            validaciones.push("⦁ Seleccione una calificación de servicio. ");
        }
        if(!selectEstadoValido()){
            validaciones.push("⦁ Seleccione un estado. ");
        }
        if(!selectMunicipioValido()){
            validaciones.push("⦁ Seleccione un municipio. ");
        }
        if(!selectColoniaValido()){
            validaciones.push("⦁ Seleccione una colonia. ");
        }
        if(!validarMotivoOtro()){
            validaciones.push("⦁ Ingrese un motivo. ");
        }

        if(validaciones.length > 0){
            alert("Campos del formulario sin llenar\n" + validaciones.join("\n"));
            return;
        }

        // Preparar datos para envío
        const formData = new FormData();
        formData.append("id_candidato", idCandidato);
        formData.append("id_pais", idPais);
        formData.append("codigo_postal", codigoPostal);
        formData.append("id_estado", idEstado);
        formData.append("id_municipio", idMunicipio);
        formData.append("id_colonia", idColonia);
        formData.append("id_nivel", idNivel);
        formData.append("id_giro", idGiro);

        formData.append("nombre_empresa_institucion", nombreEmpresa);
        formData.append("motivo_examen", motivoExamen);
        formData.append("motivo_op", motivoOtro);

        formData.append("calificacion_servicio", calificacionServicio);
        if (consentimientoPub) {
            formData.append("consentimiento_pub", 1);
        } else {
            formData.append("consentimiento_pub", 0);
        }

        formData.append("fecha_salida", fechaSalida);

        // TEST
        //alert("FORMULARIO ENVIADO");

        //TEST: Pintar en consola datos del formData
        for (let [key, value] of formData.entries()) {
            console.log(key + ": ", value);
        }

        try {
            const respuesta = await fetch('../controllers/RegistrarInfoCandidato.php', {
                method: "POST",
                body: formData,
            });

            const resultado = await respuesta.json();

            if (resultado.estado === "exitoso") {
                console.log(resultado.res);
                alert('Se guardó la información correctamente');
                window.location.href = 'agradecimiento-dc.html';
            } else if(resultado.estado === "error") {
                console.error("RegistrarInfoCandidato.php: " + resultado.res);
                alert("Ocurrió un error, intentelo más tarde.");
            }
        } catch (error) {
            alert("Ocurrió un error, intentelo más tarde.");
            console.error("Error en try-catch de fetch a RegistrarInfoCandidato: " + error.message);
        }
    });
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - EVENTOS
});

