// Просмотр логов с фильтрацией, поиском и экспортом (FR-030)
let logsAutoRefresh = true;
let logsInterval = null;
let currentFilters = {
    level: '',
    logger: '',
    search: '',
    start_time: '',
    end_time: ''
};
let currentPage = 0;
let pageSize = 100;
let totalLogs = 0;
let currentTab = 'system'; // 'system' или 'audit'

// Загрузка логов
async function refreshLogs() {
    try {
        const container = document.getElementById('logsContainer');
        container.innerHTML = '<div class="text-center"><div class="spinner-border text-primary" role="status"><span class="visually-hidden">Загрузка...</span></div></div>';
        
        let url = '';
        if (currentTab === 'system') {
            url = '/api/v1/admin/logs?';
        } else {
            url = '/api/v1/admin/audit-logs?';
        }
        
        // Добавляем параметры фильтрации
        const params = new URLSearchParams();
        if (currentFilters.level) params.append('level', currentFilters.level);
        if (currentFilters.logger) params.append('logger', currentFilters.logger);
        if (currentFilters.search) params.append('search', currentFilters.search);
        if (currentFilters.start_time) params.append('start_time', currentFilters.start_time);
        if (currentFilters.end_time) params.append('end_time', currentFilters.end_time);
        params.append('limit', pageSize);
        params.append('offset', currentPage * pageSize);
        
        const response = await fetch(url + params.toString());
        const data = await response.json();
        
        if (data.success) {
            totalLogs = data.total || 0;
            displayLogs(data.logs || []);
            updatePagination();
        } else {
            container.innerHTML = `<div class="alert alert-danger">Ошибка: ${data.error || 'Неизвестная ошибка'}</div>`;
        }
    } catch (error) {
        console.error('Ошибка при загрузке логов:', error);
        document.getElementById('logsContainer').innerHTML = 
            `<div class="alert alert-danger">Ошибка при загрузке логов: ${error.message}</div>`;
    }
}

// Отображение логов
function displayLogs(logs) {
    const container = document.getElementById('logsContainer');
    
    if (logs.length === 0) {
        container.innerHTML = '<div class="alert alert-info">Логи не найдены</div>';
        return;
    }
    
    let html = '<div class="table-responsive"><table class="table table-sm table-hover">';
    html += '<thead><tr>';
    if (currentTab === 'system') {
        html += '<th>Время</th><th>Уровень</th><th>Логгер</th><th>Событие</th><th>Детали</th>';
    } else {
        html += '<th>Время</th><th>Пользователь</th><th>Действие</th><th>Ресурс</th><th>Описание</th><th>IP</th><th>Статус</th>';
    }
    html += '</tr></thead><tbody>';
    
    logs.forEach(log => {
        if (currentTab === 'system') {
            const levelClass = getLevelClass(log.level);
            html += `<tr class="${levelClass}">`;
            html += `<td>${formatTimestamp(log.timestamp)}</td>`;
            html += `<td><span class="badge bg-${getLevelBadgeColor(log.level)}">${log.level || 'INFO'}</span></td>`;
            html += `<td><code>${log.logger || ''}</code></td>`;
            html += `<td>${escapeHtml(log.event || log.message || '')}</td>`;
            html += `<td>`;
            if (log.module) html += `<small class="text-muted">${log.module}</small>`;
            if (log.exception) {
                html += `<button class="btn btn-sm btn-link" onclick="showException('${escapeHtml(JSON.stringify(log))}')">Исключение</button>`;
            }
            html += `</td>`;
            html += `</tr>`;
        } else {
            const statusClass = log.success ? 'success' : 'danger';
            html += `<tr>`;
            html += `<td>${formatTimestamp(log.timestamp)}</td>`;
            html += `<td>${log.username || `ID: ${log.user_id}`}</td>`;
            html += `<td><span class="badge bg-info">${log.action_type || ''}</span></td>`;
            html += `<td>${log.resource_type || ''}${log.resource_id ? ` #${log.resource_id}` : ''}</td>`;
            html += `<td>${escapeHtml(log.description || '')}</td>`;
            html += `<td><code>${log.ip_address || ''}</code></td>`;
            html += `<td><span class="badge bg-${statusClass}">${log.success ? 'Успешно' : 'Ошибка'}</span></td>`;
            html += `</tr>`;
        }
    });
    
    html += '</tbody></table></div>';
    container.innerHTML = html;
}

// Получение класса для строки по уровню
function getLevelClass(level) {
    const levelUpper = (level || '').toUpperCase();
    if (levelUpper === 'ERROR' || levelUpper === 'CRITICAL') return 'table-danger';
    if (levelUpper === 'WARNING') return 'table-warning';
    return '';
}

// Получение цвета бейджа по уровню
function getLevelBadgeColor(level) {
    const levelUpper = (level || '').toUpperCase();
    if (levelUpper === 'CRITICAL') return 'danger';
    if (levelUpper === 'ERROR') return 'danger';
    if (levelUpper === 'WARNING') return 'warning';
    if (levelUpper === 'INFO') return 'info';
    if (levelUpper === 'DEBUG') return 'secondary';
    return 'secondary';
}

// Форматирование времени
function formatTimestamp(timestamp) {
    if (!timestamp) return '';
    try {
        const date = new Date(timestamp);
        return date.toLocaleString('ru-RU');
    } catch (e) {
        return timestamp;
    }
}

// Экранирование HTML
function escapeHtml(text) {
    if (!text) return '';
    const div = document.createElement('div');
    div.textContent = text;
    return div.innerHTML;
}

// Показ исключения
function showException(logJson) {
    try {
        const log = JSON.parse(logJson);
        const exception = log.exception || '';
        const modal = document.getElementById('exceptionModal');
        if (modal) {
            document.getElementById('exceptionContent').textContent = exception;
            const bsModal = new bootstrap.Modal(modal);
            bsModal.show();
        }
    } catch (e) {
        alert('Ошибка при отображении исключения');
    }
}

// Обновление пагинации
function updatePagination() {
    const pagination = document.getElementById('logsPagination');
    if (!pagination) return;
    
    const totalPages = Math.ceil(totalLogs / pageSize);
    let html = '<nav><ul class="pagination pagination-sm">';
    
    // Кнопка "Предыдущая"
    html += `<li class="page-item ${currentPage === 0 ? 'disabled' : ''}">`;
    html += `<a class="page-link" href="#" onclick="changePage(${currentPage - 1}); return false;">Предыдущая</a>`;
    html += `</li>`;
    
    // Номера страниц
    const startPage = Math.max(0, currentPage - 2);
    const endPage = Math.min(totalPages - 1, currentPage + 2);
    
    for (let i = startPage; i <= endPage; i++) {
        html += `<li class="page-item ${i === currentPage ? 'active' : ''}">`;
        html += `<a class="page-link" href="#" onclick="changePage(${i}); return false;">${i + 1}</a>`;
        html += `</li>`;
    }
    
    // Кнопка "Следующая"
    html += `<li class="page-item ${currentPage >= totalPages - 1 ? 'disabled' : ''}">`;
    html += `<a class="page-link" href="#" onclick="changePage(${currentPage + 1}); return false;">Следующая</a>`;
    html += `</li>`;
    
    html += `</ul></nav>`;
    html += `<div class="mt-2"><small class="text-muted">Всего записей: ${totalLogs}</small></div>`;
    
    pagination.innerHTML = html;
}

// Смена страницы
function changePage(page) {
    if (page < 0) return;
    currentPage = page;
    refreshLogs();
}

// Применение фильтров
function applyFilters() {
    currentFilters.level = document.getElementById('logLevel').value;
    currentFilters.logger = document.getElementById('logLogger').value;
    currentFilters.search = document.getElementById('logSearch').value;
    currentFilters.start_time = document.getElementById('logStartTime').value;
    currentFilters.end_time = document.getElementById('logEndTime').value;
    currentPage = 0;
    refreshLogs();
}

// Очистка фильтров
function clearFilters() {
    document.getElementById('logLevel').value = '';
    document.getElementById('logLogger').value = '';
    document.getElementById('logSearch').value = '';
    document.getElementById('logStartTime').value = '';
    document.getElementById('logEndTime').value = '';
    currentFilters = {
        level: '',
        logger: '',
        search: '',
        start_time: '',
        end_time: ''
    };
    currentPage = 0;
    refreshLogs();
}

// Экспорт логов
async function exportLogs(format) {
    try {
        let url = '';
        if (currentTab === 'system') {
            url = '/api/v1/admin/logs/export?';
        } else {
            // Для аудита пока используем системный экспорт
            url = '/api/v1/admin/logs/export?';
        }
        
        const params = new URLSearchParams();
        params.append('format', format);
        if (currentFilters.level) params.append('level', currentFilters.level);
        if (currentFilters.logger) params.append('logger', currentFilters.logger);
        if (currentFilters.search) params.append('search', currentFilters.search);
        if (currentFilters.start_time) params.append('start_time', currentFilters.start_time);
        if (currentFilters.end_time) params.append('end_time', currentFilters.end_time);
        
        window.location.href = url + params.toString();
    } catch (error) {
        alert('Ошибка при экспорте: ' + error.message);
    }
}

// Смена вкладки
function switchTab(tab) {
    currentTab = tab;
    currentPage = 0;
    refreshLogs();
    
    // Обновляем активную вкладку
    document.querySelectorAll('.nav-link').forEach(link => {
        link.classList.remove('active');
    });
    event.target.classList.add('active');
}

// Очистка отображаемых логов
function clearLogs() {
    if (confirm('Очистить отображаемые логи?')) {
        document.getElementById('logsContainer').innerHTML = '';
    }
}

// Инициализация
document.addEventListener('DOMContentLoaded', function() {
    // Обработка фильтров
    document.getElementById('applyFilters')?.addEventListener('click', applyFilters);
    document.getElementById('clearFilters')?.addEventListener('click', clearFilters);
    
    // Автообновление
    const autoRefreshCheckbox = document.getElementById('autoRefresh');
    if (autoRefreshCheckbox) {
        autoRefreshCheckbox.addEventListener('change', function() {
            logsAutoRefresh = this.checked;
            if (logsAutoRefresh) {
                logsInterval = setInterval(refreshLogs, 5000);
            } else {
                if (logsInterval) {
                    clearInterval(logsInterval);
                }
            }
        });
        
        // Начальная загрузка
        refreshLogs();
        
        if (logsAutoRefresh) {
            logsInterval = setInterval(refreshLogs, 5000);
        }
    }
});

// Остановка обновления при уходе со страницы
window.addEventListener('beforeunload', function() {
    if (logsInterval) {
        clearInterval(logsInterval);
    }
});
