/* --------------------------------------------------------------
 catalog_selector.js 2019-07-12
 Gambio GmbH
 http://www.gambio.de
 Copyright (c) 2019 Gambio GmbH
 Released under the GNU General Public License (Version 2)
 [http://www.gnu.org/licenses/gpl-2.0.html]
 --------------------------------------------------------------
 */

/**
 * ## CatalogSelector Widget
 *
 * This Widgets generates a selection for products (categories at not implemented yet, but possibil).
 * The given HTML code will be cloned to and modified to create this selection.
 *
 *
 * ### Parent Container Options
 *
 * **Headline text | `data-catalog_selector-headline_text` | String | Required**
 *
 * Textphrase for the collapse headline.
 *
 * **Add button text | `data-catalog_selector-add_button_text` | String | Required**
 *
 * Textphrase for the add new dropdown button.
 *
 * **Form group selector | `data-catalog_selector-group_selector` | String | Optional**
 *
 * This selector is required to select the form group that must be contained in the given HTML.
 *
 * **Label selector | `data-catalog_selector-label_selector` | String | Optional**
 *
 * This selector is required to select the label of the form group.
 *
 * **Dropdown selector | `data-catalog_selector-dropdown_selector` | String | Optional**
 *
 * This selector is required to select dropdown of the form group.
 *
 * **Remove icon column selector | `data-catalog_selector-remove_selector` | String | Optional**
 *
 * This selector is required to select the column for the remove icon of the form group.
 *
 * **Selected data | `data-catalog_selector-selected_data` | String | Optional**
 *
 * Already selected data for the selection.
 *
 *
 * ### Example
 * ```html
 * <div data-gx-widget="catalog_selector"
 *     data-catalog_selector-group_selector=".form-group"
 *     data-catalog_selector-label_selector="label"
 *     data-catalog_selector-dropdown_selector=".catalog-selector-dropdown"
 *     data-catalog_selector-remove_selector=".catalog-selector-remove"
 *     data-catalog_selector-headline_text="HEADLINE"
 *     data-catalog_selector-add_button_text="Add dropdown"
 *     data-catalog_selector-selected_data="1,2,3,4"
 * >
 *     <div class="form-group">
 *         <label class="col-md-4">{$txt.LABEL_SHOW_FOR_PRODUCT}:</label>
 *         <div class="col-md-3">
 *             <select class="form-control catalog-selector-dropdown"
 *             name="content_manager[infopage][sitemap_changefreq][{$languageCode}]"></select>
 *         </div>
 *         <div class="col-md-1 catalog-selector-remove"></div>
 *     </div>
 * </div>
 * ```
 *
 *
 * @module Admin/Widgets/catalog_selector
 */
gx.widgets.module(
    'catalog_selector',

    [
        `${gx.source}/widgets/collapser`
    ],

    function (data) {

        'use strict';

        // ------------------------------------------------------------------------
        // VARIABLE DEFINITION
        // ------------------------------------------------------------------------

        var
            /**
             * Widget Reference
             *
             * @type {object}
             */
            $this = $(this),

            /**
             * Copy of the given form group
             *
             * @type {object}
             */
            $groupObject = {},

            /**
             * Data that's used to fill the dropdown.
             * Will be loaded by ajax from the widget ajax controller
             *
             * @type string
             */
            dataTreeHtml = '',

            /**
             * Default Options for Widget
             *
             * @type {object}
             */
            defaults = {
                'group_selector': '.form-group',
                'label_selector': 'label',
                'dropdown_selector': '.catalog-selector-dropdown',
                'remove_selector': '.catalog-selector-remove',
                'selected_data': ''
            },

            /**
             * Final Widget Options
             *
             * @type {object}
             */
            options = $.extend(true, {}, defaults, data),

            /**
             * Module Object
             *
             * @type {object}
             */
            module = {};

        // ------------------------------------------------------------------------
        // INITIALIZE
        // ------------------------------------------------------------------------

        /**
         * Initialize method of the widget, called by the engine.
         */
        module.init = function (done) {
            // Perform ajax request to collect products and categories
            _performRequest('getProductsTreeAsOptgroups')
                .done(function (response) {
                    dataTreeHtml = response.html;
                });

            // Initialize widget html
            $this
                .append(`
					<fieldset>
	                    <div class="frame-wrapper default">
							<div class="frame-head"
								data-gx-widget="collapser"
								data-collapser-target_selector=".frame-content">
								` + options.headline_text + `
							</div>
							<div class="frame-content">
								<div class="catalog-selection-data"></div>
							</div>
						</div>
					</fieldset>
			`);
            $this
                .find('.catalog-selection-data')
                .parent()
                .append(`
					<button type="button" class="btn catalog-selection-new-dropdown">
						` + options.add_button_text + `
					</button>
				`)
                .find('.catalog-selection-new-dropdown')
                .on('click', _onNewDropdown);
            gx.widgets.init($this.parent());

            // Backup form group
            $groupObject = $this.find(options.group_selector);
            $this.find(options.group_selector).remove();

            // Fill dropdown menu of backuped form group with options
            $groupObject
                .find(options.dropdown_selector)
                .append(dataTreeHtml);

            // Delete given html (It is will not be used anymore)
            $groupObject.clone().appendTo($this.find('.catalog-selection-data'));

            // Add pre-selected data
            _addSelectedData();

            done();
        };


        // ------------------------------------------------------------------------
        // HELPERS
        // ------------------------------------------------------------------------

        /**
         * Performs the ajax request to collec tthe products and categories
         *
         * @param {String} action
         * @returns {String} JSON
         */
        function _performRequest(action) {
            const URL_BASE = 'admin.php?do=CatalogSelectWidgetAjax/';

            // AJAX request options.
            const ajaxOptions = {
                url: URL_BASE + action,
                async: false,
                dataType: "json"
            };

            // Returns deferred object.
            return $.ajax(ajaxOptions);
        }

        /**
         * Create a new form group with another dropdown
         */
        function _onNewDropdown() {
            $groupObject
                .clone()
                .appendTo($this.find('.catalog-selection-data'))
                .find(options.label_selector)
                .empty()
                .parent()
                .find(options.remove_selector)
                .append('<i class="fa fa-trash-o" aria-hidden="true"></i>')
                .find('i')
                .on('click', _removeDropdown);
        }

        /**
         * Removes a form group. Will be initialize by a click event on the remove icon.
         */
        function _removeDropdown() {
            $(this).closest(options.group_selector).remove();
        }

        /**
         * Adds the pre selected data.
         */
        function _addSelectedData() {
            if (options.selected_data == '') {
                return;
            }

            if (String(options.selected_data).indexOf(",") == -1) {
                $this.find(options.dropdown_selector + ':last').val(options.selected_data);
                _onNewDropdown();
            } else {
                var selectedData = options.selected_data.split(',');
                console.log(selectedData);
                for (var i in selectedData) {
                    $this.find(options.dropdown_selector + ':last').val(selectedData[i]);
                    _onNewDropdown();
                }
            }
        }

        // Return data to module engine
        return module;
    });