<?php
// verifica_login.php

// Define o tipo de conteúdo da resposta como JSON ANTES de qualquer output
header('Content-Type: application/json; charset=utf-8');

// Iniciar a sessão no topo do script, pois vamos definir variáveis de sessão
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

require_once 'conexao.php'; // Fornece $pdo globalmente e funções de login_attempt (se estiverem lá)
require_once 'env.php';     // Carrega $_ENV

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

// Resposta padrão
$response = ['success' => false, 'message' => 'Requisição inválida.'];

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    $response['message'] = 'Método de requisição não permitido.';
    http_response_code(405); // Method Not Allowed
    echo json_encode($response);
    exit;
}

// --- Verificação CSRF ---
// O cliente AJAX precisaria enviar este token (ex: de uma meta tag ou cookie, em um header ou no corpo JSON)
// Para este exemplo, vamos assumir que ele é enviado no corpo JSON do POST
$input_data = json_decode(file_get_contents("php://input"), true);

if (json_last_error() !== JSON_ERROR_NONE && empty($_POST)) { // Tenta POST normal se JSON falhar
    $response['message'] = 'Dados da requisição inválidos (não POST ou JSON malformado).';
    http_response_code(400); // Bad Request
    echo json_encode($response);
    exit;
}

// Prioriza dados JSON, depois POST normal
$request_data = $input_data ?: $_POST;


if (!isset($request_data['csrf_token']) || !isset($_SESSION['csrf_token_ajax_login']) || !hash_equals($_SESSION['csrf_token_ajax_login'], $request_data['csrf_token'])) {
    $response['message'] = 'Erro de validação de segurança (CSRF). Recarregue a página e tente novamente.';
    http_response_code(403); // Forbidden
    // unset($_SESSION['csrf_token_ajax_login']); // Opcional
    echo json_encode($response);
    exit();
}
// unset($_SESSION['csrf_token_ajax_login']); // Consumir se for de uso único


$email_input = trim($request_data['email'] ?? ''); // Assumindo que o login é via e-mail
$senha_input = $request_data['senha'] ?? '';

if (empty($email_input) || empty($senha_input)) {
    $response['message'] = 'Por favor, preencha seu e-mail e senha.';
    http_response_code(400);
    echo json_encode($response);
    exit;
}

if (!filter_var($email_input, FILTER_VALIDATE_EMAIL)) {
    $response['message'] = 'Formato de e-mail inválido.';
    http_response_code(400);
    echo json_encode($response);
    exit;
}

if (!$pdo) {
    error_log("verifica_login.php: Falha crítica - Conexão PDO não disponível.");
    $response['message'] = 'Erro interno do sistema (Cod: DBINIT). Tente novamente mais tarde.';
    http_response_code(500); // Internal Server Error
    echo json_encode($response);
    exit();
}

// --- Proteção contra Força Bruta ---
$max_tentativas = (int)($_ENV['LOGIN_MAX_ATTEMPTS'] ?? 5);
$minutos_bloqueio = (int)($_ENV['LOGIN_LOCKOUT_MINUTES'] ?? 15);

// Assumindo que verificarLimiteTentativas e registrarTentativaLogin estão em conexao.php ou incluídas
if (function_exists('verificarLimiteTentativas') && verificarLimiteTentativas($pdo, $email_input, $max_tentativas, $minutos_bloqueio)) {
    $response['message'] = "Muitas tentativas de login falharam. Acesso temporariamente bloqueado por {$minutos_bloqueio} minutos.";
    http_response_code(429); // Too Many Requests
    echo json_encode($response);
    exit();
}

try {
    // ASSUMINDO UMA TABELA 'usuarios' UNIFICADA COM AS COLUNAS: id, nome, email, senha, role
    // Se suas tabelas forem separadas, a lógica de busca do processar_login.php anterior é mais apropriada.
    $stmt_user = $pdo->prepare("SELECT id, nome, email, senha, role FROM usuarios WHERE email = :email LIMIT 1");
    $stmt_user->bindParam(':email', $email_input);
    $stmt_user->execute();
    $usuario = $stmt_user->fetch(PDO::FETCH_ASSOC);

    if ($usuario && isset($usuario['senha']) && password_verify($senha_input, $usuario['senha'])) {
        // Login bem-sucedido
        
        if (function_exists('registrarTentativaLogin')) { // Limpar tentativas falhas
            $stmt_clear_attempts = $pdo->prepare("DELETE FROM tentativas_login WHERE login = ?");
            $stmt_clear_attempts->execute([$email_input]);
        }
        
        session_regenerate_id(true); // Prevenir session fixation

        $_SESSION['usuario_logado'] = true;
        $_SESSION['id'] = $usuario['id'];
        $_SESSION['usuario_nome'] = $usuario['nome']; // Certifique-se que 'nome' existe na tabela usuarios
        $_SESSION['login'] = $usuario['email'];     // Ou a coluna de login que você usa
        $_SESSION['role'] = $usuario['role'];        // Certifique-se que 'role' existe na tabela usuarios
        $_SESSION['ultimo_acesso'] = time();

        // Se for um candidato, também define id_candidato para consistência com outros scripts
        if (strtolower($usuario['role']) === 'candidatos') {
            $_SESSION['id_candidato'] = $usuario['id'];
        }

        // Log de acesso bem-sucedido
        $tipo_usuario_hist_login = strtolower($usuario['role']); // Assumindo que role no BD já é 'admin', 'empresa', 'candidato'
        if ($tipo_usuario_hist_login === 'administradores') $tipo_usuario_hist_login = 'admin'; // Normalização
        elseif ($tipo_usuario_hist_login === 'empresas') $tipo_usuario_hist_login = 'empresa';
        elseif ($tipo_usuario_hist_login === 'candidatos') $tipo_usuario_hist_login = 'candidato';

        $pagina_acessada_hist_login = "verifica_login.php (AJAX login 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['id'], $tipo_usuario_hist_login, $pagina_acessada_hist_login]);
        } catch (PDOException $e_log_hist) { /* Log silencioso da falha do log */ }
        
        $response = [
            'success' => true, 
            'message' => 'Login realizado com sucesso.',
            'redirect_url' => ($_SESSION['redirect_after_login'] ?? '') // Envia URL de redirect se existir
            // Opcional: 'user' => ['nome' => $usuario['nome'], 'role' => $usuario['role']]
        ];
        unset($_SESSION['redirect_after_login']); // Limpa após enviar

    } else {
        // Credenciais inválidas ou usuário não encontrado
        if (function_exists('registrarTentativaLogin')) {
            registrarTentativaLogin($pdo, $email_input, false);
        }
        $response['message'] = 'E-mail ou senha inválidos.';
        http_response_code(401); // Unauthorized
    }
} catch (PDOException $e) {
    error_log("Erro PDO em verifica_login.php para '{$email_input}': " . $e->getMessage());
    $response['message'] = 'Erro ao processar o login. Tente novamente. (Cod: DBE)';
    http_response_code(500);
}

echo json_encode($response);
exit();
?>