<label for="moduleimpl_select">
    Module
    <select id="moduleimpl_select" class="dynaSelect">
        <option value="" selected> Non spécifié </option>
        <option value="autre"> Autre </option>
    </select>
</label>


<script>

    function getEtudFormSemestres() {
        let semestre = {};
        sync_get(getUrl() + `/api/etudiant/etudid/${etudid}/formsemestres`, (data) => {
            semestre = data;
        });
        return semestre;
    }

    function filterFormSemestres(semestres, dateIso) {
        const date = new moment.tz(
            dateIso,
            TIMEZONE
        );

        semestres = semestres.filter((fm) => {
            return date.isBetween(fm.date_debut_iso, fm.date_fin_iso, null, '[]')
        })

        return semestres;
    }

    function getFormSemestreProgramme(fm_id) {
        let semestre = {};
        sync_get(getUrl() + `/api/formsemestre/${fm_id}/programme`, (data) => {
            semestre = data;
        });
        return semestre;
    }

    function getModulesImplByFormsemestre(semestres) {
        const map = new Map();

        semestres.forEach((fm) => {
            const array = [];

            const fm_p = getFormSemestreProgramme(fm.formsemestre_id);
            ["ressources", "saes", "modules"].forEach((r) => {
                if (r in fm_p) {
                    fm_p[r].forEach((o) => {
                        array.push(getModuleInfos(o))
                    })
                }
            })

            map.set(fm.titre_num, array)
        })

        return map;
    }

    function getModuleInfos(obj) {
        return {
            moduleimpl_id: obj.moduleimpl_id,
            titre: obj.module.titre,
            code: obj.module.code,
        }
    }


    function populateSelect(sems, selected, query) {
        const select = document.querySelector(query);
        select.innerHTML = `<option value=""> Non spécifié </option><option value="autre"> Autre </option>`
        sems.forEach((mods, label) => {
            const optGrp = document.createElement('optgroup');
            optGrp.label = label

            mods.forEach((obj) => {
                const opt = document.createElement('option');
                opt.value = obj.moduleimpl_id;
                opt.textContent = `${obj.code} ${obj.titre}`
                if (obj.moduleimpl_id == selected) {
                    opt.setAttribute('selected', 'true');
                }

                optGrp.appendChild(opt);
            })
            select.appendChild(optGrp);
        })
        if (selected === "autre") {
            select.querySelector('option[value="autre"]').setAttribute('selected', 'true');
        }
    }

    function updateSelect(moduleimpl_id, query = "#moduleimpl_select", dateIso = null) {
        let sem = getEtudFormSemestres()
        if (dateIso == null) {
            dateIso = document.querySelector("#tl_date").value
        }
        sem = filterFormSemestres(sem, dateIso)
        const mod = getModulesImplByFormsemestre(sem)
        populateSelect(mod, moduleimpl_id, query);
    }

    function updateSelectedSelect(moduleimpl_id, query = "#moduleimpl_select") {
        const mod_id = moduleimpl_id != null ? moduleimpl_id : ""
        document.querySelector(query).value = mod_id;
    }



    window.addEventListener("load", () => {
        document.getElementById('moduleimpl_select').addEventListener('change', (el) => {
            const assi = getCurrentAssiduite(etudid);
            if (assi) {
                editAssiduite(assi.assiduite_id, assi.etat);
            }
        })

        const conflicts = getAssiduitesConflict(etudid);
        if (conflicts.length > 0) {
            updateSelectedSelect(conflicts[0].moduleimpl_id);
        }
    }, { once: true });



</script>

<style>
    #moduleimpl_select {
        width: 125px;
        text-overflow: ellipsis;
    }
</style>