/**
 * JavaScript для страницы настроек и интеграций (FR-033)
 */

let currentTab = 'system-settings';

document.addEventListener('DOMContentLoaded', function() {
    loadSystemSettings();
    loadIntegrations();
    loadNotificationChannels();
    loadNotificationRules();
    loadBackups();
});

function switchSettingsTab(tab) {
    currentTab = tab;
    
    // Скрываем все вкладки
    document.querySelectorAll('.tab-content').forEach(el => {
        el.style.display = 'none';
    });
    
    // Показываем выбранную вкладку
    document.getElementById(`${tab}-tab`).style.display = 'block';
    
    // Обновляем активную кнопку
    document.querySelectorAll('#settingsTabs .nav-link').forEach(btn => {
        btn.classList.remove('active');
    });
    event.target.classList.add('active');
    
    // Загружаем данные для вкладки
    if (tab === 'system-settings') {
        loadSystemSettings();
    } else if (tab === 'integrations') {
        loadIntegrations();
    } else if (tab === 'notifications') {
        loadNotificationChannels();
        loadNotificationRules();
    } else if (tab === 'backups') {
        loadBackups();
    }
}

// === System Settings ===

async function loadSystemSettings() {
    try {
        const category = document.getElementById('settingsCategoryFilter').value;
        const url = `/api/v1/admin/settings${category ? `?category=${category}` : ''}`;
        const response = await fetch(url);
        const data = await response.json();
        
        if (data.success) {
            renderSystemSettings(data.settings);
        } else {
            showError('Ошибка загрузки настроек: ' + (data.error || 'Неизвестная ошибка'));
        }
    } catch (error) {
        showError('Ошибка загрузки настроек: ' + error.message);
    }
}

function renderSystemSettings(settings) {
    const tbody = document.getElementById('systemSettingsTableBody');
    if (settings.length === 0) {
        tbody.innerHTML = '<tr><td colspan="7" class="text-center">Нет настроек</td></tr>';
        return;
    }
    
    tbody.innerHTML = settings.map(s => `
        <tr>
            <td><code>${s.key}</code></td>
            <td>${s.is_encrypted ? '***' : (typeof s.value === 'object' ? JSON.stringify(s.value) : s.value)}</td>
            <td><span class="badge bg-info">${s.value_type}</span></td>
            <td><span class="badge bg-secondary">${s.category}</span></td>
            <td>${s.description || '-'}</td>
            <td>${s.updated_at ? new Date(s.updated_at).toLocaleString('ru-RU') : '-'}</td>
            <td>
                <button class="btn btn-sm btn-primary" onclick="editSetting('${s.key}')">
                    <i class="bi bi-pencil"></i>
                </button>
                <button class="btn btn-sm btn-danger" onclick="deleteSetting('${s.key}')">
                    <i class="bi bi-trash"></i>
                </button>
            </td>
        </tr>
    `).join('');
}

function showAddSettingModal() {
    // TODO: Реализовать модальное окно
    alert('Функция добавления настройки будет реализована');
}

function editSetting(key) {
    // TODO: Реализовать редактирование
    alert(`Редактирование настройки ${key} будет реализовано`);
}

async function deleteSetting(key) {
    if (!confirm(`Удалить настройку ${key}?`)) return;
    
    try {
        const response = await fetch(`/api/v1/admin/settings/${key}`, {
            method: 'DELETE'
        });
        const result = await response.json();
        
        if (result.success) {
            loadSystemSettings();
            showSuccess('Настройка удалена');
        } else {
            showError('Ошибка: ' + (result.error || 'Неизвестная ошибка'));
        }
    } catch (error) {
        showError('Ошибка: ' + error.message);
    }
}

// === Integrations ===

async function loadIntegrations() {
    try {
        const type = document.getElementById('integrationTypeFilter').value;
        const url = `/api/v1/admin/integrations${type ? `?type=${type}` : ''}`;
        const response = await fetch(url);
        const data = await response.json();
        
        if (data.success) {
            renderIntegrations(data.integrations);
        } else {
            showError('Ошибка загрузки интеграций: ' + (data.error || 'Неизвестная ошибка'));
        }
    } catch (error) {
        showError('Ошибка загрузки интеграций: ' + error.message);
    }
}

function renderIntegrations(integrations) {
    const tbody = document.getElementById('integrationsTableBody');
    if (integrations.length === 0) {
        tbody.innerHTML = '<tr><td colspan="6" class="text-center">Нет интеграций</td></tr>';
        return;
    }
    
    tbody.innerHTML = integrations.map(i => `
        <tr>
            <td>${i.name}</td>
            <td><span class="badge bg-info">${i.integration_type}</span></td>
            <td>
                <span class="badge ${i.enabled ? 'bg-success' : 'bg-secondary'}">
                    ${i.enabled ? 'Включено' : 'Отключено'}
                </span>
            </td>
            <td>${i.last_sync ? new Date(i.last_sync).toLocaleString('ru-RU') : 'Никогда'}</td>
            <td>
                ${i.sync_status ? `
                    <span class="badge ${i.sync_status === 'success' ? 'bg-success' : i.sync_status === 'failed' ? 'bg-danger' : 'bg-warning'}">
                        ${i.sync_status === 'success' ? 'Успешно' : i.sync_status === 'failed' ? 'Ошибка' : 'В процессе'}
                    </span>
                ` : '-'}
            </td>
            <td>
                <button class="btn btn-sm btn-primary" onclick="syncIntegration(${i.id})">
                    <i class="bi bi-arrow-repeat"></i> Синхронизировать
                </button>
                <button class="btn btn-sm btn-danger" onclick="deleteIntegration(${i.id})">
                    <i class="bi bi-trash"></i>
                </button>
            </td>
        </tr>
    `).join('');
}

function showAddIntegrationModal() {
    alert('Функция добавления интеграции будет реализована');
}

async function syncIntegration(integrationId) {
    try {
        const response = await fetch(`/api/v1/admin/integrations/${integrationId}/sync`, {
            method: 'POST'
        });
        const result = await response.json();
        
        if (result.success) {
            loadIntegrations();
            showSuccess('Интеграция синхронизирована');
        } else {
            showError('Ошибка: ' + (result.error || 'Неизвестная ошибка'));
        }
    } catch (error) {
        showError('Ошибка: ' + error.message);
    }
}

async function deleteIntegration(integrationId) {
    if (!confirm('Удалить интеграцию?')) return;
    
    try {
        const response = await fetch(`/api/v1/admin/integrations/${integrationId}`, {
            method: 'DELETE'
        });
        const result = await response.json();
        
        if (result.success) {
            loadIntegrations();
            showSuccess('Интеграция удалена');
        } else {
            showError('Ошибка: ' + (result.error || 'Неизвестная ошибка'));
        }
    } catch (error) {
        showError('Ошибка: ' + error.message);
    }
}

// === Notification Channels ===

async function loadNotificationChannels() {
    try {
        const response = await fetch('/api/v1/admin/notification-channels');
        const data = await response.json();
        
        if (data.success) {
            renderNotificationChannels(data.channels);
        } else {
            showError('Ошибка загрузки каналов: ' + (data.error || 'Неизвестная ошибка'));
        }
    } catch (error) {
        showError('Ошибка загрузки каналов: ' + error.message);
    }
}

function renderNotificationChannels(channels) {
    const tbody = document.getElementById('notificationChannelsTableBody');
    if (channels.length === 0) {
        tbody.innerHTML = '<tr><td colspan="4" class="text-center">Нет каналов</td></tr>';
        return;
    }
    
    tbody.innerHTML = channels.map(c => `
        <tr>
            <td>${c.name}</td>
            <td><span class="badge bg-info">${c.channel_type}</span></td>
            <td>
                <span class="badge ${c.enabled ? 'bg-success' : 'bg-secondary'}">
                    ${c.enabled ? 'Включено' : 'Отключено'}
                </span>
            </td>
            <td>
                <button class="btn btn-sm btn-primary" onclick="editChannel(${c.id})">
                    <i class="bi bi-pencil"></i>
                </button>
                <button class="btn btn-sm btn-danger" onclick="deleteChannel(${c.id})">
                    <i class="bi bi-trash"></i>
                </button>
            </td>
        </tr>
    `).join('');
}

function showAddChannelModal() {
    document.getElementById('channelModalTitle').textContent = 'Добавить канал';
    document.getElementById('channelEditId').value = '';
    document.getElementById('channelName').value = '';
    document.getElementById('channelType').value = 'email';
    onChannelTypeChange();
    document.getElementById('channelEmailTo').value = '';
    document.getElementById('channelEmailCc').value = '';
    document.getElementById('channelEmailTemplate').value = 'system.notification';
    document.getElementById('channelWebhookUrl').value = '';
    new bootstrap.Modal(document.getElementById('channelModal')).show();
}

function onChannelTypeChange() {
    const type = document.getElementById('channelType').value;
    document.getElementById('channelEmailFields').style.display = type === 'email' ? 'block' : 'none';
    document.getElementById('channelWebhookFields').style.display = type === 'webhook' ? 'block' : 'none';
}

async function editChannel(channelId) {
    try {
        const response = await fetch('/api/v1/admin/notification-channels');
        const data = await response.json();
        const channel = (data.channels || []).find(c => c.id === channelId);
        if (!channel) {
            showError('Канал не найден');
            return;
        }
        document.getElementById('channelModalTitle').textContent = 'Редактировать канал';
        document.getElementById('channelEditId').value = channelId;
        document.getElementById('channelName').value = channel.name || '';
        document.getElementById('channelType').value = channel.channel_type || 'email';
        onChannelTypeChange();
        const cfg = channel.config || {};
        if (channel.channel_type === 'email') {
            document.getElementById('channelEmailTo').value = (cfg.to || []).join(', ');
            document.getElementById('channelEmailCc').value = (cfg.cc || []).join(', ');
            document.getElementById('channelEmailTemplate').value = cfg.template || 'system.notification';
        } else if (channel.channel_type === 'webhook') {
            document.getElementById('channelWebhookUrl').value = cfg.url || '';
        }
        new bootstrap.Modal(document.getElementById('channelModal')).show();
    } catch (error) {
        showError('Ошибка: ' + error.message);
    }
}

function buildChannelConfig() {
    const type = document.getElementById('channelType').value;
    if (type === 'email') {
        const toRaw = document.getElementById('channelEmailTo').value;
        const ccRaw = document.getElementById('channelEmailCc').value;
        const config = {
            to: toRaw.split(',').map(s => s.trim()).filter(Boolean),
            template: document.getElementById('channelEmailTemplate').value.trim() || 'system.notification'
        };
        const cc = ccRaw.split(',').map(s => s.trim()).filter(Boolean);
        if (cc.length) config.cc = cc;
        return config;
    }
    if (type === 'webhook') {
        return { url: document.getElementById('channelWebhookUrl').value.trim() };
    }
    return {};
}

async function saveChannel() {
    const channelId = document.getElementById('channelEditId').value;
    const payload = {
        name: document.getElementById('channelName').value.trim(),
        channel_type: document.getElementById('channelType').value,
        config: buildChannelConfig(),
        enabled: true
    };
    if (!payload.name) {
        showError('Укажите название канала');
        return;
    }
    try {
        const url = channelId
            ? `/api/v1/admin/notification-channels/${channelId}`
            : '/api/v1/admin/notification-channels';
        const method = channelId ? 'PUT' : 'POST';
        const response = await fetch(url, {
            method,
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify(payload)
        });
        const result = await response.json();
        if (result.success) {
            bootstrap.Modal.getInstance(document.getElementById('channelModal')).hide();
            loadNotificationChannels();
            if (result.warning) {
                showSuccess('Канал сохранён. ' + result.warning);
            } else {
                showSuccess('Канал сохранён');
            }
        } else {
            showError(result.error || result.message || 'Ошибка сохранения');
        }
    } catch (error) {
        showError('Ошибка: ' + error.message);
    }
}

async function deleteChannel(channelId) {
    if (!confirm('Удалить канал уведомлений?')) return;
    
    try {
        const response = await fetch(`/api/v1/admin/notification-channels/${channelId}`, {
            method: 'DELETE'
        });
        const result = await response.json();
        
        if (result.success) {
            loadNotificationChannels();
            showSuccess('Канал удален');
        } else {
            showError('Ошибка: ' + (result.error || 'Неизвестная ошибка'));
        }
    } catch (error) {
        showError('Ошибка: ' + error.message);
    }
}

// === Notification Rules ===

async function loadNotificationRules() {
    try {
        const response = await fetch('/api/v1/admin/notification-rules');
        const data = await response.json();
        
        if (data.success) {
            renderNotificationRules(data.rules);
        } else {
            showError('Ошибка загрузки правил: ' + (data.error || 'Неизвестная ошибка'));
        }
    } catch (error) {
        showError('Ошибка загрузки правил: ' + error.message);
    }
}

function renderNotificationRules(rules) {
    const tbody = document.getElementById('notificationRulesTableBody');
    if (rules.length === 0) {
        tbody.innerHTML = '<tr><td colspan="5" class="text-center">Нет правил</td></tr>';
        return;
    }
    
    tbody.innerHTML = rules.map(r => `
        <tr>
            <td>${r.name}</td>
            <td><span class="badge bg-secondary">${r.event_type}</span></td>
            <td>${r.priority}</td>
            <td>
                <span class="badge ${r.enabled ? 'bg-success' : 'bg-secondary'}">
                    ${r.enabled ? 'Включено' : 'Отключено'}
                </span>
            </td>
            <td>
                <button class="btn btn-sm btn-danger" onclick="deleteRule(${r.id})">
                    <i class="bi bi-trash"></i>
                </button>
            </td>
        </tr>
    `).join('');
}

function showAddRuleModal() {
    alert('Функция добавления правила будет реализована');
}

async function deleteRule(ruleId) {
    if (!confirm('Удалить правило уведомлений?')) return;
    
    // TODO: Реализовать API endpoint для удаления правил
    alert('Удаление правил будет реализовано');
}

// === Backups ===

async function loadBackups() {
    try {
        const type = document.getElementById('backupTypeFilter').value;
        const url = `/api/v1/admin/backups${type ? `?type=${type}` : ''}`;
        const response = await fetch(url);
        const data = await response.json();
        
        if (data.success) {
            renderBackups(data.backups);
        } else {
            showError('Ошибка загрузки резервных копий: ' + (data.error || 'Неизвестная ошибка'));
        }
    } catch (error) {
        showError('Ошибка загрузки резервных копий: ' + error.message);
    }
}

function renderBackups(backups) {
    const tbody = document.getElementById('backupsTableBody');
    if (backups.length === 0) {
        tbody.innerHTML = '<tr><td colspan="7" class="text-center">Нет резервных копий</td></tr>';
        return;
    }
    
    tbody.innerHTML = backups.map(b => `
        <tr>
            <td>${b.backup_name}</td>
            <td><span class="badge bg-info">${b.backup_type}</span></td>
            <td>${formatFileSize(b.file_size)}</td>
            <td>
                <span class="badge ${b.status === 'completed' ? 'bg-success' : b.status === 'failed' ? 'bg-danger' : 'bg-warning'}">
                    ${b.status === 'completed' ? 'Завершено' : b.status === 'failed' ? 'Ошибка' : 'В процессе'}
                </span>
            </td>
            <td>${new Date(b.created_at).toLocaleString('ru-RU')}</td>
            <td>${b.description || '-'}</td>
            <td>
                <button class="btn btn-sm btn-danger" onclick="deleteBackup(${b.id})">
                    <i class="bi bi-trash"></i>
                </button>
            </td>
        </tr>
    `).join('');
}

async function createBackup(type) {
    if (!confirm(`Создать резервную копию типа "${type}"?`)) return;
    
    try {
        const response = await fetch('/api/v1/admin/backups', {
            method: 'POST',
            headers: {'Content-Type': 'application/json'},
            body: JSON.stringify({
                backup_type: type,
                description: `Ручное создание резервной копии: ${type}`
            })
        });
        const result = await response.json();
        
        if (result.success) {
            loadBackups();
            showSuccess(`Резервная копия "${type}" создается...`);
        } else {
            showError('Ошибка: ' + (result.error || 'Неизвестная ошибка'));
        }
    } catch (error) {
        showError('Ошибка: ' + error.message);
    }
}

async function deleteBackup(backupId) {
    if (!confirm('Удалить резервную копию?')) return;
    
    try {
        const response = await fetch(`/api/v1/admin/backups/${backupId}`, {
            method: 'DELETE'
        });
        const result = await response.json();
        
        if (result.success) {
            loadBackups();
            showSuccess('Резервная копия удалена');
        } else {
            showError('Ошибка: ' + (result.error || 'Неизвестная ошибка'));
        }
    } catch (error) {
        showError('Ошибка: ' + error.message);
    }
}

async function cleanupOldBackups() {
    if (!confirm('Удалить старые резервные копии?')) return;
    
    try {
        const response = await fetch('/api/v1/admin/backups/cleanup', {
            method: 'POST'
        });
        const result = await response.json();
        
        if (result.success) {
            loadBackups();
            showSuccess(`Удалено ${result.deleted_count || 0} старых резервных копий`);
        } else {
            showError('Ошибка: ' + (result.error || 'Неизвестная ошибка'));
        }
    } catch (error) {
        showError('Ошибка: ' + error.message);
    }
}

// === Утилиты ===

function formatFileSize(bytes) {
    if (!bytes) return '-';
    if (bytes < 1024) return bytes + ' B';
    if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(2) + ' KB';
    if (bytes < 1024 * 1024 * 1024) return (bytes / (1024 * 1024)).toFixed(2) + ' MB';
    return (bytes / (1024 * 1024 * 1024)).toFixed(2) + ' GB';
}

function showSuccess(message) {
    // Простое уведомление (можно заменить на toast)
    alert('✓ ' + message);
}

function showError(message) {
    alert('✗ ' + message);
}
