/**
 * ProductSearchPicker - переиспользуемый модуль для поиска и выбора товара
 * Только single-select режим.
 *
 * API:
 * - ProductSearchPicker.init(containerSelector, options) - инициализация
 * - instance.getSelected() - получить выбранный товар (объект или null)
 * - instance.clearSelection() - сбросить выбор
 * - instance.refresh() - обновить список товаров
 * - instance.destroy() - уничтожить экземпляр
 *
 * Пример использования:
 * const picker = ProductSearchPicker.init('#my-picker', {
 *     onAddSelected: function(product, instance) {
 *         console.log('Выбран товар:', product);
 *     }
 * });
 */
(function(window) {
    'use strict';

    // Приватное хранилище экземпляров
    var instances = {};

    /**
     * Конструктор компонента
     */
    function ProductSearchPicker(container, options) {
        this.container = typeof container === 'string'
            ? document.querySelector(container)
            : container;

        if (!this.container) {
            console.error('ProductSearchPicker: container not found');
            return;
        }

        // Настройки по умолчанию
        this.options = Object.assign({
            apiUrl: this.container.dataset.apiUrl || '/products/api/search-products-variants/',
            excludeKits: this.container.dataset.excludeKits !== 'false',
            debounceDelay: 300,
            pageSize: 30,

            // Callbacks
            onSelect: null,           // (product, instance) => {}
            onDeselect: null,         // (instance) => {}
            onAddSelected: null       // (product, instance) => {}
        }, options || {});

        // Состояние
        this.state = {
            products: [],
            selected: null,  // Единичный выбранный товар (объект или null)
            currentPage: 1,
            hasMore: false,
            isLoading: false,
            currentView: 'list',
            filters: {
                search: '',
                category: '',
                tag: '',
                stockStatus: 'all',
                warehouse: '',  // ID склада для фильтрации
                skipStockFilter: false  // Не фильтровать по остаткам (для приёмки)
            }
        };

        // Кэшируем DOM элементы
        this._cacheElements();

        // Привязываем обработчики
        this._bindEvents();

        // Начальная загрузка
        this._loadProducts();
    }

    /**
     * Кэширование DOM элементов
     */
    ProductSearchPicker.prototype._cacheElements = function() {
        var c = this.container;
        this.elements = {
            searchInput: c.querySelector('.product-picker-search'),
            searchClear: c.querySelector('.product-picker-search-clear'),
            categorySelect: c.querySelector('.product-picker-category'),
            tagSelect: c.querySelector('.product-picker-tag'),
            stockStatusSelect: c.querySelector('.product-picker-stock-status'),
            grid: c.querySelector('.product-picker-grid'),
            loading: c.querySelector('.product-picker-loading'),
            empty: c.querySelector('.product-picker-empty'),
            content: c.querySelector('.product-picker-content'),
            addSelectedBtn: c.querySelector('.product-picker-add-selected'),
            viewButtons: c.querySelectorAll('.product-picker-view')
        };

        // Начальный вид из data-атрибута
        if (this.elements.grid) {
            var initialView = this.elements.grid.dataset.view || 'list';
            this.state.currentView = initialView;
            this._updateViewButtons();
        }

        // Инициализация warehouse из data-атрибута
        if (this.container.dataset.warehouseId) {
            this.state.filters.warehouse = this.container.dataset.warehouseId;
        }

        // Инициализация skipStockFilter из data-атрибута
        if (this.container.dataset.skipStockFilter === 'true') {
            this.state.filters.skipStockFilter = true;
        }
    };

    /**
     * Привязка обработчиков событий
     */
    ProductSearchPicker.prototype._bindEvents = function() {
        var self = this;
        var debounceTimer;

        // Поиск с debounce
        if (this.elements.searchInput) {
            this.elements.searchInput.addEventListener('input', function() {
                clearTimeout(debounceTimer);
                var value = this.value.trim();

                // Показать/скрыть кнопку очистки
                if (self.elements.searchClear) {
                    self.elements.searchClear.style.display = value ? 'block' : 'none';
                }

                debounceTimer = setTimeout(function() {
                    self.state.filters.search = value;
                    self.state.currentPage = 1;
                    self._loadProducts();
                }, self.options.debounceDelay);
            });

            // Поиск по Enter
            this.elements.searchInput.addEventListener('keypress', function(e) {
                if (e.key === 'Enter') {
                    e.preventDefault();
                    clearTimeout(debounceTimer);
                    self.state.filters.search = this.value.trim();
                    self.state.currentPage = 1;
                    self._loadProducts();
                }
            });
        }

        // Кнопка очистки поиска
        if (this.elements.searchClear) {
            this.elements.searchClear.addEventListener('click', function() {
                self.elements.searchInput.value = '';
                this.style.display = 'none';
                self.state.filters.search = '';
                self.state.currentPage = 1;
                self._loadProducts();
            });
        }

        // Фильтр по категории
        if (this.elements.categorySelect) {
            this.elements.categorySelect.addEventListener('change', function() {
                self.state.filters.category = this.value;
                self.state.currentPage = 1;
                self._loadProducts();
            });
        }

        // Фильтр по тегу
        if (this.elements.tagSelect) {
            this.elements.tagSelect.addEventListener('change', function() {
                self.state.filters.tag = this.value;
                self.state.currentPage = 1;
                self._loadProducts();
            });
        }

        // Фильтр по наличию
        if (this.elements.stockStatusSelect) {
            this.elements.stockStatusSelect.addEventListener('change', function() {
                self.state.filters.stockStatus = this.value;
                self.state.currentPage = 1;
                self._loadProducts();
            });
            // Инициализация из select
            this.state.filters.stockStatus = this.elements.stockStatusSelect.value;
        }

        // Переключатель вида
        this.elements.viewButtons.forEach(function(btn) {
            btn.addEventListener('click', function() {
                var view = this.dataset.view;
                self._setView(view);
            });
        });

        // Клик по товару (делегирование)
        if (this.elements.grid) {
            this.elements.grid.addEventListener('click', function(e) {
                var productCard = e.target.closest('.product-picker-item');
                if (productCard) {
                    var productId = productCard.dataset.productId;
                    self._toggleProduct(productId);
                }
            });

            // Двойной клик по товару - сразу добавляет в документ
            this.elements.grid.addEventListener('dblclick', function(e) {
                var productCard = e.target.closest('.product-picker-item');
                if (productCard && self.options.onAddSelected) {
                    var productId = productCard.dataset.productId;
                    var product = self._findProductById(productId);
                    if (product) {
                        self.options.onAddSelected(product, self);
                    }
                }
            });
        }

        // Добавить выбранный
        if (this.elements.addSelectedBtn) {
            this.elements.addSelectedBtn.addEventListener('click', function() {
                if (self.state.selected && self.options.onAddSelected) {
                    self.options.onAddSelected(self.state.selected, self);
                }
            });
        }

        // Infinite scroll
        if (this.elements.content) {
            this.elements.content.addEventListener('scroll', function() {
                if (self.state.hasMore && !self.state.isLoading) {
                    var scrollTop = this.scrollTop;
                    var scrollHeight = this.scrollHeight;
                    var clientHeight = this.clientHeight;

                    if (scrollTop + clientHeight >= scrollHeight - 100) {
                        self.state.currentPage++;
                        self._loadProducts(true); // append mode
                    }
                }
            });
        }
    };

    /**
     * Загрузка товаров через AJAX
     */
    ProductSearchPicker.prototype._loadProducts = function(append) {
        var self = this;

        if (this.state.isLoading) return;
        this.state.isLoading = true;

        // Показать индикатор загрузки
        if (!append) {
            if (this.elements.loading) this.elements.loading.style.display = 'flex';
            if (this.elements.grid) this.elements.grid.innerHTML = '';
            if (this.elements.empty) this.elements.empty.style.display = 'none';
        }

        // Формируем параметры запроса
        var params = new URLSearchParams({
            type: 'product',  // Только штучные товары
            page: this.state.currentPage
        });

        if (this.state.filters.search) {
            params.append('q', this.state.filters.search);
        }
        if (this.state.filters.category) {
            params.append('category', this.state.filters.category);
        }
        if (this.state.filters.tag) {
            params.append('tag', this.state.filters.tag);
        }
        if (this.state.filters.stockStatus !== 'all') {
            params.append('stock_status', this.state.filters.stockStatus);
        }
        if (this.state.filters.warehouse) {
            params.append('warehouse', this.state.filters.warehouse);
        }
        if (this.state.filters.skipStockFilter) {
            params.append('skip_stock_filter', 'true');
        }

        fetch(this.options.apiUrl + '?' + params.toString())
            .then(function(response) {
                return response.json();
            })
            .then(function(data) {
                self.state.isLoading = false;
                if (self.elements.loading) self.elements.loading.style.display = 'none';

                // Извлекаем товары (учитываем группировку в API)
                var products = [];
                if (Array.isArray(data.results)) {
                    data.results.forEach(function(item) {
                        if (item.children) {
                            // Группированные результаты
                            item.children.forEach(function(p) {
                                if (p.type === 'product') {
                                    products.push(p);
                                }
                            });
                        } else if (item.type === 'product') {
                            products.push(item);
                        }
                    });
                }

                if (append) {
                    self.state.products = self.state.products.concat(products);
                } else {
                    self.state.products = products;
                }

                self.state.hasMore = data.pagination && data.pagination.more;

                // Рендеринг
                self._renderProducts(products, append);

                // Показать "пусто" если нет результатов
                if (self.state.products.length === 0) {
                    if (self.elements.empty) self.elements.empty.style.display = 'flex';
                } else {
                    if (self.elements.empty) self.elements.empty.style.display = 'none';
                }
            })
            .catch(function(error) {
                console.error('ProductSearchPicker: fetch error', error);
                self.state.isLoading = false;
                if (self.elements.loading) self.elements.loading.style.display = 'none';
            });
    };

    /**
     * Рендеринг товаров
     */
    ProductSearchPicker.prototype._renderProducts = function(products, append) {
        var self = this;
        var fragment = document.createDocumentFragment();

        products.forEach(function(product) {
            // Извлекаем ID (убираем префикс "product_")
            var productId = String(product.id).replace('product_', '');
            // Проверка: выбран ли этот товар (только ОДИН может быть выбран)
            var isSelected = self.state.selected && String(self.state.selected.id) === String(productId);

            var html = self.state.currentView === 'grid'
                ? self._renderGridCard(product, productId, isSelected)
                : self._renderListItem(product, productId, isSelected);

            var temp = document.createElement('div');
            temp.innerHTML = html;
            fragment.appendChild(temp.firstElementChild);
        });

        if (append) {
            this.elements.grid.appendChild(fragment);
        } else {
            this.elements.grid.innerHTML = '';
            this.elements.grid.appendChild(fragment);
        }
    };

    /**
     * Рендеринг карточки товара (grid view)
     */
    ProductSearchPicker.prototype._renderGridCard = function(product, productId, isSelected) {
        var inStockBadge = product.in_stock
            ? '<span class="badge bg-success" style="font-size: 0.65rem;">В наличии</span>'
            : '<span class="badge bg-secondary" style="font-size: 0.65rem;">Нет</span>';

        var selectedClass = isSelected ? 'selected' : '';
        var checkIcon = isSelected
            ? '<i class="bi bi-check-circle-fill text-success check-icon"></i>'
            : '';

        var photoHtml = product.photo_url
            ? '<img src="' + product.photo_url + '" class="card-img-top" style="height: 100px; object-fit: cover;" alt="' + (product.text || '') + '">'
            : '<div class="bg-light d-flex align-items-center justify-content-center" style="height: 100px;"><i class="bi bi-image text-muted fs-2"></i></div>';

        var name = product.text || product.name || '';
        var price = product.actual_price || product.price || '0';

        return '<div class="col-6 col-lg-4 col-xl-3">' +
            '<div class="card product-picker-item h-100 shadow-sm ' + selectedClass + '" ' +
            'data-product-id="' + productId + '" style="cursor: pointer;">' +
            '<div class="position-relative">' +
            photoHtml +
            checkIcon +
            '</div>' +
            '<div class="card-body p-2">' +
            '<div class="small text-truncate fw-medium">' + name + '</div>' +
            '<div class="d-flex justify-content-between align-items-center mt-1">' +
            '<span class="fw-bold text-primary small">' + price + ' руб.</span>' +
            inStockBadge +
            '</div>' +
            '<small class="text-muted">' + (product.sku || '') + '</small>' +
            '</div>' +
            '</div>' +
            '</div>';
    };

    /**
     * Рендеринг строки товара (list view)
     */
    ProductSearchPicker.prototype._renderListItem = function(product, productId, isSelected) {
        var inStockBadge = product.in_stock
            ? '<span class="badge bg-success">В наличии</span>'
            : '<span class="badge bg-secondary">Нет</span>';

        var selectedClass = isSelected ? 'selected' : '';

        var photoHtml = product.photo_url
            ? '<img src="' + product.photo_url + '" class="rounded" style="width: 40px; height: 40px; object-fit: cover;">'
            : '<div class="bg-light rounded d-flex align-items-center justify-content-center" style="width: 40px; height: 40px;"><i class="bi bi-image text-muted"></i></div>';

        var name = product.text || product.name || '';
        var price = product.actual_price || product.price || '0';

        return '<div class="col-12">' +
            '<div class="product-picker-item d-flex align-items-center p-2 border rounded ' + selectedClass + '" ' +
            'data-product-id="' + productId + '" style="cursor: pointer;">' +
            '<div class="flex-shrink-0 me-2">' +
            photoHtml +
            '</div>' +
            '<div class="flex-grow-1" style="min-width: 0;">' +
            '<div class="text-truncate fw-medium">' + name + '</div>' +
            '<small class="text-muted">' + (product.sku || '') + '</small>' +
            '</div>' +
            '<div class="text-end ms-2 text-nowrap">' +
            '<div class="fw-bold text-primary">' + price + ' руб.</div>' +
            inStockBadge +
            '</div>' +
            '</div>' +
            '</div>';
    };

    /**
     * Переключение выбора товара (single-select)
     */
    ProductSearchPicker.prototype._toggleProduct = function(productId) {
        var self = this;
        var product = this._findProductById(productId);

        if (!product) return;

        var isSelected = this.state.selected && String(this.state.selected.id) === String(productId);

        if (isSelected) {
            // Снять выбор
            this.state.selected = null;
            this._clearAllSelections();
            if (this.options.onDeselect) {
                this.options.onDeselect(this);
            }
        } else {
            // ПРИНУДИТЕЛЬНО снимаем выбор со ВСЕХ товаров
            this.state.selected = product;
            this._clearAllSelections();
            // Теперь выделяем только новый
            this._updateProductUI(productId);
            if (this.options.onSelect) {
                this.options.onSelect(product, this);
            }
        }

        // Обновить UI
        this._updateSelectionUI();
    };

    /**
     * Поиск товара по ID в загруженном списке
     */
    ProductSearchPicker.prototype._findProductById = function(productId) {
        for (var i = 0; i < this.state.products.length; i++) {
            var p = this.state.products[i];
            if (String(p.id).replace('product_', '') === productId) {
                var product = Object.assign({}, p);
                product.id = productId; // Сохраняем очищенный ID
                return product;
            }
        }
        return null;
    };

    /**
     * Принудительно снять выделение со всех товаров
     */
    ProductSearchPicker.prototype._clearAllSelections = function() {
        // Удаляем класс selected со всех товаров в DOM
        if (this.elements.grid) {
            var allItems = this.elements.grid.querySelectorAll('.product-picker-item');
            allItems.forEach(function(item) {
                item.classList.remove('selected');
                // Удаляем галочку в grid view
                var checkIcon = item.querySelector('.check-icon');
                if (checkIcon) {
                    checkIcon.remove();
                }
            });
        }
    };

    /**
     * Обновление UI товара
     */
    ProductSearchPicker.prototype._updateProductUI = function(productId) {
        var card = this.elements.grid.querySelector('[data-product-id="' + productId + '"]');
        if (!card) return;

        // Проверка: выбран ли этот товар
        var isSelected = this.state.selected && String(this.state.selected.id) === String(productId);

        if (isSelected) {
            card.classList.add('selected');
            // Добавить иконку в grid view если её нет
            if (this.state.currentView === 'grid') {
                var posRel = card.querySelector('.position-relative');
                if (posRel && !posRel.querySelector('.check-icon')) {
                    var checkEl = document.createElement('i');
                    checkEl.className = 'bi bi-check-circle-fill text-success check-icon';
                    posRel.appendChild(checkEl);
                }
            }
        } else {
            card.classList.remove('selected');
            // В grid view удаляем иконку
            if (this.state.currentView === 'grid') {
                var iconCheck = card.querySelector('.check-icon');
                if (iconCheck) {
                    iconCheck.remove();
                }
            }
        }
    };

    /**
     * Обновление UI выбора (кнопка)
     */
    ProductSearchPicker.prototype._updateSelectionUI = function() {
        // Кнопка "Добавить"
        if (this.elements.addSelectedBtn) {
            this.elements.addSelectedBtn.disabled = !this.state.selected;
        }
    };

/**
     * Обновление кнопок переключателя вида
     */
    ProductSearchPicker.prototype._updateViewButtons = function() {
        var self = this;
        this.elements.viewButtons.forEach(function(btn) {
            if (btn.dataset.view === self.state.currentView) {
                btn.classList.add('active');
            } else {
                btn.classList.remove('active');
            }
        });
    };

    /**
     * Переключение вида (grid/list)
     */
    ProductSearchPicker.prototype._setView = function(view) {
        this.state.currentView = view;

        // Обновить data-атрибут
        if (this.elements.grid) {
            this.elements.grid.dataset.view = view;
        }

        // Обновить кнопки
        this._updateViewButtons();

        // Перерисовать
        this._renderProducts(this.state.products, false);
    };

    // ========== ПУБЛИЧНОЕ API ==========

    /**
     * Получить выбранный товар (объект или null)
     */
    ProductSearchPicker.prototype.getSelected = function() {
        return this.state.selected;
    };

    /**
     * Сбросить выбор
     */
    ProductSearchPicker.prototype.clearSelection = function() {
        if (this.state.selected) {
            var productId = this.state.selected.id;
            this.state.selected = null;
            this._updateProductUI(productId);
        }
        this._updateSelectionUI();
    };

/**
     * Обновить список товаров
     */
    ProductSearchPicker.prototype.refresh = function() {
        this.state.currentPage = 1;
        this._loadProducts();
    };

    /**
     * Уничтожить экземпляр
     */
    ProductSearchPicker.prototype.destroy = function() {
        // Очистить состояние
        this.state.products = [];
        this.state.selected = null;

        // Удалить из хранилища
        if (this.container.id && instances[this.container.id]) {
            delete instances[this.container.id];
        }
    };

    // ========== СТАТИЧЕСКИЕ МЕТОДЫ ==========

    /**
     * Инициализация компонента
     * @param {string|Element} container - селектор или DOM элемент
     * @param {Object} options - настройки
     * @returns {ProductSearchPicker}
     */
    ProductSearchPicker.init = function(container, options) {
        var element = typeof container === 'string'
            ? document.querySelector(container)
            : container;

        if (!element) {
            console.error('ProductSearchPicker.init: container not found');
            return null;
        }

        // Проверяем, не инициализирован ли уже
        if (element.id && instances[element.id]) {
            return instances[element.id];
        }

        var instance = new ProductSearchPicker(element, options);

        if (element.id) {
            instances[element.id] = instance;
        }

        return instance;
    };

    /**
     * Получить экземпляр по контейнеру
     */
    ProductSearchPicker.getInstance = function(container) {
        var element = typeof container === 'string'
            ? document.querySelector(container)
            : container;
        return element && element.id ? instances[element.id] : null;
    };

    // Экспорт в глобальную область
    window.ProductSearchPicker = ProductSearchPicker;

})(window);
