<?php
/**
 * MÓDULO: Auditoria e Logs de Sistema
 * Visualização e consulta dos logs de auditoria capturados pelo sistema
 */

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) {
    header('Content-Type: application/json');
    $action = $_POST['action'];

    // 🔍 Listar logs com filtros
    if ($action === 'listar') {
        $filtros = [];
        
        if (!empty($_POST['tipo_acao'])) {
            $filtros['tipo_acao'] = $_POST['tipo_acao'];
        }
        if (!empty($_POST['cdpessoa'])) {
            $filtros['cdpessoa'] = (int)$_POST['cdpessoa'];
        }
        if (!empty($_POST['cdempresa'])) {
            $filtros['cdempresa'] = (int)$_POST['cdempresa'];
        }
        if (!empty($_POST['resultado'])) {
            $filtros['resultado'] = $_POST['resultado'];
        }
        if (!empty($_POST['data_inicio'])) {
            $filtros['data_inicio'] = $_POST['data_inicio'];
        }
        if (!empty($_POST['data_fim'])) {
            $filtros['data_fim'] = $_POST['data_fim'];
        }

        $page = max(1, (int)($_POST['page'] ?? 1));
        $limit = 50;
        $offset = ($page - 1) * $limit;
        
        $filtros['limit'] = $limit;
        $filtros['offset'] = $offset;

        $logs = AuditoriaLog::obter($filtros);
        $total = AuditoriaLog::contar($filtros);
        $pages = ceil($total / $limit);

        echo json_encode([
            'sucesso' => true,
            'dados' => $logs,
            'total' => $total,
            'page' => $page,
            'pages' => $pages,
            'limit' => $limit
        ]);
        exit;
    }

    // ✅ Obter estatísticas
    if ($action === 'stats') {
        try {
            $sql = "
                SELECT 
                    COUNT(*) as total_logs,
                    COUNT(DISTINCT cdpessoa) as usuarios_unicos,
                    COUNT(DISTINCT cdempresa) as empresas_unicas,
                    SUM(CASE WHEN tipo_acao = 'login' AND resultado = 'sucesso' THEN 1 ELSE 0 END) as login_sucesso,
                    SUM(CASE WHEN tipo_acao = 'login' AND resultado = 'falha' THEN 1 ELSE 0 END) as login_falha,
                    SUM(CASE WHEN tipo_acao = 'login' AND resultado = 'bloqueado' THEN 1 ELSE 0 END) as usuarios_bloqueados
                FROM back.auditoria_log
                WHERE dthcriacao >= NOW() - interval '30 days'
            ";
            
            $stmt = $pdo->prepare($sql);
            $stmt->execute();
            $stats = $stmt->fetch(PDO::FETCH_ASSOC);

            echo json_encode(['sucesso' => true, 'dados' => $stats]);
        } catch (Exception $e) {
            echo json_encode(['sucesso' => false, 'erro' => $e->getMessage()]);
        }
        exit;
    }

    // 👁️ Ver detalhes completos de um log
    if ($action === 'ver_detalhes') {
        $cdlog = (int)$_POST['cdlog'];
        
        try {
            $sql = "
                SELECT 
                    cdlog, tipo_acao, cdpessoa, cdempresa, ip_address, user_agent,
                    resultado, descricao, dados_json, dthcriacao, dthmodificacao,
                    (SELECT dspessoa FROM back.pessoa WHERE cdpessoa = auditoria_log.cdpessoa) as nome_usuario,
                    (SELECT dsempresa FROM back.empresa WHERE cdempresa = auditoria_log.cdempresa) as nome_empresa
                FROM back.auditoria_log
                WHERE cdlog = :cdlog
                LIMIT 1
            ";
            
            $stmt = $pdo->prepare($sql);
            $stmt->execute([':cdlog' => $cdlog]);
            $log = $stmt->fetch(PDO::FETCH_ASSOC);

            if (!$log) {
                echo json_encode(['sucesso' => false, 'erro' => 'Log não encontrado']);
                exit;
            }

            // Decodificar JSON
            if (!empty($log['dados_json'])) {
                $log['dados_json'] = json_decode($log['dados_json'], true);
            }

            echo json_encode(['sucesso' => true, 'dados' => $log]);
        } catch (Exception $e) {
            echo json_encode(['sucesso' => false, 'erro' => $e->getMessage()]);
        }
        exit;
    }

    // 📊 Logins por dia
    if ($action === 'logins_por_dia') {
        try {
            $sql = "
                SELECT 
                    DATE(dthcriacao) as data,
                    SUM(CASE WHEN tipo_acao = 'login' AND resultado = 'sucesso' THEN 1 ELSE 0 END) as sucesso,
                    SUM(CASE WHEN tipo_acao = 'login' AND resultado = 'falha' THEN 1 ELSE 0 END) as falha,
                    SUM(CASE WHEN tipo_acao = 'login' AND resultado = 'bloqueado' THEN 1 ELSE 0 END) as bloqueado
                FROM back.auditoria_log
                WHERE tipo_acao = 'login'
                  AND dthcriacao >= NOW() - interval '30 days'
                GROUP BY DATE(dthcriacao)
                ORDER BY data DESC
            ";
            
            $stmt = $pdo->prepare($sql);
            $stmt->execute();
            $data = $stmt->fetchAll(PDO::FETCH_ASSOC);

            echo json_encode(['sucesso' => true, 'dados' => $data]);
        } catch (Exception $e) {
            echo json_encode(['sucesso' => false, 'erro' => $e->getMessage()]);
        }
        exit;
    }

    // 🚨 Tentativas de login falhadas
    if ($action === 'login_falhas') {
        try {
            $sql = "
                SELECT 
                    COALESCE(cdpessoa::text, 'N/A') as usuario_id,
                    COALESCE((SELECT dspessoa FROM back.pessoa WHERE cdpessoa = auditoria_log.cdpessoa), 
                             COALESCE(dados_json->>'usuario_tentado', 'Desconhecido')) as usuario,
                    COUNT(*) as total_falhas,
                    MAX(dthcriacao) as ultimo_acesso
                FROM back.auditoria_log
                WHERE tipo_acao = 'login' 
                  AND resultado IN ('falha', 'bloqueado')
                  AND dthcriacao >= NOW() - interval '7 days'
                GROUP BY usuario_id, usuario
                ORDER BY total_falhas DESC
                LIMIT 50
            ";
            
            $stmt = $pdo->prepare($sql);
            $stmt->execute();
            $data = $stmt->fetchAll(PDO::FETCH_ASSOC);

            echo json_encode(['sucesso' => true, 'dados' => $data]);
        } catch (Exception $e) {
            echo json_encode(['sucesso' => false, 'erro' => $e->getMessage()]);
        }
        exit;
    }
}

// ============================================================
// HTML: Interface de Auditoria
// ============================================================
?>
<div class="container-fluid p-3">
    <div class="row mb-4">
        <div class="col-md-12">
            <h3 class="mb-3">
                <i class="bi bi-shield-check"></i> Auditoria de Sistema
            </h3>
        </div>
    </div>

    <!-- 📊 Cards de Estatísticas -->
    <div class="row mb-4" id="stats-container">
        <div class="col-md-3">
            <div class="card text-center">
                <div class="card-body">
                    <h6 class="text-muted">Total de Logs (30d)</h6>
                    <h3 class="stat-value">-</h3>
                </div>
            </div>
        </div>
        <div class="col-md-3">
            <div class="card text-center text-success">
                <div class="card-body">
                    <h6 class="text-muted">Logins Bem-Sucedidos</h6>
                    <h3 class="stat-value">-</h3>
                </div>
            </div>
        </div>
        <div class="col-md-3">
            <div class="card text-center text-danger">
                <div class="card-body">
                    <h6 class="text-muted">Logins Falhados</h6>
                    <h3 class="stat-value">-</h3>
                </div>
            </div>
        </div>
        <div class="col-md-3">
            <div class="card text-center text-warning">
                <div class="card-body">
                    <h6 class="text-muted">Usuários Bloqueados</h6>
                    <h3 class="stat-value">-</h3>
                </div>
            </div>
        </div>
    </div>

    <!-- 🔍 Filtros -->
    <div class="card mb-4">
        <div class="card-header bg-light">
            <h6 class="mb-0">Filtros e Busca</h6>
        </div>
        <div class="card-body">
            <div class="row g-3">
                <div class="col-md-2">
                    <label class="form-label">Tipo de Ação</label>
                    <select id="tipo_acao" class="form-select">
                        <option value="">Todos</option>
                        <option value="login">Login</option>
                        <option value="logout">Logout</option>
                        <option value="senha_alteracao">Alteração de Senha</option>
                        <option value="alteracao">Alteração de Dados</option>
                        <option value="sincronizacao">Sincronização</option>
                    </select>
                </div>
                <div class="col-md-2">
                    <label class="form-label">Resultado</label>
                    <select id="resultado" class="form-select">
                        <option value="">Todos</option>
                        <option value="sucesso">Sucesso</option>
                        <option value="falha">Falha</option>
                        <option value="aviso">Aviso</option>
                        <option value="bloqueado">Bloqueado</option>
                    </select>
                </div>
                <div class="col-md-2">
                    <label class="form-label">Data Início</label>
                    <input type="date" id="data_inicio" class="form-control">
                </div>
                <div class="col-md-2">
                    <label class="form-label">Data Fim</label>
                    <input type="date" id="data_fim" class="form-control">
                </div>
                <div class="col-md-4">
                    <label class="form-label">&nbsp;</label>
                    <div class="d-grid gap-2">
                        <button class="btn btn-primary" onclick="buscarLogs()">
                            <i class="bi bi-search"></i> Buscar
                        </button>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <!-- 📋 Tabela de Logs -->
    <div class="card">
        <div class="card-header bg-light">
            <h6 class="mb-0">Logs de Auditoria</h6>
        </div>
        <div class="table-responsive">
            <table class="table table-sm table-hover mb-0">
                <thead class="table-light">
                    <tr>
                        <th>Data/Hora</th>
                        <th>Tipo</th>
                        <th>Usuário</th>
                        <th>Resultado</th>
                        <th>Descrição</th>
                        <th>IP Address</th>
                        <th style="width: 80px;">Ação</th>
                    </tr>
                </thead>
                <tbody id="logs-table">
                    <tr>
                        <td colspan="7" class="text-center text-muted py-3">
                            Nenhum log encontrado. Use os filtros para buscar.
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
        <div class="card-footer">
            <nav aria-label="Page navigation">
                <ul class="pagination pagination-sm mb-0" id="pagination">
                    <!-- Preenchida por JS -->
                </ul>
            </nav>
        </div>
    </div>
</div>

<!-- Modal: Detalhes do Log -->
<div class="modal fade" id="modalDetalhes" tabindex="-1">
    <div class="modal-dialog modal-lg">
        <div class="modal-content">
            <div class="modal-header">
                <h6 class="modal-title">Detalhes do Log</h6>
                <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
            </div>
            <div class="modal-body">
                <div id="detalhes-content"></div>
            </div>
        </div>
    </div>
</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
    carregarEstatisticas();
    buscarLogs();
});

async function carregarEstatisticas() {
    try {
        const response = await fetch('<?php echo $_GET['m'] ? 'index.php?m=' . $_GET['m'] : '#'; ?>', {
            method: 'POST',
            body: new FormData(Object.assign(document.createElement('form'), {
                action: 'stats'
            })),
            headers: {
                'X-Requested-With': 'XMLHttpRequest'
            }
        });

        const data = await response.json();
        
        if (data.sucesso) {
            const stats = data.dados;
            const cards = document.querySelectorAll('#stats-container .stat-value');
            cards[0].textContent = (stats.total_logs || 0).toLocaleString('pt-BR');
            cards[1].textContent = (stats.login_sucesso || 0).toLocaleString('pt-BR');
            cards[2].textContent = (stats.login_falha || 0).toLocaleString('pt-BR');
            cards[3].textContent = (stats.usuarios_bloqueados || 0).toLocaleString('pt-BR');
        }
    } catch (e) {
        console.error('Erro ao carregar estatísticas:', e);
    }
}

async function buscarLogs(page = 1) {
    const form = new FormData();
    form.append('action', 'listar');
    form.append('tipo_acao', document.getElementById('tipo_acao').value);
    form.append('resultado', document.getElementById('resultado').value);
    form.append('data_inicio', document.getElementById('data_inicio').value);
    form.append('data_fim', document.getElementById('data_fim').value);
    form.append('page', page);

    try {
        const response = await fetch('<?php echo $_GET['m'] ? 'index.php?m=' . $_GET['m'] : '#'; ?>', {
            method: 'POST',
            body: form,
            headers: {
                'X-Requested-With': 'XMLHttpRequest'
            }
        });

        const data = await response.json();
        
        if (data.sucesso) {
            preencherTabela(data.dados);
            atualizarPaginacao(data.page, data.pages);
        }
    } catch (e) {
        console.error('Erro ao buscar logs:', e);
    }
}

function preencherTabela(logs) {
    const tbody = document.getElementById('logs-table');
    
    if (logs.length === 0) {
        tbody.innerHTML = '<tr><td colspan="7" class="text-center text-muted py-3">Nenhum log encontrado</td></tr>';
        return;
    }

    tbody.innerHTML = logs.map(log => `
        <tr>
            <td><small>${new Date(log.dthcriacao).toLocaleString('pt-BR')}</small></td>
            <td><span class="badge bg-secondary">${log.tipo_acao}</span></td>
            <td>${log.dspessoa || 'N/A'}</td>
            <td>
                <span class="badge ${
                    log.resultado === 'sucesso' ? 'bg-success' : 
                    log.resultado === 'falha' ? 'bg-danger' : 
                    log.resultado === 'bloqueado' ? 'bg-warning' : 'bg-info'
                }">
                    ${log.resultado}
                </span>
            </td>
            <td><small>${log.descricao || '-'}</small></td>
            <td><small>${log.ip_address || '-'}</small></td>
            <td>
                <button class="btn btn-xs btn-outline-primary" onclick="verDetalhes(${log.cdlog})" title="Detalhes">
                    <i class="bi bi-eye"></i>
                </button>
            </td>
        </tr>
    `).join('');
}

function atualizarPaginacao(page, pages) {
    const nav = document.getElementById('pagination');
    let html = '';

    if (page > 1) {
        html += `<li class="page-item"><a class="page-link" href="#" onclick="buscarLogs(${page - 1}); return false;">Anterior</a></li>`;
    }

    for (let i = Math.max(1, page - 2); i <= Math.min(pages, page + 2); i++) {
        html += `<li class="page-item ${i === page ? 'active' : ''}">
                    <a class="page-link" href="#" onclick="buscarLogs(${i}); return false;">${i}</a>
                 </li>`;
    }

    if (page < pages) {
        html += `<li class="page-item"><a class="page-link" href="#" onclick="buscarLogs(${page + 1}); return false;">Próximo</a></li>`;
    }

    nav.innerHTML = html;
}

async function verDetalhes(cdlog) {
    const form = new FormData();
    form.append('action', 'ver_detalhes');
    form.append('cdlog', cdlog);

    try {
        const response = await fetch('<?php echo $_GET['m'] ? 'index.php?m=' . $_GET['m'] : '#'; ?>', {
            method: 'POST',
            body: form
        });

        const data = await response.json();
        
        if (data.sucesso) {
            const log = data.dados;
            let html = `
                <div class="row mb-3">
                    <div class="col-md-6">
                        <strong>ID Log:</strong> ${log.cdlog}
                    </div>
                    <div class="col-md-6">
                        <strong>Data:</strong> ${new Date(log.dthcriacao).toLocaleString('pt-BR')}
                    </div>
                </div>
                <div class="row mb-3">
                    <div class="col-md-6">
                        <strong>Tipo:</strong> ${log.tipo_acao}
                    </div>
                    <div class="col-md-6">
                        <strong>Resultado:</strong> <span class="badge ${
                            log.resultado === 'sucesso' ? 'bg-success' : 
                            log.resultado === 'falha' ? 'bg-danger' : 
                            log.resultado === 'bloqueado' ? 'bg-warning' : 'bg-info'
                        }">${log.resultado}</span>
                    </div>
                </div>
                <div class="row mb-3">
                    <div class="col-md-6">
                        <strong>Usuário:</strong> ${log.nome_usuario || 'N/A'}
                    </div>
                    <div class="col-md-6">
                        <strong>Empresa:</strong> ${log.nome_empresa || 'N/A'}
                    </div>
                </div>
                <div class="row mb-3">
                    <div class="col-md-6">
                        <strong>IP Address:</strong> ${log.ip_address || 'N/A'}
                    </div>
                    <div class="col-md-6">
                        <strong>User Agent:</strong> <small>${log.user_agent || 'N/A'}</small>
                    </div>
                </div>
                <div class="row mb-3">
                    <div class="col-md-12">
                        <strong>Descrição:</strong> <br>
                        ${log.descricao || 'N/A'}
                    </div>
                </div>
            `;

            if (log.dados_json && Object.keys(log.dados_json).length > 0) {
                html += `
                    <div class="row">
                        <div class="col-md-12">
                            <strong>Dados Adicionais (JSON):</strong>
                            <pre class="bg-light p-2"><code>${JSON.stringify(log.dados_json, null, 2)}</code></pre>
                        </div>
                    </div>
                `;
            }

            document.getElementById('detalhes-content').innerHTML = html;
            new bootstrap.Modal(document.getElementById('modalDetalhes')).show();
        }
    } catch (e) {
        console.error('Erro ao carregar detalhes:', e);
    }
}

// Inter-conectar filtros com busca automática
document.getElementById('tipo_acao').addEventListener('change', () => buscarLogs(1));
document.getElementById('resultado').addEventListener('change', () => buscarLogs(1));
document.getElementById('data_inicio').addEventListener('change', () => buscarLogs(1));
document.getElementById('data_fim').addEventListener('change', () => buscarLogs(1));
</script>
