<?php
// conexao.php

// Inclui o script para carregar variáveis de ambiente
require_once __DIR__ . '/env.php';
carregarEnv(__DIR__ . '/.env'); // Carrega as variáveis do arquivo .env na raiz do projeto

// Inicializa a variável $pdo como null
$pdo = null;

// Configurações de DSN (Data Source Name) e opções do PDO
// Usar '??' para fornecer valores padrão caso a variável de ambiente não esteja definida
$db_host = $_ENV['DB_HOST'] ?? 'localhost';
$db_name = $_ENV['DB_NAME'] ?? '';
$db_user = $_ENV['DB_USER'] ?? '';
$db_pass = $_ENV['DB_PASS'] ?? ''; // Senhas podem estar vazias em dev, mas não recomendado
$charset = 'utf8mb4';

$dsn = "mysql:host={$db_host};dbname={$db_name};charset={$charset}";

$options = [
    PDO::ATTR_ERRMODE             => PDO::ERRMODE_EXCEPTION,        // Lança exceções em erros
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,            // Retorna arrays associativos por padrão
    PDO::ATTR_EMULATE_PREPARES    => false,                         // Desabilita emulação de prepared statements para segurança real
];

// ---- INÍCIO DO BLOCO DE DEBUG (Mantenha APENAS em desenvolvimento, remova em produção!) ----
error_log("--- DEBUG conexao.php ---");
error_log("DB_HOST lido do \$_ENV: " . ($_ENV['DB_HOST'] ?? 'NÃO DEFINIDO NO $_ENV'));
error_log("DB_NAME lido do \$_ENV: " . ($_ENV['DB_NAME'] ?? 'NÃO DEFINIDO NO $_ENV'));
error_log("DB_USER lido do \$_ENV: " . ($_ENV['DB_USER'] ?? 'NÃO DEFINIDO NO $_ENV'));
error_log("DB_PASS lido do \$_ENV está: " . (isset($_ENV['DB_PASS']) && $_ENV['DB_PASS'] !== '' ? 'DEFINIDO' : 'NÃO DEFINIDO ou VAZIO NO $_ENV'));

// Verificando as variáveis que serão usadas no DSN
error_log("Variável \$db_host: " . ($db_host ?? 'NÃO SETADA'));
error_log("Variável \$db_name: " . ($db_name ?? 'NÃO SETADA'));
error_log("Variável \$db_user: " . ($db_user ?? 'NÃO SETADA'));
error_log("Variável \$db_pass está: " . (empty($db_pass) ? 'NÃO SETADA ou VAZIA' : 'SETADA'));
error_log("DSN a ser usado: " . ($dsn ?? 'NÃO SETADO'));
error_log("--- FIM DO BLOCO DE DEBUG ---");
// Lembre-se de remover este bloco após o teste!

try {
    // Cria a instância única do PDO
    $pdo = new PDO($dsn, $db_user, $db_pass, $options);
    error_log("Conexão PDO estabelecida com sucesso."); // Log para desenvolvimento/debug

} catch (PDOException $e) {
    // Loga o erro real em um arquivo de log (não exiba para o usuário em produção)
    error_log("Falha na conexão com o Banco de Dados: " . $e->getMessage());

    // Exibe uma mensagem genérica para o usuário em caso de falha
    // Em um ambiente de produção, você pode querer ter uma página de erro mais elaborada.
    die("Desculpe, ocorreu um problema de comunicação com o sistema. Por favor, tente novamente mais tarde.");
}

/**
 * Função para registrar tentativas de login.
 * Agora utiliza a conexão $pdo global.
 *
 * @param PDO $pdo_conn A instância da conexão PDO.
 * @param string $login O identificador de login usado.
 * @param bool $sucesso True se o login foi bem-sucedido, false caso contrário.
 */
function registrarTentativaLogin(PDO $pdo_conn, string $login, bool $sucesso): void {
    if (!$pdo_conn) {
        error_log('Tentativa de registrar login sem conexão PDO válida.');
        return;
    }
    try {
        $stmt = $pdo_conn->prepare("INSERT INTO tentativas_login (login, ip, sucesso, data_tentativa) VALUES (?, ?, ?, NOW())");
        // É mais seguro usar $_SERVER['REMOTE_ADDR'] no script que lida com o login,
        // mas se for sempre chamado de um contexto web, pode ser usado aqui.
        $ip_address = $_SERVER['REMOTE_ADDR'] ?? 'UNKNOWN';
        $stmt->execute([$login, $ip_address, $sucesso ? 1 : 0]);
    } catch (PDOException $e) { // Alterado para PDOException
        error_log('Erro ao registrar tentativa de login: ' . $e->getMessage());
    }
}

/**
 * Função para verificar limite de tentativas de login.
 * Agora utiliza a conexão $pdo global.
 *
 * @param PDO $pdo_conn A instância da conexão PDO.
 * @param string $login O identificador de login a ser verificado.
 * @return bool True se o limite de tentativas foi excedido, false caso contrário.
 */
function verificarLimiteTentativas(PDO $pdo_conn, string $login): bool {
    if (!$pdo_conn) {
        error_log('Tentativa de verificar limite de tentativas sem conexão PDO válida.');
        return true; // Comportamento seguro: se não há BD, assume que está bloqueado.
    }
    try {
        $stmt = $pdo_conn->prepare("
            SELECT COUNT(*) as tentativas
            FROM tentativas_login
            WHERE login = ?
            AND sucesso = 0
            AND data_tentativa > DATE_SUB(NOW(), INTERVAL 15 MINUTE)
        "); // Recomenda-se que o '15 MINUTE' e '5' tentativas sejam configuráveis (ex: constantes ou .env)
        $stmt->execute([$login]);
        $resultado = $stmt->fetch();
        
        $max_tentativas = 5; // Defina o máximo de tentativas
        return ($resultado && $resultado['tentativas'] >= $max_tentativas);

    } catch (PDOException $e) { // Alterado para PDOException
        error_log('Erro ao verificar limite de tentativas: ' . $e->getMessage());
        return true; // Comportamento seguro em caso de erro de BD (assume bloqueado)
    }
}
