var ArticleMatrixSelection = function ($) {
    "use strict";

    var me = {

        selector: {
            dataTable: '#kundeartikelpreise',
            dataTableForm: '#kundeartikelpreiseform',

            articleSelectionCheckboxes: '.articlematrix-checkbox',
            articleQuantityInputs: '.articlematrix-quantity',
            articleQuickAddButtons: '.articlematrix-quickadd',

            selectAllCheckbox: '#articlematrixselection-selectall-checkbox',
            insertButton: '#articlematrixselection-insert-button',
            resetButton: '#articlematrixselection-reset-button',
            backButton: '#profisuche-back-button'
        },

        /** @property Vorgangs-ID */
        processId: null,

        /** @property Vorgangstyp: Auftrag, Angebot, Rechnung, usw. */
        processType: null,

        /** @property URL für alle Ajax-Anfragen; es fehlt lediglich der "cmd" Parameter
        ajaxBaseUrl: null,

        /**
         * Modul initialisieren
         */
        init: function () {

            // Bei Bestellungen und (Preis-)Anfragen gibt es andere Selektoren.
            // Hier werden auch Einkaufspreise angezeigt; ansonten Verkaufspreise.
            if ($(me.selector.dataTable).length === 0) {
                me.selector.dataTable = '#lieferantartikelpreise';
                me.selector.dataTableForm = '#lieferantartikelpreiseform';
            }

            var $form = $(me.selector.dataTableForm);
            me.processId = parseInt($form.data('process-id'));
            me.processType = $form.data('process-type');

            if (me.processId <= 0) {
                console.warn('Vorgangs-ID ist ungültig: ' + me.processType + '(' + me.processId + ')');
                return;
            }
            if (me.processType === '') {
                console.warn('Vorgangstyp ist nicht gesetzt.');
            }

            me.ajaxBaseUrl =
                'index.php?module=ajax&action=articlematrixselection' +
                '&typ=' + me.processType + '&id=' + me.processId;

            me.attachEvents();
        },

        /**
         * Registriert alle benötigten Events
         */
        attachEvents: function () {

            // Einzelnen Artikel über QuickAdd-Button zu Positionen hinzufügen
            $(document).on('click', me.selector.articleQuickAddButtons, function (e) {
                e.preventDefault();
                me.quickAddArticle($(this));
            });

            // Bei Auswahl bzw. Mengeänderungen in Matrix > Auswahl in Userkonfiguration speichern
            $(document).on('change', me.selector.articleSelectionCheckboxes, me.saveSelection);
            $(document).on('change', me.selector.articleQuantityInputs, me.saveSelection);

            // "Alle auswählen" Checkbox
            $(document).on('change', me.selector.selectAllCheckbox, function () {
                var checked = $(this).prop('checked');
                me.selectAll(checked);
            });

            // Ausgewählte Artikel aus Matrix in Auftrag übernehmen
            $(document).on('click', me.selector.insertButton, function (e) {
                e.preventDefault();
                me.insertSelection();
            });

            // Matrix-Auswahl zurücksetzen
            $(document).on('click', me.selector.resetButton, function (e) {
                e.preventDefault();
                me.resetSelection();
            });

            // Bei Änderungen der DataTable (Sortierung, Seitenwechsel) > Matrix aus Userkonfiguration laden
            $(me.selector.dataTable).on('draw.dt', function () {
                me.loadSelection();
            });
        },

        /**
         * Artikelauswahl und -mengen laden + Felder füllen
         */
        loadSelection: function () {
            jQuery.ajax({
                type: 'POST',
                url: me.ajaxBaseUrl + '&cmd=get',
                success: function (data) {
                    me.fillMatrix(data);
                }
            });
        },

        /**
         * Checkboxen und Mengefelder füllen
         *
         * @param {Object} data
         */
        fillMatrix: function (data) {
            var verkaufpreisId;
            var selectAllChecked = true;

            // Erstmal alle Mengen- und Auswahlfelder zurücksetzen
            $(me.selector.articleSelectionCheckboxes).prop('checked', false);
            $(me.selector.articleQuantityInputs).val('');

            // Auswahlfelder setzen
            if (typeof data.auswahl !== 'undefined') {
                for (verkaufpreisId in data.auswahl) {
                    if (data.auswahl.hasOwnProperty(verkaufpreisId)) {
                        $('#articlematrix-checkbox-' + verkaufpreisId).prop('checked', true);
                    }
                }
            }

            // Mengenfelder ausfüllen
            if (typeof data.menge !== 'undefined') {
                for (verkaufpreisId in data.menge) {
                    if (data.menge.hasOwnProperty(verkaufpreisId)) {
                        var menge = parseInt(data.menge[verkaufpreisId]);
                        $('#articlematrix-quantity-' + verkaufpreisId).val(menge);
                    }
                }
            }

            // "Alle auswählen"-Checkbox setzen
            $(me.selector.articleSelectionCheckboxes).each(function (index, checkbox) {
                if ($(checkbox).prop('checked') === false) {
                    selectAllChecked = false;
                }
                $(me.selector.selectAllCheckbox).prop('checked', selectAllChecked);
            });
        },

        /**
         * Aktuelle Auswahl in Userkonfiguration speichern
         *
         * @param event jQuery-EventObject
         */
        saveSelection: function (event) {
            var elementType = event.target.type;
            var $element = $(event.target);

            // Checkbox wurde aktiviert bzw. deaktiviert
            if (elementType === 'checkbox') {
                var rowId = $element.data('id');
                var isChecked = $element.prop('checked');

                // Mengeneingabefeld selektieren
                var $inputElement = $('#articlematrix-quantity-' + rowId);
                var defaultQuantity = $inputElement.data('default-quantity');
                var currentQuantity = $inputElement.val();

                // Bei Aktivierung > Menge-Eingabefeld mit "Ab Menge" füllen
                if (isChecked === true && currentQuantity === '') {
                    $inputElement.val(defaultQuantity);
                }

                // Bei Deaktivierung > Menge-Eingabefeld leeren
                if (isChecked === false) {
                    $inputElement.val('');
                }
            }

            // Aktuelle Auswahl (aktive Checkboxen und Mengen) in Userkonfiguration speichern
            $.ajax({
                type: 'POST',
                url: me.ajaxBaseUrl + '&cmd=set',
                data: $(me.selector.dataTableForm).serializeArray()
            });
        },

        /**
         * Aktuelle Auswahl in Positionen übernehmen
         */
        insertSelection: function () {
            jQuery.ajax({
                type: 'POST',
                url: me.ajaxBaseUrl + '&cmd=get',
                success: function (data) {

                    if (typeof data.auswahl === 'undefined' || typeof data.menge === 'undefined') {
                        return;
                    }

                    var auswahlCount = Object.keys(data.auswahl).length;
                    if (auswahlCount === 0) {
                        alert('Kann Einträge nicht hinzufügen. Es sind keine Einträge ausgewählt.');
                        return;
                    }

                    var confirmMsg = 'Möchten Sie die ' + auswahlCount + ' Einträge wirklich einfügen?';
                    var confirmResult = confirm(confirmMsg);
                    if (confirmResult !== true) {
                        return;
                    }

                    // Loading-Overlay einblenden
                    if ($.fn.loadingOverlay !== undefined) {
                        $('body').loadingOverlay();
                    }

                    // Pro ausgewähltem Artikel einen AJAX-Request abschicken
                    for (var verkaufpreisId in data.auswahl) {
                        if (data.auswahl.hasOwnProperty(verkaufpreisId)) {
                            var quantity = parseInt(data.menge[verkaufpreisId]);
                            me.insertSingleArticle(verkaufpreisId, quantity);
                        }
                    }

                    // Loading-Overlay ausblenden
                    if ($.fn.loadingOverlay !== undefined) {
                        $('body').loadingOverlay('remove');
                    }

                    // Auswahl zurücksetzen
                    me.resetSelection();

                    // Zurück zu den Positionen
                    window.setTimeout(function () {
                        window.location.href = $(me.selector.backButton).attr('href');
                    }, 250);
                }
            });
        },

        /**
         * Einzelnen Artikel in Positionen übernehmen
         *
         * @param verkaufpreisId
         * @param quantity
         */
        insertSingleArticle: function (verkaufpreisId, quantity) {
            if (parseInt(verkaufpreisId) <= 0) {
                return;
            }
            if (isNaN(quantity) || parseInt(quantity) <= 0) {
                quantity = null;
            }

            jQuery.ajax({
                type: 'POST',
                async: false,
                url: 'index.php?module=artikel&action=profisuche&insert=true&batch=true' +
                    '&cmd=' + me.processType +
                    '&sid=' + me.processId +
                    '&id=' + verkaufpreisId,
                data: {'menge': quantity}
            });
        },

        /**
         * Alle Artikel-Checkboxen aktivieren/deaktivieren
         *
         * @param {boolean} isChecked
         */
        selectAll: function (isChecked) {
            $(me.selector.articleSelectionCheckboxes).each(function (index, checkbox) {
                var $checkbox = $(checkbox);
                var rowId = $checkbox.data('id');

                // Checkbox aktivieren/deaktivieren
                $checkbox.prop('checked', isChecked);

                // Mengeneingabefeld selektieren
                var $inputElement = $('#articlematrix-quantity-' + rowId);
                var defaultQuantity = $inputElement.data('default-quantity');
                var currentQuantity = $inputElement.val();

                // Bei Aktivierung > Menge-Eingabefeld mit "Ab Menge" füllen
                if (isChecked === true && currentQuantity === '') {
                    $inputElement.val(defaultQuantity);
                }

                // Bei Deaktivierung > Menge-Eingabefeld leeren
                if (isChecked === false) {
                    $inputElement.val('');
                }
            });

            // Aktuelle Auswahl (aktive Checkboxen und Mengen) in Userkonfiguration speichern
            $.ajax({
                type: 'POST',
                url: me.ajaxBaseUrl + '&cmd=set',
                data: $(me.selector.dataTableForm).serializeArray()
            });
        },

        /**
         * Aktuelle Auswahl zurücksetzen/löschen
         */
        resetSelection: function () {
            $.ajax({
                type: 'POST',
                url: me.ajaxBaseUrl + '&cmd=reset',
                success: function () {
                    me.loadSelection();
                }
            });
        },

        /**
         * EventHandler für QuickAdd-Button
         *
         * @param $element Angeklickter QuickAdd-Button als jQuery-Element
         */
        quickAddArticle: function ($element) {
            var quantity, confirmResult;
            var id = $element.data('id');
            var insertUrl = $element.data('insert-url');
            var $quantityInput = $('#articlematrix-quantity-' + id);

            // Menge aus Eingabefeld an Einfügen-URL hängen
            if ($quantityInput.length > 0) {
                quantity = $quantityInput.val();
                if (quantity !== '') {
                    insertUrl += '&menge=' + quantity;
                }
            }

            confirmResult = confirm('Soll der Eintrag wirklich eingefügt werden?');
            if (confirmResult === true) {
                window.location.href = insertUrl;
            }
        }
    };

    return {
        init: me.init
    };

}(jQuery);

$(document).ready(function () {
    if ($('#kundeartikelpreise').length === 0 &&
        $('#lieferantartikelpreise').length === 0) {
        return;
    }

    ArticleMatrixSelection.init();
});