if (coop_is_connected()) {

    $(document).ready(function() {
    // global var et const
        let search_input = $('[name="search_string"]'),
            search_res = $('#search_results'),
            list = $('#list .content'),
            working_area = $('#working_area'),
            env_template = $('#templates [data-type="envelops"]');

        // PouchDB sync actions listeners
        sync.on('change', function () {
            // handle change



        }).on('paused', function (err) {
        // replication paused (e.g. replication up to date, user went offline)
            if (err) {
                online = false;
            }


        })
            .on('active', function () {
            // replicate resumed (e.g. new changes replicating, user went back online)
            //update_completed_count();
                online = true;
            })
            .on('denied', function () {
            // a document failed to replicate (e.g. due to permissions)
            })
            .on('complete', function () {
            // handle complete
            })
            .on('error', function (err) {
            // handle error
                console.log('erreur sync');
                console.log(err);
            });
        var get_member_according_click = function(clicked_elt) {
            var member = null;
            let list_elt = list.find('[data-id="' + clicked_elt.attr('data-id') + '"]');

            if (list_elt.length > 0) {
                try {
                    member = JSON.parse(list_elt.attr('data-jss'));
                } catch (e) {
                    console.log(e);
                }

            }

            return member;
        };
        var update_member_data = function(data, callback) {
            dbc.put(data, function(err, result) {
                if (!err) {
                    if (callback) callback(result.rev);
                } else {
                    console.log(err);
                    if (err.name == 'conflict') {
                        if (callback) callback(false);
                        alert('Données en conflit avec autre version');
                    }
                }
            });
        };
        var page_cleaning = function() {
        //make sure all listners to be kicked off
            $('.del').off('click');
            $('.cb').off('click');
            $('.cbb').off('click');
            $('.genenv').off('click');
            $('.sres').off('click');
            working_area.hide();
            list.empty();
            search_res.empty();
            retrieve_all_members();
            search_input.val('');
        };

        var del_member_from_list = function() {
            let clicked = $(this);

            if (is_time_to('del', 1000)) {
                openModal(
                    "L'opération est irréversible, êtes-vous sûr de vouloir le supprimer ?",
                    function() {
                        try {
                        //Call django method (instead of pouchdb call)
                            post_form(
                                '/members/remove_member_from_mess_list',
                                {id: clicked.attr('data-id')},
                                function(err, result) {
                                    if (!err) {
                                        if (typeof(result.msg) != "undefined") {
                                            alert(result.msg);
                                        } else if (result.action === null) {
                                            display_msg_box('Données supprimées.');
                                            closeModal();
                                            page_cleaning();
                                        }
                                    }
                                }
                            );
                        } catch (e) {
                            console.log(e);
                        }
                    },
                    'oui'
                );

            }
        };

        var adapt_env_form_according_type = function() {
            let changed = $(this),
                checked = changed.prop('checked'),
                value = changed.val(),
                target_cont = $('.mconfirm').find('.content');

            if (checked == true && value == 'ch') {
                target_cont.show();
            } else {
                target_cont.hide();
            }
        };

        var adapt_env_form_according_checks_nb = function() {
            let changed = $(this),
                nb = changed.val(),
                target_cont = $('.mconfirm').find('.content_details');

            target_cont.empty();
            for (var i=0; i<nb; i++) {
                var p = $('<p>').text('#' + (i+1)+' ');

                $('<input>').attr('name', 'checks[]')
                    .attr('type', 'numeric')
                    .appendTo(p);
                p.appendTo(target_cont);
            }
        };
        var generate_envelops = function() {
            let clicked = $(this),
                mdata = get_member_according_click(clicked);

            if (mdata != null && is_time_to('generate_envelops')) {
                var form_tempate = env_template.clone();
                //Doesnt work ! (despite all is well defined....)

                form_tempate.find('[name="shares_euros"]').val(mdata.doc.data.amount_subscription);
                openModal(
                    form_tempate.html(),
                    function() {
                        //TODO form data coherence
                        let form = $('.mconfirm form');

                        form.find('[name="partner_id"]').val(mdata.doc.data.id);
                        form.find('[name="partner_name"]').val(mdata.doc.data.name);
                        post_form(
                            '/members/create_envelops', new FormData(form.get(0)),
                            function(err, rData) {
                                //{"result": [[true, "ch_1598556858.58975", "3-02ad21f3d8169a8e947cba3ae1b3dbec"]]}
                                if (!err) {
                                    if (typeof rData.result != "undefined") {
                                        if (rData.result.length > 0) {
                                            let res = rData.result;

                                            try {
                                                if (res[0][0] == true) {
                                                    clicked.text('Enveloppe(s) générée(s)').removeClass('btn--primary');
                                                    clicked.off("click");
                                                    mdata.doc.data.envelops = true;
                                                    update_member_data(mdata.doc, function(new_rev) {
                                                        if (new_rev) {
                                                            mdata.doc._rev = new_rev;
                                                            list.find('[data-id="' + clicked.attr('data-id') + '"]')
                                                                .attr('data-jss', JSON.stringify(mdata));
                                                        }

                                                    });
                                                    closeModal();
                                                }
                                            } catch (e1) {
                                                alert(JSON.stringify(e1));
                                            }
                                        }

                                    } else {
                                        alert(JSON.stringify(rData));
                                    }

                                } else {
                                    alert(JSON.stringify(err));
                                }

                            }
                        );

                    },
                    'Enregistrer'
                );
                //but works here (see above)
                $('.mconfirm').find('[name="shares_euros"]')
                    .val(mdata.doc.data.amount_subscription);
            }
        };

        var generate_base_and_barcode = function() {
            let clicked = $(this);

            if (is_time_to('generate_base_barcode')) {
                $.ajax('/members/generate_base_and_barcode/'+ clicked.attr('data-oid'))
                    .done(function(rData) {
                        if (typeof rData.done != "undefined" && rData.done == true) {
                            clicked.text('Numéro et Code-barre générés').removeClass('btn--primary');
                            clicked.off("click");
                            let mdata = get_member_according_click(clicked);

                            if (mdata != null) {
                                mdata.doc.data.barcode_base = 1;
                                mdata.doc.data.barcode = true;
                                update_member_data(mdata.doc, function(new_rev) {
                                    if (new_rev) {
                                        mdata.doc._rev = new_rev;
                                        list.find('[data-id="' + clicked.attr('data-id') + '"]')
                                            .attr('data-jss', JSON.stringify(mdata));
                                    }

                                });
                            }
                        }
                    });
            }
        };
        var generate_barcode = function() {
            let clicked = $(this);

            if (is_time_to('generate_barcode')) {
                $.ajax('/members/generate_barcode/'+ clicked.attr('data-oid'))
                    .done(function(rData) {
                        if (typeof rData.done != "undefined" && rData.done == true) {
                            clicked.text('Code-barre généré').removeClass('btn--primary');
                            clicked.off("click");
                            let mdata = get_member_according_click(clicked);

                            if (mdata != null) {
                                mdata.doc.data.barcode = true;
                                update_member_data(mdata.doc, function(new_rev) {
                                    if (new_rev) {
                                        mdata.doc._rev = new_rev;
                                        list.find('[data-id="' + clicked.attr('data-id') + '"]')
                                            .attr('data-jss', JSON.stringify(mdata));
                                    }

                                });
                            }
                        }
                    });
            }
        };

        var display_possible_actions = function() {
            let clicked = $(this),
                data = JSON.parse(clicked.attr('data-jss')),
                wc = working_area.find('.content');

            $('.del').off('click');
            $('.cb').off('click');
            $('.cbb').off('click');
            $('.genenv').off('click');
            wc.empty();
            $('<p>').html("<strong>" + data.doc.data.name + "</strong> (" + data.doc.data.email + ")")
                .appendTo(wc);
            $('<p>').text("Enregistrement Odoo : " + data.doc.data.create_date)
                .appendTo(wc);
            if (data.doc.data.active_tmpl_reg_line_count == 0) {
                $('<p>').text("Il n'y a pas de créneau enregistré.")
                    .appendTo(wc);
            }

            if (data.doc.data.envelops == false) {
                if (data.doc.data.total_partner_owned_share > 0) {
                    $('<p>').html("<strong>" + data.doc.data.amount_subscription+ "</strong> € de souscription")
                        .appendTo(wc);
                    $('<p>').text("Il n'y a pas d'enveloppe à ce nom.")
                        .appendTo(wc);
                    $('<button>').attr('data-oid', data.doc.data.id)
                        .attr('data-id', data.id)
                        .addClass('btn btn--primary genenv')
                        .text('Générer les enveloppes')
                        .appendTo(wc);
                } else {
                    $('<p>').text("Il n'y a pas de capital souscrit")
                        .appendTo(wc);
                }

            }

            if (data.doc.data.barcode_base == false) {
                $('<button>').attr('data-oid', data.doc.data.id)
                    .attr('data-id', data.id)
                    .addClass('btn btn--primary cbb')
                    .text('Générer le numéro de coop.')
                    .appendTo(wc);
            }
            if (data.doc.data.barcode == false && data.doc.data.barcode_base != false) {
                $('<button>').attr('data-oid', data.doc.data.id)
                    .attr('data-id', data.id)
                    .addClass('btn btn--primary cb')
                    .text('Générer le code-barre')
                    .appendTo(wc);
            }
            $('<button>').attr('data-id', data.id)
                .addClass('btn btn--danger del')
                .text('Supprimer de la liste')
                .appendTo(wc);
            /*
       $('<p>').text(JSON.stringify(data.doc.data))
          .appendTo(wc)
        */
            $('.del').click(del_member_from_list);
            $('.cb').click(generate_barcode);
            $('.cbb').click(generate_base_and_barcode);
            $('.genenv').click(generate_envelops);
            working_area.show();
        };
        var add_res_to_list = function(jss) {
            console.log(jss);
            let data = JSON.parse(jss),
                dsha1 = sha1(jss),
                member = {_id: dsha1, data: data, hash: dsha1 };

            dbc.put(member, function callback(err) {
                if (!err) {
                    closeModal();
                    page_cleaning();
                } else {
                    console.log(err);
                }
            });
        };

        var ask_for_add_to_list = function() {
            let clicked = $(this),
                msg = 'On ajoute ' + clicked.text() + ' à la liste ?';

            openModal(
                msg,
                function() {
                    add_res_to_list(clicked.attr('data-jss'));
                },
                'oui'
            );
        };
        var display_found_members_for_selection = function (members) {
            $.each(members, function(i, e) {
                try {
                    var item = $('<div>').attr('data-jss', JSON.stringify(e))
                        .addClass('sres')
                        .text(e.name + ' (' + e.email + ')');

                    item.appendTo(search_res);

                } catch (err) {
                    console.log(err);
                }
            });
            $('.sres').click(ask_for_add_to_list);
        };
        var raw_search_member = function() {
            if (is_time_to('search')) {
                let needle = search_input.val().trim();

                if (needle.length > 0) {
                    $.ajax('/members/raw_search?needle='+needle)
                        .done(function(rData) {
                            $('.sres').off('click');
                            search_res.empty();
                            if (typeof rData.members != "undefined" && rData.members.length > 0) {
                                display_found_members_for_selection(rData.members);
                            }
                        });
                }
            }

        };

        async function retrieve_all_members() {
            let response = await fetch('/members/problematic_members');
            let problematic_members = await response.json();

            dbc.allDocs({include_docs: true, descending: true}, function(err, resp) {
                if (err) {
                    return console.log(err);
                }
                $.each(resp.rows, function(i, e) {
                    var item = $('<div>').attr('data-jss', JSON.stringify(e))
                        .attr('data-id', e.id)
                        .addClass('known')
                        .addClass('item')
                        .text(e.doc.data.name + ' (' + e.doc.data.email +')');

                    item.appendTo(list);

                });
                $('.item').click(display_possible_actions);

                // dispatch_coops_in_boxes();
                return null;
            });

            console.log(problematic_members);
        }
        retrieve_all_members();
        $('button.search').click(raw_search_member);
        $(document).on('change', '[name="payment_meaning"]', adapt_env_form_according_type);
        $(document).on('change', '[name="checks_nb"]', adapt_env_form_according_checks_nb);

    });
}