/**
 * JavaScript для управления алертами (FR-026)
 */

document.addEventListener('DOMContentLoaded', function() {
    loadAlerts();
    loadRules();
    loadHistory();
    
    // Автообновление каждые 10 секунд
    setInterval(loadAlerts, 10000);
});

/**
 * Загрузка активных алертов
 */
async function loadAlerts() {
    try {
        const response = await fetch('/api/v1/admin/alerts');
        const data = await response.json();
        
        if (data.success) {
            renderActiveAlerts(data.alerts);
        } else {
            console.error('Ошибка загрузки алертов:', data.error);
        }
    } catch (error) {
        console.error('Ошибка при загрузке алертов:', error);
    }
}

/**
 * Отображение активных алертов
 */
function renderActiveAlerts(alerts) {
    const container = document.getElementById('activeAlertsContainer');
    
    if (alerts.length === 0) {
        container.innerHTML = '<div class="alert alert-success">Нет активных алертов</div>';
        return;
    }
    
    let html = '<div class="list-group">';
    alerts.forEach(alert => {
        const severityClass = {
            'info': 'info',
            'warning': 'warning',
            'error': 'danger',
            'critical': 'danger'
        }[alert.severity] || 'secondary';
        
        const time = new Date(alert.timestamp * 1000).toLocaleString();
        
        html += `
            <div class="list-group-item list-group-item-${severityClass}">
                <div class="d-flex w-100 justify-content-between">
                    <h6 class="mb-1">${escapeHtml(alert.rule_name)}</h6>
                    <small>${time}</small>
                </div>
                <p class="mb-1">
                    <strong>Метрика:</strong> ${escapeHtml(alert.metric_name)}<br>
                    <strong>Текущее значение:</strong> ${alert.current_value.toFixed(2)}<br>
                    <strong>Порог:</strong> ${alert.threshold}
                </p>
                ${alert.description ? `<small>${escapeHtml(alert.description)}</small>` : ''}
            </div>
        `;
    });
    html += '</div>';
    
    container.innerHTML = html;
}

/**
 * Загрузка правил алертов
 */
async function loadRules() {
    try {
        const response = await fetch('/api/v1/admin/alerts/rules');
        const data = await response.json();
        
        if (data.success) {
            renderRules(data.rules);
        } else {
            console.error('Ошибка загрузки правил:', data.error);
        }
    } catch (error) {
        console.error('Ошибка при загрузке правил:', error);
    }
}

/**
 * Отображение правил алертов
 */
function renderRules(rules) {
    const tbody = document.getElementById('alertsRulesTableBody');
    
    if (rules.length === 0) {
        tbody.innerHTML = '<tr><td colspan="7" class="text-center text-muted">Правила не найдены</td></tr>';
        return;
    }
    
    tbody.innerHTML = '';
    rules.forEach(rule => {
        const severityBadge = {
            'info': '<span class="badge bg-info">Информация</span>',
            'warning': '<span class="badge bg-warning">Предупреждение</span>',
            'error': '<span class="badge bg-danger">Ошибка</span>',
            'critical': '<span class="badge bg-danger">Критично</span>'
        }[rule.severity] || '<span class="badge bg-secondary">Неизвестно</span>';
        
        const conditionText = {
            'gt': '>',
            'lt': '<',
            'gte': '>=',
            'lte': '<=',
            'eq': '='
        }[rule.condition] || rule.condition;
        
        const statusBadge = rule.enabled 
            ? '<span class="badge bg-success">Включено</span>'
            : '<span class="badge bg-secondary">Отключено</span>';
        
        const tr = document.createElement('tr');
        tr.innerHTML = `
            <td>${escapeHtml(rule.name)}</td>
            <td>${escapeHtml(rule.metric_name)}</td>
            <td>${conditionText}</td>
            <td>${rule.threshold}</td>
            <td>${severityBadge}</td>
            <td>${statusBadge}</td>
            <td>
                <button class="btn btn-sm btn-danger" onclick="deleteRule('${escapeHtml(rule.name)}')">
                    <i class="bi bi-trash"></i>
                </button>
            </td>
        `;
        tbody.appendChild(tr);
    });
}

/**
 * Загрузка истории алертов
 */
async function loadHistory() {
    try {
        const response = await fetch('/api/v1/admin/alerts/history?limit=50');
        const data = await response.json();
        
        if (data.success) {
            renderHistory(data.history);
        } else {
            console.error('Ошибка загрузки истории:', data.error);
        }
    } catch (error) {
        console.error('Ошибка при загрузке истории:', error);
    }
}

/**
 * Отображение истории алертов
 */
function renderHistory(history) {
    const tbody = document.getElementById('alertsHistoryTableBody');
    
    if (history.length === 0) {
        tbody.innerHTML = '<tr><td colspan="7" class="text-center text-muted">История пуста</td></tr>';
        return;
    }
    
    tbody.innerHTML = '';
    history.forEach(alert => {
        const severityBadge = {
            'info': '<span class="badge bg-info">Информация</span>',
            'warning': '<span class="badge bg-warning">Предупреждение</span>',
            'error': '<span class="badge bg-danger">Ошибка</span>',
            'critical': '<span class="badge bg-danger">Критично</span>'
        }[alert.severity] || '<span class="badge bg-secondary">Неизвестно</span>';
        
        const time = new Date(alert.timestamp * 1000).toLocaleString();
        const statusBadge = alert.resolved 
            ? '<span class="badge bg-success">Разрешен</span>'
            : '<span class="badge bg-warning">Активен</span>';
        
        const tr = document.createElement('tr');
        tr.innerHTML = `
            <td>${time}</td>
            <td>${escapeHtml(alert.rule_name)}</td>
            <td>${escapeHtml(alert.metric_name)}</td>
            <td>${alert.current_value.toFixed(2)}</td>
            <td>${alert.threshold}</td>
            <td>${severityBadge}</td>
            <td>${statusBadge}</td>
        `;
        tbody.appendChild(tr);
    });
}

/**
 * Открытие модального окна для добавления правила
 */
function openAddRuleModal() {
    document.getElementById('addRuleForm').reset();
    const modal = new bootstrap.Modal(document.getElementById('addRuleModal'));
    modal.show();
}

/**
 * Сохранение правила
 */
async function saveRule() {
    const form = document.getElementById('addRuleForm');
    if (!form.checkValidity()) {
        form.reportValidity();
        return;
    }
    
    const ruleData = {
        name: document.getElementById('ruleName').value,
        metric_name: document.getElementById('ruleMetric').value,
        condition: document.getElementById('ruleCondition').value,
        threshold: parseFloat(document.getElementById('ruleThreshold').value),
        severity: document.getElementById('ruleSeverity').value,
        description: document.getElementById('ruleDescription').value,
        enabled: true
    };
    
    try {
        const response = await fetch('/api/v1/admin/alerts/rules', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify(ruleData)
        });
        
        const data = await response.json();
        if (data.success) {
            const modal = bootstrap.Modal.getInstance(document.getElementById('addRuleModal'));
            modal.hide();
            loadRules();
            alert('Правило успешно добавлено');
        } else {
            alert('Ошибка: ' + (data.error || 'Неизвестная ошибка'));
        }
    } catch (error) {
        console.error('Ошибка при сохранении правила:', error);
        alert('Ошибка при сохранении правила: ' + error.message);
    }
}

/**
 * Удаление правила
 */
async function deleteRule(ruleName) {
    if (!confirm(`Вы уверены, что хотите удалить правило "${ruleName}"?`)) {
        return;
    }
    
    try {
        const response = await fetch(`/api/v1/admin/alerts/rules/${encodeURIComponent(ruleName)}`, {
            method: 'DELETE'
        });
        
        const data = await response.json();
        if (data.success) {
            loadRules();
            alert('Правило успешно удалено');
        } else {
            alert('Ошибка: ' + (data.error || 'Неизвестная ошибка'));
        }
    } catch (error) {
        console.error('Ошибка при удалении правила:', error);
        alert('Ошибка при удалении правила: ' + error.message);
    }
}

/**
 * Утилита для экранирования HTML
 */
function escapeHtml(text) {
    const div = document.createElement('div');
    div.textContent = text;
    return div.innerHTML;
}
