/**
 * Bulk Category Assignment Modal
 * Handles modal for assigning categories to multiple products/kits
 */

(function() {
    'use strict';

    // State
    let allCategories = [];
    let selectedCategoryIds = new Set();
    let modalInstance = null;

    // DOM elements
    const modal = document.getElementById('bulkCategoryModal');
    const bulkCategoryAction = document.getElementById('bulk-category-action');
    const applyBtn = document.getElementById('applyBulkCategoriesBtn');
    const categoryListContainer = document.getElementById('categoryListContainer');
    const categorySearchInput = document.getElementById('categorySearchInput');
    const errorAlert = document.getElementById('bulkCategoryError');
    const selectedItemsCountSpan = document.getElementById('selectedItemsCount');
    const selectedItemsBreakdownSpan = document.getElementById('selectedItemsBreakdown');
    const modeHint = document.getElementById('bulkCategoryModeHint');
    const categoryListSection = document.getElementById('bulkCategoryListSection');
    const externalCategorySelect = document.getElementById('externalCategorySelect');
    const clearExternalCategory = document.getElementById('clearExternalCategory');

    /**
     * Initialize the bulk category modal functionality
     */
    function init() {
        if (!modal || !bulkCategoryAction) {
            console.warn('Bulk category modal elements not found');
            return;
        }

        // Initialize Bootstrap modal instance
        modalInstance = new bootstrap.Modal(modal);

        // Event listeners
        bulkCategoryAction.addEventListener('click', handleOpenModal);
        
        if (applyBtn) {
            applyBtn.addEventListener('click', handleApply);
        }
        
        if (categorySearchInput) {
            categorySearchInput.addEventListener('input', handleCategorySearch);
        }
        
        // Listen for mode changes
        const modeRadios = document.querySelectorAll('input[name="bulkCategoryMode"]');
        if (modeRadios.length > 0) {
            modeRadios.forEach(radio => {
                radio.addEventListener('change', () => {
                    hideError();
                    updateModeUI();
                    updateApplyButtonState();
                });
            });
        }

        // Listen for external category changes
        if (externalCategorySelect) {
            externalCategorySelect.addEventListener('change', () => {
                hideError();
                if (externalCategorySelect.value) {
                    clearExternalCategory.checked = false;
                }
                updateApplyButtonState();
            });
        }

        // Listen for clear external category checkbox
        if (clearExternalCategory) {
            clearExternalCategory.addEventListener('change', () => {
                hideError();
                if (clearExternalCategory.checked) {
                    externalCategorySelect.value = '';
                }
                updateApplyButtonState();
            });
        }

        // Listen for modal close to reset state
        modal.addEventListener('hidden.bs.modal', resetModalState);

        // Initial UI state (only if elements exist)
        if (modeRadios.length > 0) {
            updateModeUI();
            updateApplyButtonState();
        }

        console.log('Bulk category modal initialized');
    }

    /**
     * Handle opening the modal
     */
    function handleOpenModal(e) {
        e.preventDefault();

        // Get selected items from batch selection
        const selectedItems = getSelectedItems();
        
        if (selectedItems.length === 0) {
            alert('Выберите товары для изменения категорий');
            return;
        }

        // Update modal header with selection info
        updateSelectionInfo(selectedItems);

        // Reset state
        selectedCategoryIds.clear();
        hideError();
        
        // Reset external category
        if (externalCategorySelect) {
            externalCategorySelect.value = '';
        }
        if (clearExternalCategory) {
            clearExternalCategory.checked = false;
        }

        // Open modal and load categories
        modalInstance.show();
        loadCategories();
    }

    /**
     * Get selected items from batch selection system
     */
    function getSelectedItems() {
        const items = [];
        
        // Access the global batch selection state
        if (window.BatchSelection && window.BatchSelection.getSelectedItems) {
            const selectedItemsArray = window.BatchSelection.getSelectedItems();
            selectedItemsArray.forEach(itemKey => {
                const [type, id] = itemKey.split(':');
                items.push({ type, id: parseInt(id) });
            });
        } else {
            // Fallback: read from checkboxes directly
            document.querySelectorAll('.item-checkbox:checked').forEach(checkbox => {
                const type = checkbox.dataset.itemType;
                const id = parseInt(checkbox.dataset.itemId);
                items.push({ type, id });
            });
        }

        return items;
    }

    /**
     * Update selection info in modal
     */
    function updateSelectionInfo(items) {
        selectedItemsCountSpan.textContent = items.length;

        // Calculate breakdown
        const products = items.filter(i => i.type === 'product').length;
        const kits = items.filter(i => i.type === 'kit').length;

        let breakdown = '';
        if (products > 0 && kits > 0) {
            breakdown = `(${products} товаров, ${kits} комплектов)`;
        } else if (products > 0) {
            breakdown = `(товары)`;
        } else if (kits > 0) {
            breakdown = `(комплекты)`;
        }

        selectedItemsBreakdownSpan.textContent = breakdown;
    }

    /**
     * Get current mode: add | replace | clear
     */
    function getCurrentMode() {
        const checked = document.querySelector('input[name="bulkCategoryMode"]:checked');
        return checked ? checked.value : 'add';
    }

    /**
     * Update UI depending on selected mode
     */
    function updateModeUI() {
        const mode = getCurrentMode();

        if (categorySearchInput) {
            categorySearchInput.disabled = (mode === 'clear');
        }

        if (categoryListSection) {
            if (mode === 'clear') {
                categoryListSection.classList.add('opacity-50');
            } else {
                categoryListSection.classList.remove('opacity-50');
            }
        }

        if (modeHint) {
            if (mode === 'add') {
                modeHint.textContent = 'Добавленные категории будут присоединены к уже существующим.';
            } else if (mode === 'replace') {
                modeHint.textContent = 'Существующие категории будут полностью заменены выбранными ниже.';
            } else if (mode === 'clear') {
                modeHint.textContent = 'Все категории будут удалены. Список ниже будет проигнорирован.';
            }
        }
    }

    /**
     * Load categories from server
     */
    async function loadCategories() {
        categoryListContainer.innerHTML = `
            <div class="text-center py-3">
                <div class="spinner-border spinner-border-sm" role="status">
                    <span class="visually-hidden">Загрузка...</span>
                </div>
                <div class="mt-2 text-muted">Загрузка категорий...</div>
            </div>
        `;

        try {
            // Get active categories (we can reuse the filter endpoint or create a dedicated one)
            const response = await fetch('/products/api/search-products-variants/?type=category', {
                method: 'GET',
                headers: {
                    'Content-Type': 'application/json',
                }
            });

            if (!response.ok) {
                throw new Error('Не удалось загрузить категории');
            }

            // For now, let's use a simpler approach - get categories from the page context
            // In production, you might want a dedicated API endpoint
            allCategories = await fetchCategoriesFromDOM();
            
            renderCategoryList(allCategories);
        } catch (error) {
            console.error('Error loading categories:', error);
            categoryListContainer.innerHTML = `
                <div class="alert alert-warning">
                    <i class="bi bi-exclamation-triangle"></i> 
                    Не удалось загрузить категории. 
                    <a href="#" onclick="location.reload()">Обновите страницу</a>
                </div>
            `;
        }
    }

    /**
     * Fetch categories from the page's filter dropdown
     */
    function fetchCategoriesFromDOM() {
        const categories = [];
        const categorySelect = document.getElementById('category');
        
        if (categorySelect) {
            categorySelect.querySelectorAll('option').forEach(option => {
                if (option.value) {  // Skip empty option
                    categories.push({
                        id: parseInt(option.value),
                        name: option.textContent.trim()
                    });
                }
            });
        }

        return categories;
    }

    /**
     * Render category list with checkboxes
     */
    function renderCategoryList(categories) {
        if (categories.length === 0) {
            categoryListContainer.innerHTML = `
                <div class="alert alert-info mb-0">
                    <i class="bi bi-info-circle"></i> 
                    Нет доступных категорий. 
                    <a href="/products/categories/create/" target="_blank">Создать категорию</a>
                </div>
            `;
            return;
        }

        let html = '<div class="list-group list-group-flush">';
        
        categories.forEach(category => {
            const isChecked = selectedCategoryIds.has(category.id);
            html += `
                <div class="list-group-item list-group-item-action p-2">
                    <div class="form-check">
                        <input class="form-check-input category-checkbox" 
                               type="checkbox" 
                               value="${category.id}" 
                               id="category_${category.id}"
                               ${isChecked ? 'checked' : ''}>
                        <label class="form-check-label w-100" for="category_${category.id}">
                            ${category.name}
                        </label>
                    </div>
                </div>
            `;
        });

        html += '</div>';
        categoryListContainer.innerHTML = html;

        // Add event listeners to checkboxes
        categoryListContainer.querySelectorAll('.category-checkbox').forEach(checkbox => {
            checkbox.addEventListener('change', handleCategoryToggle);
        });

        updateApplyButtonState();
    }

    /**
     * Handle category checkbox toggle
     */
    function handleCategoryToggle(e) {
        const categoryId = parseInt(e.target.value);
        
        if (e.target.checked) {
            selectedCategoryIds.add(categoryId);
        } else {
            selectedCategoryIds.delete(categoryId);
        }

        updateApplyButtonState();
    }

    /**
     * Handle category search
     */
    function handleCategorySearch(e) {
        const searchTerm = e.target.value.toLowerCase().trim();
        
        if (searchTerm === '') {
            renderCategoryList(allCategories);
        } else {
            const filtered = allCategories.filter(cat => 
                cat.name.toLowerCase().includes(searchTerm)
            );
            renderCategoryList(filtered);
        }
    }

    /**
     * Update apply button state
     */
    function updateApplyButtonState() {
        if (!applyBtn) {
            return;
        }
        
        const mode = getCurrentMode();
        const hasExternalCategory = externalCategorySelect && externalCategorySelect.value;
        const shouldClearExternal = clearExternalCategory && clearExternalCategory.checked;
        
        if (mode === 'clear') {
            // В режиме очистки M2M категорий не требуются
            // Но можно также очистить внешнюю категорию
            applyBtn.disabled = false;
        } else {
            // Для add/replace нужна хотя бы одна выбранная категория ИЛИ внешняя категория ИЛИ очистка
            applyBtn.disabled = selectedCategoryIds.size === 0 && !hasExternalCategory && !shouldClearExternal;
        }
    }

    /**
     * Handle apply button click
     */
    async function handleApply() {
        const mode = getCurrentMode();
        const selectedItems = getSelectedItems();
        const externalCategoryId = externalCategorySelect ? externalCategorySelect.value : null;
        const shouldClearExternal = clearExternalCategory && clearExternalCategory.checked;

        if (selectedItems.length === 0) {
            showError('Нет выбранных товаров');
            return;
        }

        // Проверка: если выбрана внешняя категория и стоит чекбокс очистки
        if (externalCategoryId && shouldClearExternal) {
            showError('Нельзя одновременно выбрать и очистить внешнюю категорию');
            return;
        }

        // Режим очистки M2M категорий
        if (mode === 'clear') {
            let confirmMsg = `Вы уверены, что хотите удалить ВСЕ категории у ${selectedItems.length} выбранных товаров?\n\nЭто действие нельзя отменить!`;
            if (shouldClearExternal) {
                confirmMsg += '\n\nТакже будет очищена внешняя категория для интеграций.';
            }
            const confirmed = confirm(confirmMsg);
            if (!confirmed) {
                return;
            }

            const csrfToken = getCsrfToken();
            if (!csrfToken) {
                showError('CSRF токен не найден. Обновите страницу и попробуйте снова.');
                console.error('CSRF token not found');
                return;
            }

            const requestData = {
                items: selectedItems,
                category_ids: [],
                action_mode: 'clear'
            };

            // Добавляем external_category_id только если нужно очистить
            if (shouldClearExternal) {
                requestData.external_category_id = null;
            }

            applyBtn.disabled = true;
            applyBtn.innerHTML = '<span class="spinner-border spinner-border-sm me-2"></span>Применение...';

            try {
                const response = await fetch('/products/api/bulk-update-categories/', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json',
                        'X-CSRFToken': csrfToken
                    },
                    body: JSON.stringify(requestData)
                });

                if (!response.ok) {
                    let errorMessage = 'Ошибка сервера';
                    try {
                        const responseText = await response.text();
                        try {
                            const errorData = JSON.parse(responseText);
                            errorMessage = errorData.message || errorData.error || errorMessage;
                        } catch (jsonError) {
                            console.error('Server error response:', responseText);
                            errorMessage = `Ошибка ${response.status}: ${response.statusText}`;
                            if (response.status === 403) {
                                errorMessage = 'Доступ запрещён. Возможно, проблема с CSRF токеном. Обновите страницу и попробуйте снова.';
                            }
                        }
                    } catch (readError) {
                        console.error('Error reading response:', readError);
                        errorMessage = `Ошибка ${response.status}: ${response.statusText}`;
                    }
                    showError(errorMessage);
                    return;
                }

                const result = await response.json();

                if (result.success) {
                    showSuccessToast(result.message || `Категории удалены у ${result.updated_count} товаров`);
                    modalInstance.hide();

                    setTimeout(() => {
                        if (confirm('Категории очищены. Обновить страницу?')) {
                            location.reload();
                        }
                    }, 500);
                } else {
                    showError(result.message || 'Не удалось очистить категории');
                }
            } catch (error) {
                console.error('Error applying clear categories:', error);
                showError('Произошла ошибка. Попробуйте снова. Ошибка: ' + error.message);
            } finally {
                applyBtn.innerHTML = '<i class="bi bi-check2-circle"></i> Применить';
                applyBtn.disabled = false;
                updateApplyButtonState();
            }

            return;
        }

        // Режим add/replace
        if (selectedCategoryIds.size === 0 && !externalCategoryId && !shouldClearExternal) {
            showError('Выберите хотя бы одну категорию или внешнюю категорию');
            return;
        }

        const actionMode = mode === 'replace' ? 'replace' : 'add';
        
        const requestData = {
            items: selectedItems,
            category_ids: Array.from(selectedCategoryIds),
            action_mode: actionMode
        };
        
        // Добавляем внешнюю категорию если выбрана
        if (externalCategoryId) {
            requestData.external_category_id = parseInt(externalCategoryId);
        } else if (shouldClearExternal) {
            requestData.clear_external_category = true;
        }

        const csrfToken = getCsrfToken();
        if (!csrfToken) {
            showError('CSRF токен не найден. Обновите страницу и попробуйте снова.');
            console.error('CSRF token not found');
            return;
        }

        // Disable button and show loading
        applyBtn.disabled = true;
        applyBtn.innerHTML = '<span class="spinner-border spinner-border-sm me-2"></span>Применение...';

        console.log('Sending bulk update request:', requestData);

        try {
            const response = await fetch('/products/api/bulk-update-categories/', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                    'X-CSRFToken': csrfToken
                },
                body: JSON.stringify(requestData)
            });

            // Проверяем статус ответа
            if (!response.ok) {
                let errorMessage = 'Ошибка сервера';
                try {
                    // Читаем тело один раз как текст
                    const responseText = await response.text();
                    // Пытаемся распарсить как JSON
                    try {
                        const errorData = JSON.parse(responseText);
                        errorMessage = errorData.message || errorData.error || errorMessage;
                    } catch (jsonError) {
                        // Если не JSON, используем текст как есть или формируем сообщение
                        console.error('Server error response:', responseText);
                        errorMessage = `Ошибка ${response.status}: ${response.statusText}`;
                        if (response.status === 403) {
                            errorMessage = 'Доступ запрещён. Возможно, проблема с CSRF токеном. Обновите страницу и попробуйте снова.';
                        }
                    }
                } catch (readError) {
                    console.error('Error reading response:', readError);
                    errorMessage = `Ошибка ${response.status}: ${response.statusText}`;
                }
                showError(errorMessage);
                return;
            }

            const result = await response.json();

            if (result.success) {
                // Show success message
                showSuccessToast(result.message);
                
                // Close modal
                modalInstance.hide();
                
                // Optionally reload page to show updated categories
                // For v1, we'll just show message suggesting refresh
                if (result.updated_count > 0) {
                    setTimeout(() => {
                        if (confirm('Категории обновлены. Обновить страницу для отображения изменений?')) {
                            location.reload();
                        }
                    }, 500);
                }
            } else {
                showError(result.message || 'Не удалось обновить категории');
                
                // Show skipped reasons if any
                if (result.skipped_reasons && result.skipped_reasons.length > 0) {
                    console.warn('Skipped items:', result.skipped_reasons);
                }
            }
        } catch (error) {
            console.error('Error applying bulk categories:', error);
            showError('Произошла ошибка при обновлении категорий. Попробуйте снова. Ошибка: ' + error.message);
        } finally {
            // Reset button
            applyBtn.innerHTML = '<i class="bi bi-check2-circle"></i> Применить';
            applyBtn.disabled = false;
            updateApplyButtonState();
        }
    }

    /**
     * Show error message in modal
     */
    function showError(message) {
        errorAlert.textContent = message;
        errorAlert.classList.remove('d-none');
    }

    /**
     * Hide error message
     */
    function hideError() {
        errorAlert.classList.add('d-none');
    }

    /**
     * Show success toast notification
     */
    function showSuccessToast(message) {
        // Create toast container if it doesn't exist
        let toastContainer = document.querySelector('.toast-container');
        if (!toastContainer) {
            toastContainer = document.createElement('div');
            toastContainer.className = 'toast-container position-fixed top-0 end-0 p-3';
            toastContainer.style.zIndex = '11000';
            document.body.appendChild(toastContainer);
        }

        // Create toast
        const toastId = 'toast_' + Date.now();
        const toastHtml = `
            <div id="${toastId}" class="toast align-items-center text-white bg-success border-0" role="alert" aria-live="assertive" aria-atomic="true">
                <div class="d-flex">
                    <div class="toast-body">
                        <i class="bi bi-check-circle me-2"></i>${message}
                    </div>
                    <button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
                </div>
            </div>
        `;

        toastContainer.insertAdjacentHTML('beforeend', toastHtml);
        
        const toastElement = document.getElementById(toastId);
        const toast = new bootstrap.Toast(toastElement, {
            autohide: true,
            delay: 5000
        });
        
        toast.show();

        // Remove toast element after it's hidden
        toastElement.addEventListener('hidden.bs.toast', () => {
            toastElement.remove();
        });
    }

    /**
     * Reset modal state
     */
    function resetModalState() {
        selectedCategoryIds.clear();

        if (categorySearchInput) {
            categorySearchInput.value = '';
        }

        hideError();

        // Сбрасываем режим на "добавить"
        const addModeRadio = document.getElementById('bulkCategoryModeAdd');
        if (addModeRadio) {
            addModeRadio.checked = true;
        }

        // Сбрасываем внешнюю категорию
        if (externalCategorySelect) {
            externalCategorySelect.value = '';
        }
        if (clearExternalCategory) {
            clearExternalCategory.checked = false;
        }

        updateModeUI();
        updateApplyButtonState();
    }

    /**
     * Get CSRF token from meta tag or cookie
     */
    function getCsrfToken() {
        // Сначала пробуем получить из мета-тега (для CSRF_USE_SESSIONS = True)
        const metaTag = document.querySelector('meta[name="csrf-token"]');
        if (metaTag) {
            const token = metaTag.getAttribute('content');
            if (token) {
                return token;
            }
        }

        // Если нет в мета-теге, пробуем из cookie (обратная совместимость)
        const name = 'csrftoken';
        let cookieValue = null;
        if (document.cookie && document.cookie !== '') {
            const cookies = document.cookie.split(';');
            for (let i = 0; i < cookies.length; i++) {
                const cookie = cookies[i].trim();
                if (cookie.substring(0, name.length + 1) === (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }

    // Initialize on DOM ready
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
    } else {
        init();
    }

})();
