sources = [];
sources_notes_display = [];
dests = [];
dests_notes_display = [];

function refreshHistory() {
    $("#history").load("/note/transfer/ #history");
}

function reset(refresh=true) {
    sources_notes_display.length = 0;
    sources.length = 0;
    dests_notes_display.length = 0;
    dests.length = 0;
    $("#source_note_list").html("");
    $("#dest_note_list").html("");
    $("#amount").val("");
    $("#reason").val("");
    $("#last_name").val("");
    $("#first_name").val("");
    $("#bank").val("");
    $("#user_note").val("");
    $("#profile_pic").attr("src", "/media/pic/default.png");
    if (refresh) {
        refreshBalance();
        refreshHistory();
    }
}

$(document).ready(function() {
    /**
     * If we are in credit/debit mode, check that only one note is entered.
     * More over, get first name and last name to autocomplete fields.
     */
    function checkUniqueNote() {
        if ($("#type_credit").is(":checked") || $("#type_debit").is(":checked")) {
            let arr = $("#type_credit").is(":checked") ? dests_notes_display : sources_notes_display;

            if (arr.length === 0)
                return;

            let last = arr[arr.length - 1];
            arr.length = 0;
            arr.push(last);

            last.quantity = 1;

            if (!last.note.user) {
                $.getJSON("/api/note/note/" + last.note.id + "/?format=json", function(note) {
                    last.note.user = note.user;
                    $.getJSON("/api/user/" + last.note.user + "/", function(user) {
                        $("#last_name").val(user.last_name);
                        $("#first_name").val(user.first_name);
                    });
                });
            }
            else {
                $.getJSON("/api/user/" + last.note.user + "/", function(user) {
                    $("#last_name").val(user.last_name);
                    $("#first_name").val(user.first_name);
                });
            }
        }

        return true;
   }

    autoCompleteNote("source_note", "source_note_list", sources, sources_notes_display,
        "source_alias", "source_note", "user_note", "profile_pic", checkUniqueNote);
    autoCompleteNote("dest_note", "dest_note_list", dests, dests_notes_display,
        "dest_alias", "dest_note", "user_note", "profile_pic", checkUniqueNote);

    let source = $("#source_note");
    let dest = $("#dest_note");

    $("#type_transfer").click(function() {
        $("#special_transaction_div").addClass('d-none');
        source.attr('disabled', false);
        $("#source_note_list").removeClass('d-none');
        dest.attr('disabled', false);
        $("#dest_note_list").removeClass('d-none');
    });

    $("#type_credit").click(function() {
        $("#special_transaction_div").removeClass('d-none');
        $("#source_note_list").addClass('d-none');
        $("#dest_note_list").removeClass('d-none');
        source.attr('disabled', true);
        source.val($("#credit_type option:selected").text());
        source.tooltip('hide');
        dest.attr('disabled', false);
        dest.val('');
        dest.tooltip('hide');

        if (dests_notes_display.length > 1) {
            $("#dest_note_list").html('');
            dests_notes_display.length = 0;
        }
    });

    $("#type_debit").click(function() {
        $("#special_transaction_div").removeClass('d-none');
        $("#source_note_list").removeClass('d-none');
        $("#dest_note_list").addClass('d-none');
        source.attr('disabled', false);
        source.val('');
        source.tooltip('hide');
        dest.attr('disabled', true);
        dest.val($("#credit_type option:selected").text());
        dest.tooltip('hide');

        if (sources_notes_display.length > 1) {
            $("#source_note_list").html('');
            sources_notes_display.length = 0;
        }
    });

        $("#credit_type").change(function() {
            let type = $("#credit_type option:selected").text();
            if ($("#type_credit").is(":checked"))
                source.val(type);
            else
                dest.val(type);
        });

    // Ensure we begin in transfer mode. Removing these lines may cause problems when reloading.
    let type_transfer = $("#type_transfer"); // Default mode
    type_transfer.removeAttr('checked');
    $("#type_credit").removeAttr('checked');
    $("#type_debit").removeAttr('checked');
    $("label[for='type_transfer']").attr('class', 'btn btn-sm btn-outline-primary');
    $("label[for='type_credit']").attr('class', 'btn btn-sm btn-outline-primary');
    $("label[for='type_debit']").attr('class', 'btn btn-sm btn-outline-primary');

    if (location.hash)
        $("#type_" + location.hash.substr(1)).click();
    else
        type_transfer.click();
    location.hash = "";

    $("#source_me").click(function() {
        // Shortcut to set the current user as the only emitter
        reset(false);

        let source_note = $("#source_note");
        source_note.focus();
        source_note.val("");
        let event = jQuery.Event("keyup");
        event.originalEvent = {charCode: 97};
        source_note.trigger(event);
        source_note.val(username);
        event = jQuery.Event("keyup");
        event.originalEvent = {charCode: 97};
        source_note.trigger(event);
        let fill_note = function() {
            if (sources.length === 0) {
                setTimeout(fill_note, 100);
                return;
            }
            event = jQuery.Event("keypress");
            event.originalEvent = {charCode: 13};
            source_note.trigger(event);

            source_note.tooltip('hide');
            source_note.val('');
            $("#dest_note").focus();
        };
        fill_note();
    });
});

$("#btn_transfer").click(function() {
    if ($("#type_transfer").is(':checked')) {
        sources_notes_display.forEach(function (source) {
            dests_notes_display.forEach(function (dest) {
                $.post("/api/note/transaction/transaction/",
                    {
                        "csrfmiddlewaretoken": CSRF_TOKEN,
                        "quantity": source.quantity * dest.quantity,
                        "amount": 100 * $("#amount").val(),
                        "reason": $("#reason").val(),
                        "valid": true,
                        "polymorphic_ctype": TRANSFER_POLYMORPHIC_CTYPE,
                        "resourcetype": "Transaction",
                        "source": source.note.id,
                        "source_alias": source.name,
                        "destination": dest.note.id,
                        "destination_alias": dest.name
                    }).done(function () {
                        addMsg("Le transfert de "
                            + pretty_money(source.quantity * dest.quantity * 100 * $("#amount").val()) + " de la note " + source.name
                            + " vers la note " + dest.name + " a été fait avec succès !", "success");

                        reset();
                    }).fail(function (err) { // do it again but valid = false
                        $.post("/api/note/transaction/transaction/",
                        {
                            "csrfmiddlewaretoken": CSRF_TOKEN,
                            "quantity": source.quantity * dest.quantity,
                            "amount": 100 * $("#amount").val(),
                            "reason": $("#reason").val(),
                            "valid": false,
                            "invalidity_reason": "Solde insuffisant",
                            "polymorphic_ctype": TRANSFER_POLYMORPHIC_CTYPE,
                            "resourcetype": "Transaction",
                            "source": source.note.id,
                            "source_alias": source.name,
                            "destination": dest.note.id,
                            "destination_alias": dest.name
                        }).done(function () {
                            addMsg("Le transfert de "
                                + pretty_money(source.quantity * dest.quantity * 100 * $("#amount").val()) + " de la note " + source.name
                                + " vers la note " + dest.name + " a échoué : Solde insuffisant", "danger");

                            reset();
                        }).fail(function (err) {
                            addMsg("Le transfert de "
                                + pretty_money(source.quantity * dest.quantity * 100 * $("#amount").val()) + " de la note " + source.name
                                + " vers la note " + dest.name + " a échoué : " + err.responseText, "danger");

                            reset();
                    });
                });
            });
        });
    } else if ($("#type_credit").is(':checked') || $("#type_debit").is(':checked')) {
        let special_note = $("#credit_type").val();
        let user_note;
        let given_reason = $("#reason").val();
        let source, dest, reason;
        if ($("#type_credit").is(':checked')) {
            user_note = dests_notes_display[0].note.id;
            source = special_note;
            dest = user_note;
            reason = "Crédit " + $("#credit_type option:selected").text().toLowerCase();
            if (given_reason.length > 0)
                reason += " (" + given_reason + ")";
        }
        else {
            user_note = sources_notes_display[0].note.id;
            source = user_note;
            dest = special_note;
            reason = "Retrait " + $("#credit_type option:selected").text().toLowerCase();
            if (given_reason.length > 0)
                reason += " (" + given_reason + ")";
        }
        $.post("/api/note/transaction/transaction/",
            {
                "csrfmiddlewaretoken": CSRF_TOKEN,
                "quantity": 1,
                "amount": 100 * $("#amount").val(),
                "reason": reason,
                "valid": true,
                "polymorphic_ctype": SPECIAL_TRANSFER_POLYMORPHIC_CTYPE,
                "resourcetype": "SpecialTransaction",
                "source": source,
                "source_alias": source.name,
                "destination": dest,
                "destination_alias": dest.name,
                "last_name": $("#last_name").val(),
                "first_name": $("#first_name").val(),
                "bank": $("#bank").val()
            }).done(function () {
                addMsg("Le crédit/retrait a bien été effectué !", "success");
                reset();
            }).fail(function (err) {
                addMsg("Le crédit/retrait a échoué : " + err.responseText, "danger");
                reset();
        });
    }
});