// Tableau recap notes
$(function () {
    $(function () {
        let hidden_colums = ["etud_codes", "identite_detail", "partition_aux", "partition_rangs", "admission", "col_empty"];
        let mode_jury_but_bilan = $('table.table_recap').hasClass("table_jury_but_bilan");
        if (mode_jury_but_bilan) {
            // table bilan décisions: cache les notes
            hidden_colums = hidden_colums.concat(["col_ue", "col_rcue", "col_lien_saisie_but"]);
        } else {
            hidden_colums = hidden_colums.concat(["recorded_code"]);
        }
        // Etat (tri des colonnes) de la table:

        const url = new URL(document.URL);
        const formsemestre_id = url.searchParams.get("formsemestre_id");
        const order_info_key = JSON.stringify([url.pathname, formsemestre_id]);
        const etudids_key = JSON.stringify(["etudids", url.origin, formsemestre_id]);
        const noms_key = JSON.stringify(["noms", url.origin, formsemestre_id]);
        let order_info;
        if (formsemestre_id) {
            const x = localStorage.getItem(order_info_key);
            if (x) {
                try {
                    order_info = JSON.parse(x);
                } catch (error) {
                    console.error(error);
                }
            }
        }

        // Les colonnes visibles étant mémorisé, il faut initialiser les titres des boutons
        function update_buttons_labels(dt) {
            dt.buttons('toggle_ident:name').text(dt.columns(".identite_detail").visible()[0] ? "Nom seul" : "Civ/Nom/Prénom");
            dt.buttons('toggle_partitions:name').text(dt.columns(".partition_aux").visible()[0] ? "Cacher les groupes" : "Montrer groupes");
            if (!$('table.table_recap').hasClass("table_jury_but")) {
                // Bouton "rangs groupes", sauf pour table jury BUT
                dt.buttons('toggle_partitions_rangs:name').text(dt.columns(".partition_rangs").visible()[0] ? "Cacher rangs groupes" : "Rangs groupes");
                dt.buttons('toggle_admission:name').text(dt.columns(".admission").visible()[0] ? "Cacher infos admission" : "Montrer infos admission");
            } else {
                // table jury BUT: avec ou sans codes enregistrés
                dt.buttons('toggle_recorded_code:name').text(dt.columns(".recorded_code").visible()[0] ? "Cacher codes jury" : "Code jury enregistrés");
            }

            // Boutons non visibles en mode jury:
            if (!$('table.table_recap').hasClass("jury")) {
                // Ces boutons dépendent du mode BUT ou classique:
                if ($('table.table_recap').hasClass("apc")) {
                    dt.buttons('toggle_res:name').text(dt.columns(".col_res").visible()[0] ? "Cacher les ressources" : "Montrer les ressources");
                    dt.buttons('toggle_sae:name').text(dt.columns(".col_sae").visible()[0] ? "Cacher les SAÉs" : "Montrer les SAÉs");
                } else {
                    dt.buttons('toggle_mod:name').text(dt.columns(".col_mod:not(.col_empty)").visible()[0] ? "Cacher les modules" : "Montrer les modules");
                }
                dt.buttons('toggle_col_empty:name').text(dt.columns(".col_empty").visible()[0] ? "Cacher mod. vides" : "Montrer mod. vides");
            }
        }

        let buttons = [
            {
                name: "toggle_ident",
                text: "Civ/Nom/Prénom",
                action: function (e, dt, node, config) {
                    let visible = dt.columns(".identite_detail").visible()[0];
                    dt.columns(".identite_detail").visible(!visible);
                    dt.columns(".identite_court").visible(visible);
                    update_buttons_labels(dt);
                }
            },
            {
                name: "toggle_partitions",
                text: "Montrer groupes",
                action: function (e, dt, node, config) {
                    let visible = dt.columns(".partition_aux").visible()[0];
                    dt.columns(".partition_aux").visible(!visible);
                    update_buttons_labels(dt);
                }
            },
        ];
        // Bouton "rangs groupes", sauf pour table jury BUT
        if (!$('table.table_recap').hasClass("table_jury_but")) {
            buttons.push(
                {
                    name: "toggle_partitions_rangs",
                    text: "Rangs groupes",
                    action: function (e, dt, node, config) {
                        let rangs_visible = dt.columns(".partition_rangs").visible()[0];
                        dt.columns(".partition_rangs").visible(!rangs_visible);
                        update_buttons_labels(dt);
                    }
                });
        } else {
            // table jury BUT: avec ou sans codes enregistrés
            buttons.push(
                {
                    name: "toggle_recorded_code",
                    text: "Code jury enregistrés",
                    action: function (e, dt, node, config) {
                        let visible = dt.columns(".recorded_code").visible()[0];
                        dt.columns(".recorded_code").visible(!visible);
                        update_buttons_labels(dt);
                    }
                });
        }

        if (!$('table.table_recap').hasClass("jury")) {
            buttons.push(
                $('table.table_recap').hasClass("apc") ?
                    {
                        name: "toggle_res",
                        text: "Visilité ressources",
                        action: function (e, dt, node, config) {
                            let visible = dt.columns(".col_res").visible()[0];
                            dt.columns(".col_res").visible(!visible);
                            dt.columns(".col_ue_bonus").visible(!visible);
                            dt.columns(".col_malus").visible(!visible);
                            update_buttons_labels(dt);
                        }
                    } : {
                        name: "toggle_mod",
                        text: "Cacher les modules",
                        action: function (e, dt, node, config) {
                            let visible = dt.columns(".col_mod:not(.col_empty)").visible()[0];
                            dt.columns(".col_mod:not(.col_empty)").visible(!visible);
                            dt.columns(".col_ue_bonus").visible(!visible);
                            dt.columns(".col_malus").visible(!visible);
                            update_buttons_labels(dt);
                        }
                    }
            );
            if ($('table.table_recap').hasClass("apc")) {
                buttons.push({
                    name: "toggle_sae",
                    text: "Visibilité SAÉs",
                    action: function (e, dt, node, config) {
                        let visible = dt.columns(".col_sae").visible()[0];
                        dt.columns(".col_sae").visible(!visible);
                        update_buttons_labels(dt);
                    }
                })
            }
            buttons.push({
                name: "toggle_col_empty",
                text: "Visibilité mod. vides",
                action: function (e, dt, node, config) {
                    let visible = dt.columns(".col_empty").visible()[0];
                    dt.columns(".col_empty").visible(!visible);
                    update_buttons_labels(dt);
                }
            })
        }
        // Boutons admission, sauf pour table jury BUT
        if (!$('table.table_recap').hasClass("table_jury_but")) {
            buttons.push({
                name: "toggle_admission",
                text: "Montrer infos admission",
                action: function (e, dt, node, config) {
                    let visible = dt.columns(".admission").visible()[0];
                    dt.columns(".admission").visible(!visible);
                    update_buttons_labels(dt);
                }
            });
        }
        try {
            let table = $('table.table_recap').DataTable(
                {
                    paging: false,
                    searching: true,
                    info: false,
                    autoWidth: false,
                    fixedHeader: {
                        header: true,
                        footer: false
                    },
                    orderCellsTop: true, // cellules ligne 1 pour tri 
                    aaSorting: [], // Prevent initial sorting
                    colReorder: true,
                    stateSave: true, // enregistre état de la table (tris, ...)
                    "columnDefs": [
                        {
                            // cache les codes, le détail de l'identité, les groupes, les colonnes admission et les vides
                            targets: hidden_colums,
                            visible: false,
                        },
                        {
                            // Elimine les 0 à gauche pour les exports excel et les "copy"
                            targets: ["col_mod", "col_moy_gen", "col_ue", "col_res", "col_sae", "evaluation", "col_rcue"],
                            render: function (data, type, row) {
                                return type === 'export' ? data.replace(/0(\d\..*)/, '$1') : data;
                            }
                        },
                        {
                            // Elimine les décorations (fleches bonus/malus) pour les exports
                            targets: ["col_ue_bonus", "col_malus"],
                            render: function (data, type, row) {
                                return type === 'export' ? data.replace(/.*(\d\d\.\d\d)/, '$1').replace(/0(\d\..*)/, '$1') : data;
                            }
                        },
                    ],
                    dom: 'Bfrtip',
                    buttons: [
                        {
                            extend: 'copyHtml5',
                            text: 'Copier',
                            exportOptions: { orthogonal: 'export' }
                        },
                        {
                            extend: 'excelHtml5',
                            // footer: true, // ne fonctionne pas ?
                            exportOptions: { orthogonal: 'export' },
                            title: document.querySelector('table.table_recap').dataset.filename
                        },
                        {
                            extend: 'collection',
                            text: 'Colonnes affichées',
                            autoClose: true,
                            buttons: buttons,
                        },
                    ],
                    "drawCallback": function (settings) {
                        // permet de conserver l'ordre de tri des colonnes
                        let order_info = JSON.stringify($('table.table_recap').DataTable().order());
                        if (formsemestre_id) {
                            localStorage.setItem(order_info_key, order_info);
                        }
                        let etudids = [];
                        document.querySelectorAll("td.identite_court").forEach(e => {
                            etudids.push(e.dataset.etudid);
                        });
                        let noms = [];
                        document.querySelectorAll("td.identite_court").forEach(e => {
                            noms.push(e.dataset.nomprenom);
                        });
                        localStorage.setItem(etudids_key, JSON.stringify(etudids));
                        localStorage.setItem(noms_key, JSON.stringify(noms));
                    },
                    "order": order_info,
                }
            );
        } catch (error) {
            // l'erreur peut etre causee par un ancien storage:
            localStorage.removeItem(etudids_key);
            localStorage.removeItem(noms_key);
            localStorage.removeItem(order_info_key);
            location.reload();
        }
        update_buttons_labels(table);
    });
    $('table.table_recap tbody').on('click', 'tr', function () {
        if ($(this).hasClass('selected')) {
            $(this).removeClass('selected');
        }
        else {
            $('table.table_recap tr.selected').removeClass('selected');
            $(this).addClass('selected');
        }
    });
    // Pour montrer et surligner l'étudiant sélectionné:
    $(function () {
        let row_selected = document.querySelector(".row_selected");
        if (row_selected) {
            /*row_selected.scrollIntoView();
            window.scrollBy(0, -50);*/
            row_selected.classList.add("selected");
        }
    });
});