<?php
/**
 * Admin Impersonate - Acesso como Usuário
 * 
 * Permite que o admin acesse a conta de qualquer usuário sem senha
 * CRÍTICO: Apenas admins podem usar esta funcionalidade
 */

// Iniciar sessão se não estiver iniciada
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

// Carregar helpers de autenticação e banco de dados
require_once __DIR__ . '/../../backend/auth_helper.php';
require_once __DIR__ . '/../../config/config_db.php';

// VERIFICAÇÃO DE SEGURANÇA CRÍTICA: Apenas admin pode acessar
if (!eh_admin()) {
    // Log de tentativa de acesso não autorizado
    error_log("Tentativa de acesso não autorizado ao admin_impersonate.php - IP: " . ($_SERVER['REMOTE_ADDR'] ?? 'desconhecido'));
    
    // Redirecionar para login
    header("Location: /dashboard/login.php?erro=acesso_negado");
    exit;
}

// Verificar se o ID do usuário foi fornecido
if (!isset($_GET['id']) || empty($_GET['id'])) {
    header("Location: /dashboard/index.php?page=usuarios&erro=id_nao_informado");
    exit;
}

$usuario_alvo_id = intval($_GET['id']);

// Validar se o ID é válido (maior que zero)
if ($usuario_alvo_id <= 0) {
    header("Location: /dashboard/index.php?page=usuarios&erro=id_invalido");
    exit;
}

// Não permitir que o admin se impersonate a si mesmo (desnecessário)
if ($usuario_alvo_id == get_usuario_id()) {
    header("Location: /dashboard/index.php?page=usuarios&erro=ja_logado_como_este_usuario");
    exit;
}

try {
    // Buscar dados do usuário alvo no banco de dados
    $sql = "SELECT id, nome, email, tipo, status FROM usuarios WHERE id = :id LIMIT 1";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([':id' => $usuario_alvo_id]);
    $usuario_alvo = $stmt->fetch(PDO::FETCH_ASSOC);
    
    // Verificar se o usuário existe
    if (!$usuario_alvo) {
        header("Location: /dashboard/index.php?page=usuarios&erro=usuario_nao_encontrado");
        exit;
    }
    
    // Não permitir impersonar outro admin (segurança adicional)
    if ($usuario_alvo['tipo'] === 'admin') {
        header("Location: /dashboard/index.php?page=usuarios&erro=nao_pode_impersonar_admin");
        exit;
    }
    
    // Salvar o ID original do admin antes de trocar (para possível botão "Voltar" no futuro)
    $_SESSION['admin_original_id'] = get_usuario_id();
    $_SESSION['admin_original_nome'] = $_SESSION['usuario_nome'] ?? '';
    $_SESSION['admin_original_email'] = $_SESSION['usuario_email'] ?? '';
    $_SESSION['impersonating'] = true; // Flag indicando que está impersonando
    
    // TROCAR A SESSÃO: Atualizar variáveis de sessão com dados do usuário alvo
    $_SESSION['usuario_id'] = $usuario_alvo['id'];
    $_SESSION['usuario_nome'] = $usuario_alvo['nome'];
    $_SESSION['usuario_email'] = $usuario_alvo['email'];
    $_SESSION['usuario_tipo'] = $usuario_alvo['tipo'];
    $_SESSION['usuario_status'] = $usuario_alvo['status'];
    $_SESSION['loggedin'] = true; // Mantém compatibilidade
    
    // Log da ação para auditoria
    error_log("Admin ID " . $_SESSION['admin_original_id'] . " impersonou usuário ID " . $usuario_alvo_id . " - IP: " . ($_SERVER['REMOTE_ADDR'] ?? 'desconhecido'));
    
    // Redirecionar para o painel do usuário
    header("Location: /dashboard/usuario.php?impersonate=success");
    exit;
    
} catch (PDOException $e) {
    error_log("Erro ao buscar usuário para impersonate: " . $e->getMessage());
    header("Location: /dashboard/index.php?page=usuarios&erro=erro_banco_dados");
    exit;
}







