(function () {
    'use strict';

    if (window.BXCatalogSort) return;

    window.BXCatalogSort = function () {
        var container = document.querySelector('[data-entity="catalog-sort"]');
        if (!container) return;

        var buttons = container.querySelectorAll('.catalog-sort__btn');
        for (var i = 0; i < buttons.length; i++) {
            BX.bind(buttons[i], 'click', this.onClick.bind(this));
        }
    };

    window.BXCatalogSort.prototype.onClick = function (e) {
        var btn = e.target.closest ? e.target.closest('.catalog-sort__btn') : e.target;
        if (!btn || BX.hasClass(btn, 'active')) return;

        var field = btn.getAttribute('data-field');
        var order = btn.getAttribute('data-order');
        var self = this;

        // Оптимистично обновляем активную кнопку до ответа сервера
        this.setActiveButton(field, order);

        BX.ajax.runAction('main:project.CatalogSortController.apply', {
            data: { field: field, order: order }
        }).then(function () {
            // Без перезагрузки страницы — подгружаем только секцию каталога
            self.reloadSection(field, order);
        }).catch(function (err) {
            console.error('Catalog sort error:', err);
        });
    };

    /**
     * Переключает класс active у кнопок сортировки.
     */
    window.BXCatalogSort.prototype.setActiveButton = function (field, order) {
        var buttons = document.querySelectorAll('[data-entity="catalog-sort"] .catalog-sort__btn');
        for (var i = 0; i < buttons.length; i++) {
            var btn = buttons[i];
            var btnField = btn.getAttribute('data-field');
            var btnOrder = btn.getAttribute('data-order');
            if (btnField === field && btnOrder === order) {
                BX.addClass(btn, 'active');
            } else {
                BX.removeClass(btn, 'active');
            }
        }
    };

    /**
     * AJAX-обновление контейнера с товарами без перезагрузки страницы.
     */
    window.BXCatalogSort.prototype.reloadSection = function (field, order) {
        var container = document.querySelector('[data-entity="catalog-section-container"]');
        if (!container) return;

        var self = this;

        // Строим URL для AJAX-запроса: сбрасываем пагинацию (сортировка уже в cookie)
        var url = new URL(window.location.href);
        url.searchParams.delete('PAGEN_1');
        url.searchParams.delete('PAGEN_2');

        // Индикатор загрузки
        BX.addClass(container, 'catalog-section-loading');

        BX.ajax({
            url: url.toString(),
            method: 'GET',
            dataType: 'html',
            onsuccess: function (data) {
                var tempDiv = document.createElement('div');
                tempDiv.innerHTML = data;
                var newContainer = tempDiv.querySelector('[data-entity="catalog-section-container"]');

                if (newContainer) {
                    container.innerHTML = newContainer.innerHTML;

                    // Выполняем скрипты из нового содержимого
                    self.executeScripts(container);
                }

                BX.removeClass(container, 'catalog-section-loading');
            },
            onfailure: function () {
                console.error('Catalog sort: failed to reload section');
                BX.removeClass(container, 'catalog-section-loading');
            }
        });
    };

    /**
     * Пересоздаёт <script> элементы, чтобы они исполнились после вставки HTML.
     */
    window.BXCatalogSort.prototype.executeScripts = function (container) {
        var scripts = container.querySelectorAll('script');
        for (var i = 0; i < scripts.length; i++) {
            var oldScript = scripts[i];
            var newScript = document.createElement('script');

            // Копируем атрибуты
            for (var j = 0; j < oldScript.attributes.length; j++) {
                var attr = oldScript.attributes[j];
                newScript.setAttribute(attr.name, attr.value);
            }

            if (oldScript.src) {
                newScript.src = oldScript.src;
            } else {
                newScript.textContent = oldScript.textContent;
            }

            oldScript.parentNode.replaceChild(newScript, oldScript);
        }
    };

    BX.ready(function () {
        new BXCatalogSort();
    });
})();
