var orders_table = null,
    orders = [],
    main_content = $('#main-content'),
    checkbox = '<input type = "checkbox" />',
    print_icon = '<i class="fas fa-print"></i>',
    eye = '<i class="fas fa-eye"></i>',
    delete_icon = '<i class="fas fa-trash"></i>',
    cart_details = $('#templates .cart-details'),
    cart_destroy_msg = $('#templates .destroy-cart-msg'),
    multiple_carts_destroy_msg = $('#templates .destroy-multiple-carts-msg'),
    multiple_carts_item_destroy = $('#templates .destroy-multiple-carts-item'),
    remove_closing_date_msg = $('#templates .remove-closing-date-msg'),
    internal_get_msg = $('#templates .get-cart-ref'),
    main_msg_area = $('#main-msg-area'),
    waiting_for_display = {'new': [], 'update': [], 'delete': []},
    cart_id = null,
    cart_revisions = {},
    shop_settings = null,
    loading_img = $('#rotating_loader').clone()
        .removeAttr('id')
        .addClass('rotating_loader');

/** pouchdb listner **/
sync.on('change', function (info) {
    // handle change
    //console.log(info)
    try {
        if (info.direction == "pull") {
        //new order or updated order from another brow
            $.each(info.change.docs, function(i, e) {

                updateWaitingForDisplayWithNewArrival(e);
            });
        }
    } catch (err) {
        console.log(err);
    }
}).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)
        online = true;

    })
    .on('denied', function (err) {
    // a document failed to replicate (e.g. due to permissions)
    })
    .on('complete', function (info) {
    // handle complete
    //never triggered with live = true (only if replication is cancelled)

    })
    .on('error', function (err) {
    // handle error
        console.log('erreur sync');
        console.log(err);
    });

var putLoadingImgOn = function(target) {
    target.append(loading_img);
};
var removeLoadingImg = function() {
    $('.rotating_loader').remove();
};

var updateWaitingForDisplayWithNewArrival = function(doc) {
    var type = 'new';

    if (typeof doc._deleted == "undefined") {
        var date = new Date(parseInt(doc.submitted_time*1000, 10));

        doc.total = parseFloat(doc.total).toFixed(2);
        doc.h_submitted_date = format_date_to_sortable_string(date);
        // check if it's a new order or an updated one
        if (orders_table) {
            var found = false;

            $.each(orders_table.rows().ids(), function(idx, id) {
                if (id == doc._id) found = true;
            });
            if (found == true) type = 'update';
        }
    } else {
        type = 'delete';
    }


    waiting_for_display[type].push(doc);
    updateArrivalsMsg();

};
var updateArrivalsMsg = function () {
    for (type in waiting_for_display) {
        var target = main_msg_area.find('.' + type + ' span');
        var nb = waiting_for_display[type].length;
        var w = "nouvelle";

        if (type == 'update') {
            w = "modifiée";
        } else if (type == "delete") {
            w = "supprimée";
        }
        if (nb > 1) w += 's';
        var msg = ('00' + nb).slice(-3) + ' ' + w;

        target.text(msg);
    }
    main_msg_area.show();

};

var downloadArrivals = function () {
    window.location.reload();

};



function coop_init_datatable(params, data, domsel, cols, action_btn) {
    var buttons = [];
    var columns = [];


    columns.push({
        data: null,
        defaultContent: checkbox,
        orderDataType: "dom-checkbox",
        title: "Sél.",
        className: 'order_selector',
        width: '3%',
        targets:   0
    });
    $.each(cols, function(i, e) {
        columns.push(e);
    });

    columns.push({
        data: null,
        defaultContent: eye,
        orderable: false,
        width: "30px",
        className: 'action',
        targets:   0
    });
    columns.push({
        data: null,
        defaultContent: print_icon,
        orderable: false,
        width: "30px",
        className: 'action',
        targets:   0
    });

    columns.push({
        data: null,
        defaultContent: delete_icon,
        orderable: false,
        width: "30px",
        className: 'action',
        targets:   0
    });

    var settings = {
        dom: '<lf<t>ip><"clear"><B>',
        lengthMenu : [
            [
                50,
                100,
                150,
                200,
                -1
            ],
            [
                50,
                100,
                150,
                200,
                'Tout'
            ]
        ],
        pageLength : 50,
        buttons: buttons,

        columns: columns,
        //select: select ,
        rowId : "_id",
        data : data,
        language: {url : '/static/js/datatables/french.json'}
    };

    if (params) {
        if (params.page) {
            settings.displayStart = params.page.start;
        }
        if (params.ordering) {
            settings.order = params.ordering;
        }
    }

    return main_content.find('table'+domsel).DataTable(settings);
}
function init_and_fill_order_list() {

    dbc.allDocs({include_docs: true, descending: true}, function(err, resp) {
        if (err) {
            return console.log(err);
        }
        var data = [];

        $.each(resp.rows, function(i, e) {
            if (e.doc.state == 'init') {
                var date = new Date(parseInt(e.doc.init_time*1000, 10));

                e.doc.total = parseFloat(e.doc.total).toFixed(2);
                e.doc.h_init_date = format_date_to_sortable_string(date);
                data.push(e.doc);
            }
        });
        if (orders_table)
            orders_table.destroy();
        var cols = [
            {data: 'h_init_date', title: "Date init"},
            {data: 'partner.display_name', title: "Nom"},
            {data: 'best_date', title: "Livraison"}

        ];

        orders_table = coop_init_datatable(null, data, '.orders', cols);
    });


}

// Get the selected rows in the table
var getSelectedRows = function() {
    if (orders_table) {
        return orders_table.rows('.selected');
    } else {
        return null;
    }
};

// Set a row as selected : a row is selected if selection checkbox is checked
var selectRow = function() {
    var clicked = $(this);
    var cb = clicked.find('input[type="checkbox"]');

    if (cb.is(":checked")) {
        clicked.parent().addClass('selected');
    } else {
        clicked.parent().removeClass('selected');
    }

    // Display batch action selector & button if more than 1 row selected
    var selected = getSelectedRows();

    if (selected[0].length > 1) {
        $('#multiple_actions_container').slideDown('fast');
    } else {
        $('#multiple_actions_container').slideUp('fast');
    }
};

// Deselect rows from the table
var unselectRows = function(selected_rows) {
    for (row_id in selected_rows[0]) {
        var row = orders_table.row(row_id);

        $(row.node()).find('input[type="checkbox"]')
            .prop('checked', false);
        row.deselect();
    }
};

var removeRows = function(selected_rows) {
    selected_rows.remove().draw();
};

var updateCouchDB = function(data, callback) {
    var clicked = data.clicked;

    delete data.clicked;
    data.state_change_ts = format_date_to_sortable_string(new Date());

    dbc.put(data, function(err, result) {
        if (!err) {
            if (result.ok === true) {
                var r = clicked.parents('tr');

                data._rev = result.rev;
                orders_table.row(r).data(data)
                    .draw();
                rowUpdate(r, data);
            }
            callback(result);
        } else {
            callback(null);
            console.log(err);
        }
    });
};


var rowGetData = function(clicked) {
    var row = orders_table.row(clicked.parents('tr'));


    return row.data();
};



var printCart = function(cart_id, callback) {
    // Send request & diret download pdf
    var filename = "Commande_" + cart_id + ".pdf";

    $.ajax({
        url: "admin/print_cart",
        data: {id : cart_id}

        //TODO : find a way to test if answer is really a PDF (test with sucess: function(rData){...} -> download.bind doesn't work inside)
    })
        .done(download.bind(true, "pdf", filename))
        .always(function(rData) {
            callback(rData.split("\n").shift()
                .indexOf('%PDF-') == 0); // true returned data is a PDF doc
        });
};
var showCart = function() {
    var row = orders_table.row($(this).parents('tr'));
    var data = row.data();

    if (typeof data === "undefined") {
        data = arguments[0];
    }
    var cart = cart_details.clone();

    cart.find('.member').text(data.partner.display_name);
    var tbody = cart.find('tbody');

    $.each(data.products, function(i, e) {
        var tr = $('<tr>');

        tr.append($('<td>').text(e.name));
        tr.append($('<td>').text(e.qty));
        tr.append($('<td>').text(e.price));
        tbody.append(tr);
    });
    cart.append('<br>');
    cart.append('Info récupération : ' + data.best_date);

    openModal(
        cart.html(),
        function() {
            printCart(data._id, function(res) {
                if (res == false) {
                    //data retrieved was not a PDF
                }
            });
        },
        'Imprimer'
    );
};
var addMemberAndDateToMsg = function (msg, data) {
    var date = data.h_init_date;

    msg.find('.member').text(data.partner.display_name);
    msg.find('.date').text(date);
};

var deleteCart = function() {
    var clicked = $(this);
    var data = rowGetData(clicked);
    var msg = cart_destroy_msg.clone();

    addMemberAndDateToMsg(msg, data);

    if (data.best_date.length > 0)
        msg.find('.bdate').text(' , Info livraison : ' + data.best_date);

    openModal(
        msg.html(),
        function() {
        // Confirm button callback
            openModal();

            post_form(
                '/shop/admin/delete_cart',
                {cart_id: data._id},
                function(err, result) {
                    if (!err) {
                        if (typeof result.res !== "undefined" && typeof result.res.del_action !== "undefined") {
                            clicked.parents('tr').remove();
                            alert("Commande définitivement détruite");
                        } else {
                            console.log(result);
                        }

                    } else {
                        console.log(err);
                    }

                    closeModal();
                }
            );
        },
        'Détruire',
        false
    );

};

// Delete multiple orders
var batch_delete = function() {
    var selected_rows = getSelectedRows();

    if (selected_rows[0].length > 0) {
        var msg = multiple_carts_destroy_msg.clone();

        var rows_data = selected_rows.data();
        var carts_id = [];

        for (var i = 0; i < rows_data.length; i++) {
            carts_id.push(rows_data[i]._id);

            var msg_item = multiple_carts_item_destroy.clone();

            addMemberAndDateToMsg(msg_item, rows_data[i]);
            if (rows_data[i].best_date.length > 0)
                msg_item.find('.bdate').text(' , Info livraison : ' + rows_data[i].best_date);

            msg.find('.items').append(msg_item);
        }

        openModal(
            msg.html(),
            function() {
                // Confirm button callback
                if (is_time_to('delete_orders', 5000)) { // prevent double click or browser hic up bug
                    openModal();

                    post_form(
                        '/shop/admin/batch_delete_carts',
                        {carts_id: carts_id},
                        function(err, result) {
                            if (!err) {
                                if (typeof result.res !== "undefined" && result.res.length > 0) {
                                    removeRows(selected_rows);
                                    $('#multiple_actions_container').slideUp('fast');
                                    alert("Commandes définitivement détruites");
                                } else {
                                    console.log(result);
                                }

                            } else {
                                console.log(err);
                            }

                            closeModal();
                        }
                    );
                }
            },
            'Détruire',
            false
        );
    }
};



$(function() {
    if (coop_is_connected()) {
        init_and_fill_order_list();
        /* Make search accent insensitive */

        $(document).on('keyup', '#main_content input[type="search"]', function() {
            orders_table
                .search(jQuery.fn.DataTable.ext.type.search.string(this.value))
                .draw();
        });
        $(document).on('click', '.orders .fa-trash', deleteCart);
        $(document).on('click', '#download-arrivals', downloadArrivals);
        $(document).on('click', '#batch_action', function() {
            var action = $(this).parent()
                .find('#batch_action_select option:selected')
                .val();

            if (action == "delete") {
                batch_delete();
            }
        });

    }
});