/**
 * Select2 Product Search Module
 * Переиспользуемый модуль для инициализации Select2 с AJAX поиском товаров
 */

(function(window) {
    'use strict';

    // Форматирование результата в выпадающем списке
    function formatSelectResult(item) {
        if (item.loading) return item.text;

        // Если это группа (header для товаров/комплектов), просто возвращаем текст
        if (item.children) {
            return item.text;
        }

        var $container = $('<div class="select2-result-item d-flex justify-content-between align-items-center">');

        // Левая часть: иконка + название
        var $left = $('<div class="d-flex align-items-center">');

        // Добавляем иконку в зависимости от типа
        if (item.type === 'product') {
            $left.append($('<span class="me-2">').text('🌹'));
        } else if (item.type === 'kit') {
            $left.append($('<span class="me-2">').text('💐'));
        } else if (item.type === 'variant') {
            $left.append($('<span class="me-2">').text('🔄'));
        }

        // Название
        var $name = $('<span>').text(item.text);
        $left.append($name);
        $container.append($left);

        // Правая часть: цена и статус наличия
        if (item.actual_price || item.price) {
            var priceText = item.actual_price || item.price;
            var $price = $('<span class="text-muted small">').text(priceText + ' руб.');
            $container.append($price);
        }

        // Индикатор наличия для товаров
        if (item.type === 'product' && item.in_stock !== undefined) {
            if (item.in_stock) {
                $container.append($('<span class="badge bg-success ms-2 small">').text('В наличии'));
            } else {
                $container.append($('<span class="badge bg-secondary ms-2 small">').text('Нет'));
            }
        }

        return $container;
    }

    // Форматирование выбранного элемента
    function formatSelectSelection(item) {
        // Добавляем иконку для выбранного элемента
        if (item.type === 'product') {
            return '🌹 ' + item.text;
        } else if (item.type === 'kit') {
            return '💐 ' + item.text;
        } else if (item.type === 'variant') {
            return '🔄 ' + item.text;
        }
        return item.text || item.id;
    }

    /**
     * Инициализирует Select2 для элемента с AJAX поиском товаров
     * @param {Element|jQuery} element - DOM элемент или jQuery объект select
     * @param {string} type - Тип поиска ('product', 'variant', 'kit' или 'all')
     * @param {string} apiUrl - URL API для поиска
     * @param {Object} preloadedData - Предзагруженные данные товара
     */
    window.initProductSelect2 = function(element, type, apiUrl, preloadedData) {
        if (!element) return;

        // Преобразуем в jQuery если нужно
        var $element = $(element);

        // Если уже инициализирован, пропускаем
        if ($element.data('select2')) {
            return;
        }

        var placeholders = {
            'product': 'Начните вводить название товара...',
            'variant': 'Начните вводить название группы...',
            'kit': 'Начните вводить название комплекта...',
            'all': 'Начните вводить название товара или комплекта...'
        };

        var config = {
            theme: 'bootstrap-5',
            placeholder: placeholders[type] || 'Выберите...',
            allowClear: true,
            language: 'ru',
            minimumInputLength: 0,
            ajax: {
                url: apiUrl,
                dataType: 'json',
                delay: 250,
                data: function (params) {
                    return {
                        q: params.term || '',
                        type: type,
                        page: params.page || 1
                    };
                },
                processResults: function (data) {
                    return {
                        results: data.results,
                        pagination: {
                            more: data.pagination.more
                        }
                    };
                },
                cache: true
            },
            templateResult: formatSelectResult,
            templateSelection: formatSelectSelection
        };

        // Если есть предзагруженные данные, создаем option с ними
        if (preloadedData) {
            var option = new Option(preloadedData.text, preloadedData.id, true, true);
            // Сохраняем дополнительные данные для форматирования
            $(option).data('data', preloadedData);
            $element.append(option);
        }

        $element.select2(config);
    };

    /**
     * Инициализирует Select2 для всех элементов с данным селектором
     * @param {string} selector - CSS селектор элементов
     * @param {string} type - Тип поиска ('product' или 'variant')
     * @param {string} apiUrl - URL API для поиска
     */
    window.initAllProductSelect2 = function(selector, type, apiUrl) {
        document.querySelectorAll(selector).forEach(function(element) {
            window.initProductSelect2(element, type, apiUrl);
        });
    };

    /**
     * Инициализирует Select2 для позиции заказа (товар или комплект)
     * Обрабатывает выбор товара/комплекта и обновляет скрытые поля формы
     *
     * @param {Element|jQuery} element - DOM элемент select
     * @param {string} apiUrl - URL API для поиска (по умолчанию из data-ajax-url)
     */
    window.initOrderItemSelect2 = function(element, apiUrl) {
        if (!element) return;

        var $element = $(element);

        // Получаем URL из параметра или data-атрибута
        var searchUrl = apiUrl || $element.data('ajax-url');
        if (!searchUrl) {
            console.error('[initOrderItemSelect2] API URL not provided');
            return;
        }

        // Инициализируем базовый Select2 с AJAX поиском (товары + комплекты)
        window.initProductSelect2(element, 'all', searchUrl);

        // Обработка выбора товара/комплекта
        $element.on('select2:select', function(e) {
            if (!e.params || !e.params.data) return;

            var data = e.params.data;
            var idParts = data.id.split('_');
            var type = idParts[0];  // 'product' или 'kit'
            var id = idParts[1];

            // Найти форму и скрытые поля
            var form = element.closest('.order-item-form');
            if (!form) return;

            var productField = form.querySelector('[name$="-product"]');
            var kitField = form.querySelector('[name$="-product_kit"]');
            var priceField = form.querySelector('[name$="-price"]');
            var isCustomPriceField = form.querySelector('[name$="-is_custom_price"]');

            var originalPrice = data.actual_price || data.price || '';

            // Установить значение в правильное поле
            if (type === 'product') {
                if (productField) productField.value = id;
                if (kitField) kitField.value = '';
                if (priceField) {
                    priceField.value = originalPrice;
                    // Сохраняем базовую цену товара в data-атрибут для возврата при выборе базовой единицы
                    priceField.dataset.baseProductPrice = originalPrice;
                }

                // НОВОЕ: Загружаем единицы продажи для товара
                loadAndDisplaySalesUnits(id, form, data);
            } else if (type === 'kit') {
                if (kitField) kitField.value = id;
                if (productField) productField.value = '';
                if (priceField) priceField.value = originalPrice;

                // Скрываем единицы продажи для комплектов
                var salesUnitContainer = form.querySelector('.sales-unit-container');
                if (salesUnitContainer) {
                    salesUnitContainer.style.display = 'none';
                }
            }

            // Сохраняем оригинальную цену в data-атрибуте
            if (priceField) {
                priceField.dataset.originalPrice = originalPrice;
            }

            // Сбрасываем флаг кастомной цены
            if (isCustomPriceField) {
                isCustomPriceField.value = 'false';
            }

            // Скрываем индикатор кастомной цены
            var badge = form.querySelector('.custom-price-badge');
            var priceInfo = form.querySelector('.original-price-info');
            if (badge) badge.style.display = 'none';
            if (priceInfo) priceInfo.style.display = 'none';
        });

        // Очистка при удалении выбора
        $element.on('select2:clear', function() {
            var form = element.closest('.order-item-form');
            if (!form) return;

            var productField = form.querySelector('[name$="-product"]');
            var kitField = form.querySelector('[name$="-product_kit"]');
            var priceField = form.querySelector('[name$="-price"]');
            var quantityField = form.querySelector('[name$="-quantity"]');

            if (productField) productField.value = '';
            if (kitField) kitField.value = '';
            if (priceField) priceField.value = '';
            if (quantityField) quantityField.value = '';
        });
    };

    /**
     * Загружает и отображает единицы продажи для выбранного товара
     * @param {string} productId - ID товара
     * @param {HTMLElement} form - Элемент формы
     * @param {Object} productData - Данные товара из Select2
     */
    async function loadAndDisplaySalesUnits(productId, form, productData) {
        // Проверяем наличие модуля SalesUnitsModule
        if (typeof window.SalesUnitsModule === 'undefined') {
            console.warn('[Select2] SalesUnitsModule не загружен');
            return;
        }

        var salesUnitContainer = form.querySelector('.sales-unit-container');
        if (!salesUnitContainer) {
            console.warn('[Select2] Контейнер .sales-unit-container не найден в форме');
            return;
        }

        // Показываем индикатор загрузки
        salesUnitContainer.innerHTML = '<div class="spinner-border spinner-border-sm" role="status"><span class="visually-hidden">Загрузка...</span></div>';
        salesUnitContainer.style.display = 'block';

        try {
            // Проверяем, есть ли единицы в данных товара (если API уже вернул их)
            var salesUnits = productData.sales_units;

            // Если единиц нет в данных, загружаем через отдельный API
            if (!salesUnits || salesUnits.length === 0) {
                var result = await window.SalesUnitsModule.fetchSalesUnits(productId);
                if (result.success) {
                    salesUnits = result.sales_units;
                } else {
                    throw new Error(result.error || 'Не удалось загрузить единицы продажи');
                }
            }

            // Если единиц нет - скрываем контейнер
            if (!salesUnits || salesUnits.length === 0) {
                salesUnitContainer.style.display = 'none';
                return;
            }

            // Создаем select с единицами
            var selectHtml = window.SalesUnitsModule.createSalesUnitSelect(salesUnits);
            salesUnitContainer.innerHTML = `
                <label class="form-label">Единица продажи</label>
                ${selectHtml}
                <div class="available-qty-display mt-1"></div>
            `;
            salesUnitContainer.style.display = 'block';

            // Находим созданный select и скрытое поле
            var salesUnitSelect = salesUnitContainer.querySelector('.sales-unit-selector');
            var hiddenSalesUnitField = form.querySelector('[name$="-sales_unit"]');

            if (salesUnitSelect && hiddenSalesUnitField) {
                // Синхронизируем visible select с hidden field
                salesUnitSelect.addEventListener('change', function() {
                    hiddenSalesUnitField.value = salesUnitSelect.value;
                });
            }

            // СНАЧАЛА инициализируем обработчики из модуля SalesUnitsModule
            window.SalesUnitsModule.initializeSalesUnitHandlers(form);

            // ПОТОМ выбираем дефолтную единицу и триггерим событие
            if (salesUnitSelect && hiddenSalesUnitField) {
                var defaultUnit = salesUnits.find(function(u) { return u.is_default; });
                if (defaultUnit) {
                    salesUnitSelect.value = defaultUnit.id;
                    hiddenSalesUnitField.value = defaultUnit.id;
                    // Теперь событие сработает ПОСЛЕ установки обработчиков
                    salesUnitSelect.dispatchEvent(new Event('change'));
                }
            }

        } catch (error) {
            console.error('[Select2] Ошибка загрузки единиц продажи:', error);
            salesUnitContainer.innerHTML = '<small class="text-danger">Ошибка загрузки единиц продажи</small>';
        }
    }

})(window);
