/**
 * Модуль для работы с единицами продажи товаров (Sales Units)
 * Управляет загрузкой, отображением и валидацией единиц продажи
 */
(function(window) {
    'use strict';

    /**
     * Загружает единицы продажи для товара с сервера
     * @param {number} productId - ID товара
     * @param {number|null} warehouseId - ID склада для получения остатков (опционально)
     * @returns {Promise<Object>} Промис с данными единиц продажи
     */
    async function fetchSalesUnits(productId, warehouseId = null) {
        try {
            let url = `/products/api/products/${productId}/sales-units/`;
            if (warehouseId) {
                url += `?warehouse=${warehouseId}`;
            }

            const response = await fetch(url);
            const data = await response.json();

            if (!response.ok) {
                throw new Error(data.error || 'Ошибка загрузки единиц продажи');
            }

            return data;
        } catch (error) {
            console.error('[SalesUnits] Ошибка при загрузке единиц:', error);
            return {success: false, error: error.message, sales_units: []};
        }
    }

    /**
     * Создает HTML select элемент с единицами продажи
     * @param {Array} salesUnits - Массив единиц продажи
     * @param {number|null} selectedId - ID выбранной единицы (опционально)
     * @returns {string} HTML строка с select элементом
     */
    function createSalesUnitSelect(salesUnits, selectedId = null) {
        if (!salesUnits || salesUnits.length === 0) {
            return '<select class="form-control" disabled><option>Нет единиц продажи</option></select>';
        }

        let html = '<select class="form-control sales-unit-selector" name="sales_unit">';
        html += '<option value="">Базовая единица</option>';

        salesUnits.forEach(unit => {
            const selected = (selectedId && unit.id === selectedId) ? 'selected' : '';
            const isDefault = unit.is_default ? ' (по умолч.)' : '';
            const price = unit.sale_price || unit.price;

            html += `<option value="${unit.id}" ${selected}
                        data-price="${unit.actual_price}"
                        data-conversion="${unit.conversion_factor}"
                        data-min-qty="${unit.min_quantity}"
                        data-step="${unit.quantity_step}"
                        data-available="${unit.available_quantity || ''}">
                     ${unit.name} - ${price} руб.${isDefault}
                     </option>`;
        });

        html += '</select>';
        return html;
    }

    /**
     * Обновляет цену при выборе единицы продажи
     * @param {HTMLSelectElement} selectElement - Select элемент с единицами
     * @param {HTMLInputElement} priceInput - Input элемент для цены
     * @param {HTMLInputElement} isCustomPriceInput - Hidden input для флага кастомной цены
     */
    function updatePriceOnUnitChange(selectElement, priceInput, isCustomPriceInput) {
        if (!priceInput) {
            return;
        }

        const selectedOption = selectElement.options[selectElement.selectedIndex];
        const isManuallyModified = isCustomPriceInput && isCustomPriceInput.value === 'true';

        // Если цена была изменена вручную - не обновляем
        if (isManuallyModified) {
            return;
        }

        // Если выбрана базовая единица (пустое значение) - возвращаем базовую цену товара
        if (!selectedOption || !selectedOption.value) {
            const baseProductPrice = priceInput.dataset.baseProductPrice;
            if (baseProductPrice) {
                priceInput.value = baseProductPrice;
                priceInput.dataset.originalPrice = baseProductPrice;
            }
            return;
        }

        // Если выбрана единица продажи - устанавливаем её цену
        const newPrice = selectedOption.getAttribute('data-price');
        if (newPrice) {
            priceInput.value = newPrice;
            priceInput.dataset.originalPrice = newPrice;
        }
    }

    /**
     * Отображает доступное количество товара в выбранной единице
     * @param {HTMLSelectElement} selectElement - Select элемент с единицами
     * @param {HTMLElement} displayElement - Элемент для отображения остатков
     */
    function displayAvailableQuantity(selectElement, displayElement) {
        if (!displayElement) {
            return;
        }

        const selectedOption = selectElement.options[selectElement.selectedIndex];

        if (!selectedOption || !selectedOption.value) {
            displayElement.textContent = '';
            return;
        }

        const availableQty = selectedOption.getAttribute('data-available');
        const unitShortName = selectedOption.text.match(/\(([^)]+)\)/)?.[1] || 'шт';

        if (availableQty && parseFloat(availableQty) > 0) {
            displayElement.innerHTML = `<small class="text-muted">Доступно: ${availableQty} ${unitShortName}</small>`;
        } else {
            displayElement.textContent = '';
        }
    }

    /**
     * Валидирует количество согласно минимуму и шагу единицы продажи
     * @param {HTMLInputElement} quantityInput - Input элемент для количества
     * @param {HTMLSelectElement} salesUnitSelect - Select элемент с единицами
     * @returns {boolean} true если валидация прошла успешно
     */
    function validateQuantity(quantityInput, salesUnitSelect) {
        const selectedOption = salesUnitSelect.options[salesUnitSelect.selectedIndex];

        // Если единица не выбрана - валидируем только положительность
        if (!selectedOption || !selectedOption.value) {
            return quantityInput.value > 0;
        }

        const quantity = parseFloat(quantityInput.value);
        const minQty = parseFloat(selectedOption.getAttribute('data-min-qty'));
        const step = parseFloat(selectedOption.getAttribute('data-step'));

        // Проверка минимального количества
        if (quantity < minQty) {
            alert(`Минимальное количество: ${minQty}`);
            return false;
        }

        // Проверка шага (кратности)
        if (step && step > 0) {
            const remainder = quantity % step;
            // Используем небольшую погрешность для сравнения float
            if (remainder > 0.0001 && (step - remainder) > 0.0001) {
                alert(`Количество должно быть кратно ${step}`);
                return false;
            }
        }

        return true;
    }

    /**
     * Инициализирует обработчики событий для единиц продажи в форме
     * @param {HTMLElement} formElement - Элемент формы или родительский контейнер
     */
    function initializeSalesUnitHandlers(formElement) {
        const salesUnitSelect = formElement.querySelector('.sales-unit-selector');
        const priceInput = formElement.querySelector('[name$="-price"], [name="price"]');
        const quantityInput = formElement.querySelector('[name$="-quantity"], [name="quantity"]');
        const isCustomPriceInput = formElement.querySelector('[name$="-is_custom_price"], [name="is_custom_price"]');
        const availableQtyDisplay = formElement.querySelector('.available-qty-display');

        if (!salesUnitSelect) {
            return;
        }

        // При смене единицы - обновить цену, остатки и quantity
        salesUnitSelect.addEventListener('change', function() {
            updatePriceOnUnitChange(salesUnitSelect, priceInput, isCustomPriceInput);
            displayAvailableQuantity(salesUnitSelect, availableQtyDisplay);
            
            // ИСПРАВЛЕНИЕ: При смене единицы сохраняем quantity или ставим минимум
            if (quantityInput) {
                const currentQty = parseFloat(quantityInput.value) || 0;
                const selectedOption = salesUnitSelect.options[salesUnitSelect.selectedIndex];
                const minQty = selectedOption ? parseFloat(selectedOption.getAttribute('data-min-qty')) || 1 : 1;
                
                // Если quantity пустое/нулевое - установить минимум
                if (currentQty === 0) {
                    quantityInput.value = minQty;
                }
            }
        });

        // Отследить ручное изменение цены
        if (priceInput) {
            priceInput.addEventListener('change', function() {
                const originalPrice = priceInput.dataset.originalPrice;
                if (originalPrice && parseFloat(priceInput.value) !== parseFloat(originalPrice)) {
                    if (isCustomPriceInput) {
                        isCustomPriceInput.value = 'true';
                    }
                }
            });
        }

        // Валидация количества при потере фокуса
        if (quantityInput) {
            quantityInput.addEventListener('blur', function() {
                validateQuantity(quantityInput, salesUnitSelect);
            });
        }

        // Начальное отображение остатков и обновление цены если единица уже выбрана
        if (salesUnitSelect.value) {
            displayAvailableQuantity(salesUnitSelect, availableQtyDisplay);
            // Начальное обновление цены (страховка на случай если событие change не сработает)
            updatePriceOnUnitChange(salesUnitSelect, priceInput, isCustomPriceInput);
        }
    }

    /**
     * Создает и вставляет контейнер для единиц продажи в форму
     * @param {HTMLElement} targetElement - Элемент, после которого вставить контейнер
     * @returns {HTMLElement} Созданный контейнер
     */
    function createSalesUnitContainer(targetElement) {
        const container = document.createElement('div');
        container.className = 'mb-3 sales-unit-container';
        container.style.display = 'none';
        container.innerHTML = `
            <label class="form-label">Единица продажи</label>
            <div class="sales-unit-selector-wrapper"></div>
            <div class="available-qty-display mt-1"></div>
        `;

        targetElement.insertAdjacentElement('afterend', container);
        return container;
    }

    // Экспорт публичного API
    window.SalesUnitsModule = {
        fetchSalesUnits,
        createSalesUnitSelect,
        updatePriceOnUnitChange,
        displayAvailableQuantity,
        validateQuantity,
        initializeSalesUnitHandlers,
        createSalesUnitContainer
    };

    console.log('[SalesUnits] Модуль инициализирован');

})(window);
