<?php
// Arquivo: middleware-auth.php
// Responsável por gerenciar autenticação e controle de acesso

/**
 * Verifica a autenticação do usuário e seu papel.
 * Redireciona se não autenticado, se o papel não for permitido, ou se a sessão expirou.
 *
 * @param array $roles_permitidos Array de strings com os papéis permitidos. Se vazio, apenas verifica se está logado.
 */
function verificarAutenticacao($roles_permitidos = []) {
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }

    // Carregar variáveis de ambiente se for usar para SESSION_LIFETIME_INACTIVITY
    // Se este arquivo for incluído após conexao.php, o .env já pode estar carregado.
    // Para garantir, pode incluir aqui (verifique se env.php define a função carregarEnv globalmente).
    // require_once __DIR__ . '/env.php';
    // carregarEnv(__DIR__ . '/.env');

    // Verificar se usuário está logado
    if (!isset($_SESSION['usuario_logado']) || $_SESSION['usuario_logado'] !== true) {
        $_SESSION['mensagem_login_redirect'] = "Por favor, faça o login para continuar.";
        // Salvar a URL que o usuário tentava acessar para redirecionar após o login
        if (!empty($_SERVER['REQUEST_URI'])) {
             $_SESSION['redirect_after_login'] = $_SERVER['REQUEST_URI'];
        }
        header("Location: login.php"); // Idealmente, a URL base do site viria do .env
        exit();
    }

    // Verificar inatividade da sessão
    // $tempo_inatividade = (int)($_ENV['SESSION_LIFETIME_INACTIVITY'] ?? 1800); // 30 minutos (exemplo com .env)
    $tempo_inatividade = 1800; // 30 minutos (mantendo o original por simplicidade)

    if (isset($_SESSION['ultimo_acesso']) && (time() - $_SESSION['ultimo_acesso'] > $tempo_inatividade)) {
        $nome_usuario_expirado = $_SESSION['usuario_nome'] ?? 'Usuário'; // Para mensagem personalizada
        
        // Limpar todas as variáveis de sessão
        $_SESSION = [];
        
        // Destruir a sessão no servidor
        session_destroy();
        
        // Limpar cookie de sessão do navegador
        if (ini_get("session.use_cookies")) {
            $params = session_get_cookie_params();
            setcookie(session_name(), '', time() - 42000,
                $params["path"], $params["domain"],
                $params["secure"], $params["httponly"]
            );
        }
        
        // Iniciar uma nova sessão para a mensagem flash
        session_start();
        $_SESSION['mensagem_login_redirect'] = htmlspecialchars($nome_usuario_expirado) . ", sua sessão expirou por inatividade. Por favor, faça login novamente.";
        header("Location: login.php"); // Idealmente, a URL base do site viria do .env
        exit();
    }

    // Atualizar último acesso
    $_SESSION['ultimo_acesso'] = time();

    // Se roles_permitidos estiver definido e não vazio, verificar o papel do usuário
    if (!empty($roles_permitidos)) {
        $role_usuario_atual = $_SESSION['role'] ?? '';
        $permitido = false;
        foreach ($roles_permitidos as $role_permitida) {
            // Comparação flexível para 'Administrador' e 'Administradores'
            if (strtolower($role_usuario_atual) === strtolower($role_permitida)) {
                $permitido = true;
                break;
            }
        }

        if (!$permitido) {
            $_SESSION['mensagem_acesso_negado'] = "Você não tem permissão para acessar esta página. Seu papel atual é: " . htmlspecialchars($role_usuario_atual);
            // Redirecionar para um painel padrão ou uma página de "acesso negado"
            // Se já estiver logado, não faz sentido ir para login.php, a menos que o login.php lide com isso.
            // Melhor redirecionar para o painel do usuário ou uma página de erro dedicada.
            // Exemplo: se a role for 'Candidatos', vai para o painel de candidato.
            $redirect_url_negado = 'index.php'; // Fallback
            if ($role_usuario_atual === 'Candidatos') {
                $redirect_url_negado = 'painel-de-gestao-candidato.php';
            } elseif ($role_usuario_atual === 'Empresas') {
                $redirect_url_negado = 'painel-de-gestao-empresa.php';
            } elseif ($role_usuario_atual === 'Administradores' || $role_usuario_atual === 'Administrador') {
                $redirect_url_negado = 'painel-adm.php'; // Se um admin tenta acessar algo que não deveria (improvável com este setup)
            }
            
            header("Location: " . $redirect_url_negado . "?aviso=acesso_restrito");
            exit();
        }
    }
}

// Funções específicas de autenticação por papel (mantidas como estavam, pois são convenientes)
// Elas agora usam a lógica de verificação de role mais flexível dentro de verificarAutenticacao
function authAdministrador() {
    verificarAutenticacao(['Administradores', 'Administrador']); // Aceita ambos os nomes
}

function authCandidatos() {
    verificarAutenticacao(['Candidatos']);
}

function authEmpresas() {
    verificarAutenticacao(['Empresas']);
}

?>