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

let roles = [];
let currentMFAUser = null;

// Загрузка ролей при загрузке страницы
document.addEventListener('DOMContentLoaded', function() {
    loadRoles();
    initEventListeners();
});

// Загрузка списка ролей
async function loadRoles() {
    try {
        const response = await fetch('/api/v1/admin/roles');
        const data = await response.json();
        if (data.success) {
            roles = data.roles || [];
            populateRoleSelects();
        }
    } catch (error) {
        console.error('Ошибка загрузки ролей:', error);
    }
}

// Заполнение селектов ролей
function populateRoleSelects() {
    const editSelect = document.getElementById('edit-role');
    const addSelect = document.getElementById('add-role');
    
    if (editSelect) {
        editSelect.innerHTML = '<option value="">Без роли</option>';
        roles.forEach(role => {
            editSelect.innerHTML += `<option value="${role.id}">${role.name}</option>`;
        });
    }
    
    if (addSelect) {
        addSelect.innerHTML = '<option value="">Без роли</option>';
        roles.forEach(role => {
            addSelect.innerHTML += `<option value="${role.id}">${role.name}</option>`;
        });
    }
}

// Инициализация обработчиков событий
function initEventListeners() {
    // Редактирование пользователя
    document.querySelectorAll('.edit-user-btn').forEach(btn => {
        btn.addEventListener('click', function(e) {
            e.preventDefault();
            const userId = this.dataset.userId;
            const username = this.dataset.username;
            const email = this.dataset.email;
            const isAdmin = this.dataset.isAdmin === '1';
            const roleId = this.dataset.roleId || '';
            const mfaEnabled = this.dataset.mfaEnabled === '1';
            const isLocked = this.dataset.isLocked === '1';
            const publicApiBlocked = this.dataset.publicApiBlocked === '1';
            
            document.getElementById('edit-user-id').value = userId;
            document.getElementById('edit-username').value = username;
            document.getElementById('edit-email').value = email || '';
            document.getElementById('edit-is-admin').checked = isAdmin;
            document.getElementById('edit-role').value = roleId;
            document.getElementById('edit-public-api-blocked').checked = publicApiBlocked;
            
            const modal = new bootstrap.Modal(document.getElementById('editUserModal'));
            modal.show();
        });
    });
    
    // Управление MFA
    document.querySelectorAll('.mfa-manage-btn').forEach(btn => {
        btn.addEventListener('click', function(e) {
            e.preventDefault();
            const userId = this.dataset.userId;
            const username = this.dataset.username;
            const mfaEnabled = this.dataset.mfaEnabled === '1';
            showMFAModal(userId, username, mfaEnabled);
        });
    });
    
    // Блокировка/разблокировка
    document.querySelectorAll('.lock-user-btn').forEach(btn => {
        btn.addEventListener('click', async function(e) {
            e.preventDefault();
            const userId = this.dataset.userId;
            if (confirm('Заблокировать пользователя?')) {
                await lockUser(userId);
            }
        });
    });
    
    document.querySelectorAll('.unlock-user-btn').forEach(btn => {
        btn.addEventListener('click', async function(e) {
            e.preventDefault();
            const userId = this.dataset.userId;
            await unlockUser(userId);
        });
    });
    
    // Resend email verification
    document.querySelectorAll('.resend-verify-btn').forEach(btn => {
        btn.addEventListener('click', async function(e) {
            e.preventDefault();
            const userId = this.dataset.userId;
            const username = this.dataset.username;
            if (!confirm('Отправить письмо верификации для ' + username + '?')) return;
            await resendVerification(userId);
        });
    });
    
    // Удаление пользователя
    document.querySelectorAll('.delete-user-btn').forEach(btn => {
        btn.addEventListener('click', async function(e) {
            e.preventDefault();
            const userId = this.dataset.userId;
            if (confirm('Вы уверены, что хотите удалить этого пользователя?')) {
                await deleteUser(userId);
            }
        });
    });
    
    // Форма редактирования
    document.getElementById('edit-user-form').addEventListener('submit', async function(e) {
        e.preventDefault();
        await saveUserEdit();
    });
    
    // Форма добавления
    document.getElementById('add-user-form').addEventListener('submit', async function(e) {
        e.preventDefault();
        await saveUserAdd();
    });
}

// Сохранение редактирования пользователя
async function saveUserEdit() {
    const form = document.getElementById('edit-user-form');
    const userId = document.getElementById('edit-user-id').value;
    const submitBtn = form.querySelector('button[type="submit"]');
    submitBtn.disabled = true;
    
    const data = {
        username: form.username.value,
        email: form.email.value,
        is_admin: form['is_admin'].checked ? 1 : 0,
        role_id: form.role_id.value || null
    };
    
    const password = form.password.value;
    if (password) {
        data.password = password;
    }
    
    try {
        const response = await fetch(`/api/v1/admin/users/edit/${userId}`, {
            method: 'POST',
            headers: {'Content-Type': 'application/json'},
            body: JSON.stringify(data)
        });
        const { rawText, result, parseError } = await parseApiResponse(response);
        if (response.ok) {
            clearModalAlert('edit-user-form-error');
            const publicBlocked = document.getElementById('edit-public-api-blocked').checked;
            const patchResp = await cascad360Fetch(`/api/v1/admin/users/${userId}`, {
                method: 'PATCH',
                headers: {'Content-Type': 'application/json'},
                body: JSON.stringify({ public_api_blocked: publicBlocked }),
            });
            const patchParsed = await parseApiResponse(patchResp);
            const patchResult = patchParsed.result;
            if (!patchResp.ok || !patchResult || !patchResult.success) {
                showModalAlert(
                    'edit-user-form-error',
                    'Пользователь обновлён, но Public API block: ' +
                        extractApiErrorMessage(patchResult, patchParsed.rawText, patchParsed.parseError),
                    'warning'
                );
            } else {
                showAlert('Пользователь успешно обновлен', 'success');
            }
            setTimeout(() => location.reload(), 1000);
        } else {
            showModalAlert(
                'edit-user-form-error',
                extractApiErrorMessage(result, rawText, parseError),
                'danger'
            );
        }
    } catch (error) {
        showModalAlert('edit-user-form-error', 'Ошибка при сохранении: ' + error.message, 'danger');
    } finally {
        submitBtn.disabled = false;
    }
}

// Сохранение нового пользователя
async function saveUserAdd() {
    const form = document.getElementById('add-user-form');
    const submitBtn = form.querySelector('button[type="submit"]');
    submitBtn.disabled = true;
    
    const data = {
        username: form.username.value,
        email: form.email.value,
        password: form.password.value,
        is_admin: form['is_admin'].checked ? 1 : 0,
        role_id: form.role_id.value || null
    };
    clearModalAlert('add-user-form-error');
    const requestUrl = '/api/v1/admin/users/add';
    
    try {
        const response = await fetch(requestUrl, {
            method: 'POST',
            headers: {'Content-Type': 'application/json'},
            body: JSON.stringify(data)
        });
        const { rawText, result, parseError } = await parseApiResponse(response);
        if (response.ok) {
            showAlert('Пользователь успешно создан', 'success');
            const modal = bootstrap.Modal.getInstance(document.getElementById('addUserModal'));
            if (modal) modal.hide();
            setTimeout(() => location.reload(), 1000);
        } else {
            showModalAlert(
                'add-user-form-error',
                extractApiErrorMessage(result, rawText, parseError),
                'danger'
            );
        }
    } catch (error) {
        showModalAlert('add-user-form-error', 'Ошибка при создании: ' + error.message, 'danger');
    } finally {
        submitBtn.disabled = false;
    }
}

// Resend email verification (F5 UI-103)
async function resendVerification(userId) {
    try {
        const response = await cascad360Fetch(`/api/v1/admin/users/${userId}/send-email-verification`, {
            method: 'POST',
            headers: {'Content-Type': 'application/json'},
            body: JSON.stringify({}),
        });
        const result = await response.json();
        if (result.success) {
            showAlert('Письмо верификации отправлено', 'success');
        } else {
            showAlert('Ошибка: ' + (result.error || 'Неизвестная ошибка'), 'danger');
        }
    } catch (error) {
        showAlert('Ошибка: ' + error.message, 'danger');
    }
}

// Удаление пользователя
async function deleteUser(userId) {
    try {
        const response = await fetch(`/api/v1/admin/users/delete/${userId}`, {
            method: 'POST'
        });
        const { rawText, result, parseError } = await parseApiResponse(response);
        if (response.ok) {
            showAlert('Пользователь успешно удален', 'success');
            setTimeout(() => location.reload(), 1000);
        } else {
            showAlert('Ошибка: ' + extractApiErrorMessage(result, rawText, parseError), 'danger');
        }
    } catch (error) {
        showAlert('Ошибка при удалении: ' + error.message, 'danger');
    }
}

// Блокировка пользователя
async function lockUser(userId) {
    try {
        const response = await fetch(`/api/v1/admin/users/${userId}/lock`, {
            method: 'POST'
        });
        
        const result = await response.json();
        if (result.success) {
            showAlert('Пользователь заблокирован', 'success');
            setTimeout(() => location.reload(), 1000);
        } else {
            showAlert('Ошибка: ' + (result.error || 'Неизвестная ошибка'), 'danger');
        }
    } catch (error) {
        showAlert('Ошибка при блокировке: ' + error.message, 'danger');
    }
}

// Разблокировка пользователя
async function unlockUser(userId) {
    try {
        const response = await fetch(`/api/v1/admin/users/${userId}/unlock`, {
            method: 'POST'
        });
        
        const result = await response.json();
        if (result.success) {
            showAlert('Пользователь разблокирован', 'success');
            setTimeout(() => location.reload(), 1000);
        } else {
            showAlert('Ошибка: ' + (result.error || 'Неизвестная ошибка'), 'danger');
        }
    } catch (error) {
        showAlert('Ошибка при разблокировке: ' + error.message, 'danger');
    }
}

// Показать модальное окно MFA
async function showMFAModal(userId, username, mfaEnabled) {
    currentMFAUser = { id: userId, username: username, mfaEnabled: mfaEnabled };
    const modalBody = document.getElementById('mfaModalBody');
    const modal = new bootstrap.Modal(document.getElementById('mfaModal'));
    
    if (mfaEnabled) {
        // Показываем опции для отключения MFA
        modalBody.innerHTML = `
            <div class="alert alert-info">
                <i class="bi bi-info-circle"></i> MFA включен для пользователя <strong>${escapeHtml(username)}</strong>
            </div>
            <div class="d-grid gap-2">
                <button class="btn btn-danger" onclick="disableMFA(${userId})">
                    <i class="bi bi-shield-x"></i> Отключить MFA
                </button>
            </div>
        `;
    } else {
        // Показываем опции для настройки MFA
        modalBody.innerHTML = `
            <div class="alert alert-warning">
                <i class="bi bi-exclamation-triangle"></i> Настройка MFA для пользователя <strong>${escapeHtml(username)}</strong>
            </div>
            <div class="d-grid gap-2">
                <button class="btn btn-primary" onclick="setupMFA(${userId})">
                    <i class="bi bi-shield-lock"></i> Настроить MFA
                </button>
            </div>
        `;
    }
    
    modal.show();
}

// Настройка MFA
async function setupMFA(userId) {
    try {
        const response = await fetch('/api/v1/admin/auth/mfa/setup', {
            method: 'POST',
            headers: {'Content-Type': 'application/json'},
            body: JSON.stringify({ user_id: userId })
        });
        
        const result = await response.json();
        if (result.success) {
            const modalBody = document.getElementById('mfaModalBody');
            modalBody.innerHTML = `
                <div class="alert alert-success">
                    <i class="bi bi-check-circle"></i> Секрет MFA сгенерирован
                </div>
                <div class="text-center mb-3">
                    <img src="${result.qr_code_url}" alt="QR код" class="img-fluid" style="max-width: 200px;">
                </div>
                <div class="mb-3">
                    <label class="form-label">Секретный ключ:</label>
                    <div class="input-group">
                        <input type="text" class="form-control" id="mfa-secret" value="${result.secret}" readonly>
                        <button class="btn btn-outline-secondary" onclick="copyMFASecret()">
                            <i class="bi bi-clipboard"></i>
                        </button>
                    </div>
                </div>
                <div class="mb-3">
                    <label class="form-label">Введите код из приложения-аутентификатора:</label>
                    <input type="text" class="form-control" id="mfa-code" placeholder="000000" maxlength="6" pattern="[0-9]{6}">
                </div>
                <div class="d-grid gap-2">
                    <button class="btn btn-success" onclick="enableMFA(${userId}, '${result.secret}')">
                        <i class="bi bi-shield-check"></i> Включить MFA
                    </button>
                    <button class="btn btn-secondary" onclick="showMFAModal(${userId}, '${currentMFAUser.username}', false)">
                        <i class="bi bi-arrow-left"></i> Назад
                    </button>
                </div>
            `;
        } else {
            showAlert('Ошибка настройки MFA: ' + (result.error || 'Неизвестная ошибка'), 'danger');
        }
    } catch (error) {
        showAlert('Ошибка при настройке MFA: ' + error.message, 'danger');
    }
}

// Включение MFA
async function enableMFA(userId, secret) {
    const code = document.getElementById('mfa-code').value;
    if (!code || code.length !== 6) {
        showAlert('Введите 6-значный код', 'warning');
        return;
    }
    
    try {
        const response = await fetch('/api/v1/admin/auth/mfa/enable', {
            method: 'POST',
            headers: {'Content-Type': 'application/json'},
            body: JSON.stringify({ user_id: userId, secret: secret, code: code })
        });
        
        const result = await response.json();
        if (result.success) {
            showAlert('MFA успешно включен', 'success');
            const modal = bootstrap.Modal.getInstance(document.getElementById('mfaModal'));
            modal.hide();
            setTimeout(() => location.reload(), 1000);
        } else {
            showAlert('Ошибка: ' + (result.error || 'Неверный код'), 'danger');
        }
    } catch (error) {
        showAlert('Ошибка при включении MFA: ' + error.message, 'danger');
    }
}

// Отключение MFA
async function disableMFA(userId) {
    if (!confirm('Вы уверены, что хотите отключить MFA для этого пользователя?')) {
        return;
    }
    
    try {
        const response = await fetch('/api/v1/admin/auth/mfa/disable', {
            method: 'POST',
            headers: {'Content-Type': 'application/json'},
            body: JSON.stringify({ user_id: userId })
        });
        
        const result = await response.json();
        if (result.success) {
            showAlert('MFA успешно отключен', 'success');
            const modal = bootstrap.Modal.getInstance(document.getElementById('mfaModal'));
            modal.hide();
            setTimeout(() => location.reload(), 1000);
        } else {
            showAlert('Ошибка: ' + (result.error || 'Неизвестная ошибка'), 'danger');
        }
    } catch (error) {
        showAlert('Ошибка при отключении MFA: ' + error.message, 'danger');
    }
}

// Копирование секрета MFA
function copyMFASecret() {
    const secretInput = document.getElementById('mfa-secret');
    secretInput.select();
    document.execCommand('copy');
    showAlert('Секрет скопирован в буфер обмена', 'success');
}

// Загрузка истории входов
async function loadLoginHistory() {
    const modal = new bootstrap.Modal(document.getElementById('loginHistoryModal'));
    modal.show();
    
    const tbody = document.getElementById('loginHistoryBody');
    tbody.innerHTML = '<tr><td colspan="6" class="text-center"><div class="spinner-border"></div></td></tr>';
    
    try {
        const response = await fetch('/api/v1/admin/auth/login-history?limit=100');
        const data = await response.json();
        
        if (data.success) {
            renderLoginHistory(data.history);
        } else {
            tbody.innerHTML = '<tr><td colspan="6" class="text-center text-danger">Ошибка загрузки истории</td></tr>';
        }
    } catch (error) {
        tbody.innerHTML = `<tr><td colspan="6" class="text-center text-danger">Ошибка: ${error.message}</td></tr>`;
    }
}

// Рендеринг истории входов
function renderLoginHistory(history) {
    const tbody = document.getElementById('loginHistoryBody');
    const searchInput = document.getElementById('historySearchInput');
    
    if (history.length === 0) {
        tbody.innerHTML = '<tr><td colspan="6" class="text-center text-muted">История пуста</td></tr>';
        return;
    }
    
    let html = '';
    history.forEach(entry => {
        const date = new Date(entry.timestamp);
        const statusBadge = entry.success 
            ? '<span class="badge bg-success">Успешно</span>'
            : '<span class="badge bg-danger">Ошибка</span>';
        const actionBadge = entry.action === 'login'
            ? '<span class="badge bg-primary">Вход</span>'
            : '<span class="badge bg-secondary">Выход</span>';
        
        html += `
            <tr>
                <td>${date.toLocaleString('ru-RU')}</td>
                <td><strong>${escapeHtml(entry.username)}</strong></td>
                <td>${actionBadge}</td>
                <td><code>${escapeHtml(entry.ip_address || '—')}</code></td>
                <td>${statusBadge}</td>
                <td>${escapeHtml(entry.failure_reason || '—')}</td>
            </tr>
        `;
    });
    
    tbody.innerHTML = html;
    
    // Поиск
    if (searchInput) {
        searchInput.addEventListener('input', function() {
            const searchText = this.value.toLowerCase();
            const rows = tbody.querySelectorAll('tr');
            rows.forEach(row => {
                const text = row.textContent.toLowerCase();
                row.style.display = text.includes(searchText) ? '' : 'none';
            });
        });
    }
}

// Утилиты
function escapeHtml(text) {
    const div = document.createElement('div');
    div.textContent = text;
    return div.innerHTML;
}

function extractApiErrorMessage(result, rawText, parseError) {
    if (result && result.errors && result.errors[0] && result.errors[0].message) {
        return result.errors[0].message;
    }
    if (result && result.message) {
        return result.message;
    }
    if (result && typeof result.error === 'string') {
        return result.error;
    }
    if (rawText && parseError) {
        return rawText.slice(0, 500);
    }
    return 'Неизвестная ошибка';
}

async function parseApiResponse(response) {
    const rawText = await response.text();
    let result = null;
    let parseError = null;
    try {
        result = rawText ? JSON.parse(rawText) : null;
    } catch (e) {
        parseError = e.message;
    }
    return { rawText, result, parseError };
}

function showModalAlert(elementId, message, type) {
    const box = document.getElementById(elementId);
    if (!box) {
        showAlert(message, type || 'danger');
        return;
    }
    box.className = 'alert alert-' + (type || 'danger');
    box.textContent = message;
    box.classList.remove('d-none');
}

function clearModalAlert(elementId) {
    const box = document.getElementById(elementId);
    if (!box) return;
    box.textContent = '';
    box.classList.add('d-none');
}

function showAlert(message, type) {
    const alertDiv = document.createElement('div');
    alertDiv.className = `alert alert-${type} alert-dismissible fade show`;
    alertDiv.innerHTML = `
        ${message}
        <button type="button" class="btn-close" data-bs-dismiss="alert"></button>
    `;
    const container = document.querySelector('.container-fluid') || document.querySelector('.container');
    container.insertBefore(alertDiv, container.firstChild);
    setTimeout(() => alertDiv.remove(), 5000);
}

// === FR-029: Управление пользователями и правами ===

// Показать активные сессии
async function showActiveSessions() {
    const modal = new bootstrap.Modal(document.getElementById('activeSessionsModal'));
    modal.show();
    
    const tbody = document.getElementById('activeSessionsBody');
    tbody.innerHTML = '<tr><td colspan="7" class="text-center"><div class="spinner-border"></div></td></tr>';
    
    try {
        const response = await fetch('/api/v1/admin/sessions');
        const data = await response.json();
        
        if (data.success) {
            renderActiveSessions(data.sessions || []);
        } else {
            tbody.innerHTML = '<tr><td colspan="7" class="text-center text-danger">Ошибка загрузки сессий</td></tr>';
        }
    } catch (error) {
        tbody.innerHTML = `<tr><td colspan="7" class="text-center text-danger">Ошибка: ${error.message}</td></tr>`;
    }
}

function renderActiveSessions(sessions) {
    const tbody = document.getElementById('activeSessionsBody');
    
    if (sessions.length === 0) {
        tbody.innerHTML = '<tr><td colspan="7" class="text-center text-muted">Активные сессии не найдены</td></tr>';
        return;
    }
    
    let html = '';
    sessions.forEach(s => {
        const created = new Date(s.created_at);
        const lastActivity = new Date(s.last_activity);
        const expires = new Date(s.expires_at);
        
        html += `
            <tr>
                <td><strong>${escapeHtml(s.username || '—')}</strong></td>
                <td><code>${escapeHtml(s.ip_address || '—')}</code></td>
                <td><small>${escapeHtml(s.user_agent || '—')}</small></td>
                <td>${created.toLocaleString('ru-RU')}</td>
                <td>${lastActivity.toLocaleString('ru-RU')}</td>
                <td>${expires.toLocaleString('ru-RU')}</td>
                <td>
                    <button class="btn btn-sm btn-danger" onclick="terminateSession('${s.session_id}')" title="Завершить сессию">
                        <i class="bi bi-x-circle"></i>
                    </button>
                </td>
            </tr>
        `;
    });
    
    tbody.innerHTML = html;
}

function filterSessions() {
    const searchText = document.getElementById('sessionSearchInput').value.toLowerCase();
    const rows = document.querySelectorAll('#activeSessionsBody tr');
    rows.forEach(row => {
        const text = row.textContent.toLowerCase();
        row.style.display = text.includes(searchText) ? '' : 'none';
    });
}

async function terminateSession(sessionId) {
    if (!confirm('Завершить эту сессию?')) return;
    
    try {
        const response = await fetch(`/api/v1/admin/sessions/${sessionId}/terminate`, {
            method: 'POST'
        });
        
        const data = await response.json();
        if (data.success) {
            showAlert('Сессия завершена', 'success');
            showActiveSessions(); // Обновляем список
        } else {
            showAlert('Ошибка: ' + (data.error || 'Неизвестная ошибка'), 'danger');
        }
    } catch (error) {
        showAlert('Ошибка при завершении сессии: ' + error.message, 'danger');
    }
}

// Показать группы пользователей
async function showUserGroups() {
    const modal = new bootstrap.Modal(document.getElementById('userGroupsModal'));
    modal.show();
    
    await loadUserGroups();
}

async function loadUserGroups() {
    const container = document.getElementById('userGroupsContainer');
    container.innerHTML = '<div class="text-center"><div class="spinner-border"></div></div>';
    
    try {
        const response = await fetch('/api/v1/admin/user-groups');
        const data = await response.json();
        
        if (data.success) {
            renderUserGroups(data.groups || []);
        } else {
            container.innerHTML = '<div class="alert alert-danger">Ошибка загрузки групп</div>';
        }
    } catch (error) {
        container.innerHTML = `<div class="alert alert-danger">Ошибка: ${error.message}</div>`;
    }
}

function renderUserGroups(groups) {
    const container = document.getElementById('userGroupsContainer');
    
    if (groups.length === 0) {
        container.innerHTML = '<div class="alert alert-info">Группы не найдены</div>';
        return;
    }
    
    let html = '<div class="list-group">';
    groups.forEach(group => {
        html += `
            <div class="list-group-item">
                <div class="d-flex justify-content-between align-items-center">
                    <div>
                        <h6 class="mb-1">${escapeHtml(group.name)}</h6>
                        <p class="mb-1 text-muted">${escapeHtml(group.description || '—')}</p>
                        <small class="text-muted">Пользователей: ${group.user_count}</small>
                    </div>
                    <div>
                        <button class="btn btn-sm btn-primary" onclick="showGroupMembers(${group.id}, '${escapeHtml(group.name)}')">
                            <i class="bi bi-people"></i> Участники
                        </button>
                    </div>
                </div>
            </div>
        `;
    });
    html += '</div>';
    
    container.innerHTML = html;
}

async function showCreateGroupModal() {
    const name = prompt('Введите имя группы:');
    if (!name) return;
    
    const description = prompt('Введите описание группы (необязательно):') || '';
    
    try {
        const response = await fetch('/api/v1/admin/user-groups', {
            method: 'POST',
            headers: {'Content-Type': 'application/json'},
            body: JSON.stringify({ name: name, description: description })
        });
        
        const data = await response.json();
        if (data.success) {
            showAlert('Группа создана', 'success');
            loadUserGroups();
        } else {
            showAlert('Ошибка: ' + (data.error || 'Неизвестная ошибка'), 'danger');
        }
    } catch (error) {
        showAlert('Ошибка при создании группы: ' + error.message, 'danger');
    }
}

// Показать историю действий
async function showActionHistory() {
    const modal = new bootstrap.Modal(document.getElementById('actionHistoryModal'));
    modal.show();
    
    await loadActionHistory();
}

async function loadActionHistory() {
    const tbody = document.getElementById('actionHistoryBody');
    tbody.innerHTML = '<tr><td colspan="7" class="text-center"><div class="spinner-border"></div></td></tr>';
    
    try {
        const actionType = document.getElementById('actionTypeFilter').value;
        const resourceType = document.getElementById('resourceTypeFilter').value;
        
        let url = '/api/v1/admin/user-actions?limit=100';
        if (actionType) url += `&action_type=${actionType}`;
        if (resourceType) url += `&resource_type=${resourceType}`;
        
        const response = await fetch(url);
        const data = await response.json();
        
        if (data.success) {
            renderActionHistory(data.history || []);
        } else {
            tbody.innerHTML = '<tr><td colspan="7" class="text-center text-danger">Ошибка загрузки истории</td></tr>';
        }
    } catch (error) {
        tbody.innerHTML = `<tr><td colspan="7" class="text-center text-danger">Ошибка: ${error.message}</td></tr>`;
    }
}

function renderActionHistory(history) {
    const tbody = document.getElementById('actionHistoryBody');
    
    if (history.length === 0) {
        tbody.innerHTML = '<tr><td colspan="7" class="text-center text-muted">История пуста</td></tr>';
        return;
    }
    
    let html = '';
    history.forEach(action => {
        const date = new Date(action.created_at);
        const statusBadge = action.success 
            ? '<span class="badge bg-success">Успешно</span>'
            : '<span class="badge bg-danger">Ошибка</span>';
        
        html += `
            <tr>
                <td>${date.toLocaleString('ru-RU')}</td>
                <td><strong>${escapeHtml(action.username || '—')}</strong></td>
                <td><span class="badge bg-primary">${escapeHtml(action.action_type)}</span></td>
                <td>${action.resource_type ? `<span class="badge bg-info">${escapeHtml(action.resource_type)}</span>` : '—'}</td>
                <td>${escapeHtml(action.description || '—')}</td>
                <td><code>${escapeHtml(action.ip_address || '—')}</code></td>
                <td>${statusBadge}</td>
            </tr>
        `;
    });
    
    tbody.innerHTML = html;
}
