<?php
// processar_login.php

// Iniciar a sessão no topo do script
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

require_once 'conexao.php'; // Fornece $pdo globalmente e funções de login_attempt
require_once 'env.php';     // Carrega $_ENV (conexao.php já deve fazer isso)

// Configurações de erro (idealmente controladas por $_ENV['APP_DEBUG'])
// error_reporting(E_ALL);
// ini_set('display_errors', 1);

// Função de redirecionamento (similar à do seu login.php original)
function redirecionarPeloRoleLogin($role_usuario_login) {
    $role_norm = strtolower($role_usuario_login);
    if ($role_norm === 'administradores' || $role_norm === 'administrador') {
        header("Location: painel-adm.php");
    } elseif ($role_norm === 'candidatos') {
        header("Location: painel-de-gestao-candidato.php");
    } elseif ($role_norm === 'empresas') {
        header("Location: painel-de-gestao-empresa.php");
    } else {
        error_log("Tentativa de redirecionamento pós-login com role desconhecida: " . $role_usuario_login);
        header("Location: index.php"); // Fallback
    }
    exit();
}


if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // --- Verificação CSRF ---
    // Assumindo que o formulário login.php envia 'csrf_token_login'
    // e que $_SESSION['csrf_token_login'] foi gerado na página do formulário.
    if (!isset($_POST['csrf_token']) || !isset($_SESSION['csrf_token_login']) || !hash_equals($_SESSION['csrf_token_login'], $_POST['csrf_token'])) {
        $_SESSION['mensagem_login'] = "Erro de validação de segurança. Por favor, tente fazer login novamente.";
        // unset($_SESSION['csrf_token_login']); // Opcional
        header("Location: login.php");
        exit();
    }
    unset($_SESSION['csrf_token_login']); // Consumir token após uso bem-sucedido


    $login_input = trim($_POST['login'] ?? '');
    $senha_input = $_POST['senha'] ?? '';

    if (empty($login_input) || empty($senha_input)) {
        $_SESSION['mensagem_login'] = "Por favor, preencha todos os campos (login e senha).";
        header("Location: login.php");
        exit();
    }

    if (!$pdo) {
        error_log("processar_login.php: Falha crítica - Conexão PDO não disponível.");
        $_SESSION['mensagem_login'] = "Erro interno do sistema. Tente novamente mais tarde. (Cod: DBConn)";
        header("Location: login.php");
        exit();
    }
    
    // --- Proteção contra Força Bruta ---
    $max_tentativas_login = (int)($_ENV['LOGIN_MAX_ATTEMPTS'] ?? 5);
    $minutos_bloqueio_login = (int)($_ENV['LOGIN_LOCKOUT_MINUTES'] ?? 15);

    if (verificarLimiteTentativas($pdo, $login_input, $max_tentativas_login, $minutos_bloqueio_login)) {
        $_SESSION['mensagem_login'] = "Muitas tentativas de login falharam. Sua conta foi temporariamente bloqueada por {$minutos_bloqueio_login} minutos.";
        header("Location: login.php");
        exit();
    }

    try {
        $usuario_encontrado = null;
        $role_do_usuario_db = null;
        $nome_para_sessao_db = null;

        // Array de tabelas para verificar, com as colunas de nome e role
        $tabelas_login = [
            'Administradores' => ['col_nome' => 'nome', 'col_role' => 'role'],
            'Empresas'        => ['col_nome' => 'nome_empresa', 'col_role' => 'role'], // ou 'contato' para nome
            'Candidatos'      => ['col_nome' => 'nome', 'col_role' => 'role']
        ];

        foreach ($tabelas_login as $tabela => $colunas) {
            $sql_login = "SELECT id, senha, login, `{$colunas['col_nome']}` AS nome_display, `{$colunas['col_role']}` AS role_tabela FROM `{$tabela}` WHERE login = :login LIMIT 1";
            $stmt_login = $pdo->prepare($sql_login);
            $stmt_login->bindParam(':login', $login_input);
            $stmt_login->execute();
            $usuario_encontrado = $stmt_login->fetch(PDO::FETCH_ASSOC);

            if ($usuario_encontrado) {
                $role_do_usuario_db = $usuario_encontrado['role_tabela']; // Pega a role da coluna 'role' da tabela
                $nome_para_sessao_db = $usuario_encontrado['nome_display'];
                break; 
            }
        }

        if ($usuario_encontrado && isset($usuario_encontrado['senha'])) {
            if (password_verify($senha_input, $usuario_encontrado['senha'])) {
                // Senha correta

                // Limpar tentativas de login falhadas
                $stmt_clear = $pdo->prepare("DELETE FROM tentativas_login WHERE login = ?");
                $stmt_clear->execute([$login_input]);
                
                session_regenerate_id(true); // Prevenir session fixation

                // Limpar sessão antiga antes de popular com novos dados
                $_SESSION = []; 

                $_SESSION['usuario_logado'] = true;
                $_SESSION['id'] = $usuario_encontrado['id'];
                $_SESSION['usuario_nome'] = $nome_para_sessao_db;
                $_SESSION['login'] = $usuario_encontrado['login'];
                $_SESSION['role'] = $role_do_usuario_db; // Role vindo do banco
                $_SESSION['ultimo_acesso'] = time();

                if ($role_do_usuario_db === 'Candidatos') {
                    $_SESSION['id_candidato'] = $usuario_encontrado['id'];
                }
                
                // Registrar acesso bem-sucedido no histórico
                $tipo_usuario_hist_login = strtolower(str_replace('dores', '', str_replace('as', '', $role_do_usuario_db))); // admin, empresa, candidato
                if ($tipo_usuario_hist_login === 'administra') $tipo_usuario_hist_login = 'admin';

                $pagina_acessada_hist_login = "login.php (sucesso)";
                try {
                    $stmt_hist_login = $pdo->prepare("INSERT INTO historico_acessos (usuario_id, tipo_usuario, pagina_acessada, data_acesso) VALUES (?, ?, ?, NOW())");
                    $stmt_hist_login->execute([$usuario_encontrado['id'], $tipo_usuario_hist_login, $pagina_acessada_hist_login]);
                } catch (PDOException $e_log_hist) {
                    error_log("Erro ao registrar histórico de login bem-sucedido: " . $e_log_hist->getMessage());
                }

                // Redirecionar para URL de destino ou painel padrão
                $redirect_url = $_SESSION['redirect_after_login'] ?? null;
                unset($_SESSION['redirect_after_login']);

                if (!empty($redirect_url)) {
                    // Validação básica da URL de redirecionamento
                    $parsed_redirect_url = parse_url($redirect_url);
                    if (isset($parsed_redirect_url['host']) && $parsed_redirect_url['host'] !== ($_SERVER['HTTP_HOST'] ?? '')) {
                        error_log("Tentativa de redirecionamento pós-login para host externo bloqueada: " . $redirect_url);
                        redirecionarPeloRoleLogin($role_do_usuario_db);
                    } else {
                        header("Location: " . $redirect_url);
                        exit();
                    }
                } else {
                    redirecionarPeloRoleLogin($role_do_usuario_db);
                }
                // exit() já está em redirecionarPeloRoleLogin

            } else {
                // Senha incorreta
                registrarTentativaLogin($pdo, $login_input, false);
                $_SESSION['mensagem_login'] = "Senha inválida.";
                header("Location: login.php");
                exit();
            }
        } else {
            // Usuário não encontrado
            // Não registrar tentativa para não vazar informação se o login existe ou não,
            // ou registrar se quiser monitorar tentativas com logins inexistentes.
            // registrarTentativaLogin($pdo, $login_input, false); 
            $_SESSION['mensagem_login'] = "Login não encontrado.";
            header("Location: login.php");
            exit();
        }

    } catch (PDOException $e) {
        error_log("Erro PDO no processamento do login para '{$login_input}': " . $e->getMessage());
        $_SESSION['mensagem_login'] = "Erro interno do sistema ao tentar fazer login. Tente novamente mais tarde.";
        header("Location: login.php");
        exit();
    }
} else {
    // Se não for POST, redirecionar para a página de login
    header("Location: login.php");
    exit();
}
?>