/**
 * Управление конфигурацией (FR-027)
 */

document.addEventListener('DOMContentLoaded', function() {
    let currentVersion = null;
    
    // Загрузка текущей конфигурации
    async function loadCurrentConfig() {
        try {
            const response = await fetch('/api/base/settings');
            const data = await response.json();
            
            // Преобразуем в YAML (упрощенная версия)
            const yaml = `app:
  name: ${data.app_name || ''}
web:
  port: ${data.web_port || ''}
database:
  driver: ${data.db_driver || ''}
  host: ${data.db_host || ''}
  database: ${data.db_name || ''}
  username: ${data.db_user || ''}
  password: ${data.db_pass || ''}
logging:
  level: ${data.log_level || ''}`;
            
            document.getElementById('config-yaml').value = yaml;
        } catch (error) {
            console.error('Ошибка загрузки конфигурации:', error);
            showAlert('Ошибка загрузки конфигурации', 'danger');
        }
    }
    
    // Загрузка истории
    async function loadHistory() {
        const tbody = document.getElementById('history-tbody');
        tbody.innerHTML = '<tr><td colspan="6" class="text-center">Загрузка...</td></tr>';
        
        try {
            const response = await fetch('/api/v1/admin/config/history?limit=50');
            const result = await response.json();
            
            if (!result.success) {
                tbody.innerHTML = `<tr><td colspan="6" class="text-center text-danger">${result.error || 'Ошибка загрузки'}</td></tr>`;
                return;
            }
            
            if (result.history.length === 0) {
                tbody.innerHTML = '<tr><td colspan="6" class="text-center">История пуста</td></tr>';
                return;
            }
            
            tbody.innerHTML = result.history.map(entry => `
                <tr>
                    <td><strong>v${entry.version}</strong></td>
                    <td><span class="badge bg-info">${entry.change_type}</span></td>
                    <td>${entry.description || '-'}</td>
                    <td>${entry.changed_by ? `User #${entry.changed_by}` : 'System'}</td>
                    <td>${new Date(entry.created_at).toLocaleString('ru-RU')}</td>
                    <td>
                        <button class="btn btn-sm btn-info" onclick="viewVersion(${entry.version})">
                            <i class="bi bi-eye"></i> Просмотр
                        </button>
                        <button class="btn btn-sm btn-warning" onclick="restoreVersion(${entry.version})">
                            <i class="bi bi-arrow-counterclockwise"></i> Восстановить
                        </button>
                    </td>
                </tr>
            `).join('');
        } catch (error) {
            console.error('Ошибка загрузки истории:', error);
            tbody.innerHTML = '<tr><td colspan="6" class="text-center text-danger">Ошибка загрузки истории</td></tr>';
        }
    }
    
    // Просмотр версии
    window.viewVersion = async function(version) {
        try {
            const response = await fetch(`/api/v1/admin/config/history/${version}`);
            const result = await response.json();
            
            if (!result.success) {
                showAlert(result.error || 'Ошибка загрузки версии', 'danger');
                return;
            }
            
            document.getElementById('version-number').textContent = `v${version}`;
            document.getElementById('version-content').textContent = JSON.stringify(result.config, null, 2);
            currentVersion = version;
            
            const modal = new bootstrap.Modal(document.getElementById('versionModal'));
            modal.show();
        } catch (error) {
            console.error('Ошибка просмотра версии:', error);
            showAlert('Ошибка загрузки версии', 'danger');
        }
    };
    
    // Восстановление версии
    window.restoreVersion = async function(version) {
        if (!confirm(`Вы уверены, что хотите восстановить конфигурацию до версии ${version}?`)) {
            return;
        }
        
        try {
            const response = await fetch(`/api/v1/admin/config/history/${version}/restore`, {
                method: 'POST',
                headers: {'Content-Type': 'application/json'},
                body: JSON.stringify({
                    description: `Восстановление до версии ${version} через UI`
                })
            });
            
            const result = await response.json();
            
            if (result.success) {
                showAlert(`Конфигурация восстановлена до версии ${version}`, 'success');
                await loadCurrentConfig();
                await loadHistory();
            } else {
                showAlert(result.error || 'Ошибка восстановления', 'danger');
            }
        } catch (error) {
            console.error('Ошибка восстановления:', error);
            showAlert('Ошибка восстановления', 'danger');
        }
    };
    
    // Сохранение конфигурации
    document.getElementById('config-form').addEventListener('submit', async function(e) {
        e.preventDefault();
        
        const yamlText = document.getElementById('config-yaml').value;
        const description = document.getElementById('config-description').value;
        
        // Парсим YAML (упрощенная версия - только для базовых полей)
        try {
            // Здесь должна быть валидация YAML
            // Для упрощения используем существующий API
            const lines = yamlText.split('\n');
            const data = {};
            
            lines.forEach(line => {
                const match = line.match(/^\s*(\w+):\s*(.+)$/);
                if (match) {
                    const key = match[1];
                    const value = match[2].trim();
                    
                    if (key === 'name' && !data.app) data.app = {};
                    if (key === 'port' && !data.web) data.web = {};
                    if (['driver', 'host', 'database', 'username', 'password'].includes(key) && !data.database) data.database = {};
                    if (key === 'level' && !data.logging) data.logging = {};
                    
                    if (key === 'name') data.app_name = value;
                    else if (key === 'port') data.web_port = parseInt(value) || value;
                    else if (key === 'driver') data.db_driver = value;
                    else if (key === 'host') data.db_host = value;
                    else if (key === 'database') data.db_name = value;
                    else if (key === 'username') data.db_user = value;
                    else if (key === 'password') data.db_pass = value;
                    else if (key === 'level') data.log_level = value;
                }
            });
            
            data.description = description;
            
            const response = await fetch('/api/base/settings', {
                method: 'POST',
                headers: {'Content-Type': 'application/json'},
                body: JSON.stringify(data)
            });
            
            const result = await response.json();
            
            if (result.success) {
                showAlert('Конфигурация успешно сохранена', 'success');
                await loadHistory();
            } else {
                showAlert(result.message || 'Ошибка сохранения', 'danger');
            }
        } catch (error) {
            console.error('Ошибка сохранения:', error);
            showAlert('Ошибка сохранения конфигурации', 'danger');
        }
    });
    
    // Валидация
    document.getElementById('validate-btn').addEventListener('click', function() {
        const yamlText = document.getElementById('config-yaml').value;
        const resultDiv = document.getElementById('config-validation-result');
        
        // Простая валидация YAML синтаксиса
        try {
            // Здесь должна быть полная валидация YAML
            resultDiv.innerHTML = '<div class="alert alert-success"><i class="bi bi-check-circle"></i> YAML синтаксис корректен</div>';
        } catch (error) {
            resultDiv.innerHTML = `<div class="alert alert-danger"><i class="bi bi-x-circle"></i> Ошибка валидации: ${error.message}</div>`;
        }
    });
    
    // Перезагрузка
    document.getElementById('reload-btn').addEventListener('click', loadCurrentConfig);
    
    // Обновление истории
    document.getElementById('refresh-history-btn').addEventListener('click', loadHistory);
    
    // Экспорт
    document.getElementById('export-btn').addEventListener('click', async function() {
        const format = document.getElementById('export-format').value;
        const version = document.getElementById('export-version').value;
        
        let url = `/api/v1/admin/config/export?format=${format}`;
        if (version) url += `&version=${version}`;
        
        window.location.href = url;
    });
    
    // Импорт
    document.getElementById('import-btn').addEventListener('click', async function() {
        const fileInput = document.getElementById('import-file');
        const file = fileInput.files[0];
        
        if (!file) {
            showAlert('Выберите файл для импорта', 'warning');
            return;
        }
        
        const formData = new FormData();
        formData.append('file', file);
        
        try {
            const response = await fetch('/api/v1/admin/config/import', {
                method: 'POST',
                body: formData
            });
            
            const result = await response.json();
            const resultDiv = document.getElementById('import-result');
            
            if (result.success) {
                resultDiv.innerHTML = '<div class="alert alert-success"><i class="bi bi-check-circle"></i> Конфигурация успешно импортирована</div>';
                await loadCurrentConfig();
                await loadHistory();
            } else {
                resultDiv.innerHTML = `<div class="alert alert-danger"><i class="bi bi-x-circle"></i> ${result.error || 'Ошибка импорта'}</div>`;
            }
        } catch (error) {
            console.error('Ошибка импорта:', error);
            document.getElementById('import-result').innerHTML = '<div class="alert alert-danger">Ошибка импорта конфигурации</div>';
        }
    });
    
    // Загрузка шаблонов
    async function loadTemplates() {
        try {
            const response = await fetch('/api/v1/admin/config/templates');
            const result = await response.json();
            
            if (!result.success) {
                return;
            }
            
            const templatesDiv = document.getElementById('templates-list');
            templatesDiv.innerHTML = Object.entries(result.templates).map(([key, template]) => `
                <div class="col-md-4 mb-3">
                    <div class="card">
                        <div class="card-body">
                            <h6 class="card-title">${template.name}</h6>
                            <p class="card-text text-muted small">${template.description}</p>
                            <button class="btn btn-sm btn-primary" onclick="applyTemplate('${key}')">
                                <i class="bi bi-check-circle"></i> Применить
                            </button>
                        </div>
                    </div>
                </div>
            `).join('');
        } catch (error) {
            console.error('Ошибка загрузки шаблонов:', error);
        }
    }
    
    // Применение шаблона
    window.applyTemplate = async function(templateName) {
        if (!confirm(`Применить шаблон "${templateName}"? Текущая конфигурация будет сохранена.`)) {
            return;
        }
        
        try {
            const response = await fetch(`/api/v1/admin/config/templates/${templateName}/apply`, {
                method: 'POST'
            });
            
            const result = await response.json();
            
            if (result.success) {
                showAlert(result.message || 'Шаблон успешно применен', 'success');
                await loadCurrentConfig();
                await loadHistory();
            } else {
                showAlert(result.error || 'Ошибка применения шаблона', 'danger');
            }
        } catch (error) {
            console.error('Ошибка применения шаблона:', error);
            showAlert('Ошибка применения шаблона', 'danger');
        }
    };
    
    // Восстановление из модального окна
    document.getElementById('restore-version-btn').addEventListener('click', function() {
        if (currentVersion) {
            restoreVersion(currentVersion);
            bootstrap.Modal.getInstance(document.getElementById('versionModal')).hide();
        }
    });
    
    // Загрузка при переключении вкладок
    document.querySelectorAll('[data-bs-toggle="tab"]').forEach(tab => {
        tab.addEventListener('shown.bs.tab', function(e) {
            if (e.target.id === 'history-tab') {
                loadHistory();
            } else if (e.target.id === 'templates-tab') {
                loadTemplates();
            }
        });
    });
    
    // Вспомогательная функция для показа уведомлений
    function showAlert(message, type) {
        const alertDiv = document.createElement('div');
        alertDiv.className = `alert alert-${type} alert-dismissible fade show position-fixed top-0 start-50 translate-middle-x mt-3`;
        alertDiv.style.zIndex = '9999';
        alertDiv.innerHTML = `
            ${message}
            <button type="button" class="btn-close" data-bs-dismiss="alert"></button>
        `;
        document.body.appendChild(alertDiv);
        
        setTimeout(() => {
            alertDiv.remove();
        }, 5000);
    }
    
    // Инициализация
    loadCurrentConfig();
});
