<?php
/**
 * Script de Verificação de Segurança
 * 
 * Verifica vulnerabilidades de segurança no sistema
 */

require_once __DIR__ . '/../src/Autoloader.php';
Gestoreasy\Autoloader::register();

echo "========================================\n";
echo "  GESTOR EASY - Verificação de Segurança\n";
echo "========================================\n\n";

$issues = [];
$warnings = [];
$passed = [];

// 1. Verificar SQL Injection
echo "1. Verificando proteção contra SQL Injection...\n";
$files = glob(__DIR__ . '/../modules/**/*.php');
$sqlInjectionPatterns = [
    '/addslashes\s*\(/i',
    '/mysql_real_escape_string\s*\(/i',
    '/\$.*\$.*query\s*\(/',
    '/query\s*\(\s*["\'].*\$.*["\']/',
    '/exec\s*\(\s*["\'].*\$.*["\']/'
];

foreach ($files as $file) {
    $content = file_get_contents($file);
    foreach ($sqlInjectionPatterns as $pattern) {
        if (preg_match($pattern, $content)) {
            $issues[] = "Possível SQL Injection em: $file (padrão: $pattern)";
        }
    }
    
    // Verificar se usa prepared statements
    if (strpos($content, '->query(') !== false && strpos($content, '->prepare(') === false) {
        $warnings[] = "Arquivo usa query() sem prepare(): $file";
    }
}

if (empty($issues)) {
    $passed[] = "SQL Injection: Nenhuma vulnerabilidade encontrada";
    echo "✅ SQL Injection: OK\n";
} else {
    echo "❌ SQL Injection: " . count($issues) . " problemas encontrados\n";
    foreach ($issues as $issue) {
        echo "   - $issue\n";
    }
}

// 2. Verificar proteção contra força bruta
echo "\n2. Verificando proteção contra força bruta...\n";
$authFiles = glob(__DIR__ . '/../modules/Auth/**/*.php');
$adminFiles = glob(__DIR__ . '/../modules/Admin/**/*.php');
$hasBruteForceProtection = false;

foreach (array_merge($authFiles, $adminFiles) as $file) {
    $content = file_get_contents($file);
    if (strpos($content, 'BruteForceProtection') !== false) {
        $hasBruteForceProtection = true;
        break;
    }
}

if ($hasBruteForceProtection) {
    $passed[] = "Força Bruta: Proteção implementada";
    echo "✅ Força Bruta: Proteção implementada\n";
} else {
    $issues[] = "Proteção contra força bruta não encontrada";
    echo "❌ Força Bruta: Proteção não encontrada\n";
}

// 3. Verificar rate limiting
echo "\n3. Verificando rate limiting...\n";
$hasRateLimit = false;
$apiFiles = glob(__DIR__ . '/../modules/APIPublica/**/*.php');
$coreFiles = glob(__DIR__ . '/../src/Core/**/*.php');

foreach (array_merge($apiFiles, $coreFiles) as $file) {
    $content = file_get_contents($file);
    if (strpos($content, 'RateLimit') !== false || strpos($content, 'rate_limit') !== false) {
        $hasRateLimit = true;
        break;
    }
}

if ($hasRateLimit) {
    $passed[] = "Rate Limiting: Implementado";
    echo "✅ Rate Limiting: Implementado\n";
} else {
    $warnings[] = "Rate limiting não encontrado";
    echo "⚠️  Rate Limiting: Não encontrado\n";
}

// 4. Verificar autenticação JWT
echo "\n4. Verificando autenticação JWT...\n";
$hasJwt = false;
foreach ($coreFiles as $file) {
    $content = file_get_contents($file);
    if (strpos($content, 'Jwt::') !== false || strpos($content, 'JWT') !== false) {
        $hasJwt = true;
        break;
    }
}

if ($hasJwt) {
    $passed[] = "JWT: Autenticação implementada";
    echo "✅ JWT: Autenticação implementada\n";
} else {
    $issues[] = "Autenticação JWT não encontrada";
    echo "❌ JWT: Não encontrado\n";
}

// 5. Verificar headers de segurança
echo "\n5. Verificando headers de segurança...\n";
$htaccessFile = __DIR__ . '/../.htaccess';
if (file_exists($htaccessFile)) {
    $content = file_get_contents($htaccessFile);
    $securityHeaders = [
        'X-Content-Type-Options',
        'X-Frame-Options',
        'X-XSS-Protection',
        'Referrer-Policy'
    ];
    
    $missingHeaders = [];
    foreach ($securityHeaders as $header) {
        if (strpos($content, $header) === false) {
            $missingHeaders[] = $header;
        }
    }
    
    if (empty($missingHeaders)) {
        $passed[] = "Headers de Segurança: Configurados";
        echo "✅ Headers de Segurança: Configurados\n";
    } else {
        $warnings[] = "Headers de segurança faltando: " . implode(', ', $missingHeaders);
        echo "⚠️  Headers de Segurança: Faltando " . implode(', ', $missingHeaders) . "\n";
    }
} else {
    $warnings[] = "Arquivo .htaccess não encontrado";
    echo "⚠️  Headers de Segurança: .htaccess não encontrado\n";
}

// 6. Verificar arquivo .env
echo "\n6. Verificando arquivo .env...\n";
$envFile = __DIR__ . '/../.env';
if (file_exists($envFile)) {
    $content = file_get_contents($envFile);
    if (strpos($content, 'JWT_SECRET') !== false && strpos($content, 'JWT_ADMIN_SECRET') !== false) {
        $passed[] = ".env: Chaves JWT configuradas";
        echo "✅ .env: Chaves JWT configuradas\n";
    } else {
        $issues[] = ".env: Chaves JWT não configuradas";
        echo "❌ .env: Chaves JWT não configuradas\n";
    }
    
    // Verificar se .env está no .gitignore
    $gitignoreFile = __DIR__ . '/../.gitignore';
    if (file_exists($gitignoreFile)) {
        $gitignoreContent = file_get_contents($gitignoreFile);
        if (strpos($gitignoreContent, '.env') !== false) {
            $passed[] = ".gitignore: .env está ignorado";
            echo "✅ .gitignore: .env está ignorado\n";
        } else {
            $warnings[] = ".gitignore: .env não está ignorado";
            echo "⚠️  .gitignore: .env não está ignorado\n";
        }
    }
} else {
    $warnings[] = "Arquivo .env não encontrado (pode ser normal em desenvolvimento)";
    echo "⚠️  .env: Arquivo não encontrado\n";
}

// 7. Verificar senhas
echo "\n7. Verificando hash de senhas...\n";
$authModuleFile = __DIR__ . '/../modules/Auth/Module.php';
if (file_exists($authModuleFile)) {
    $content = file_get_contents($authModuleFile);
    if (strpos($content, 'password_hash') !== false && strpos($content, 'PASSWORD_DEFAULT') !== false) {
        $passed[] = "Hash de Senhas: Usando password_hash()";
        echo "✅ Hash de Senhas: Usando password_hash()\n";
    } else {
        $issues[] = "Hash de senhas: Não está usando password_hash()";
        echo "❌ Hash de Senhas: Não está usando password_hash()\n";
    }
}

// Resumo
echo "\n========================================\n";
echo "  Resumo\n";
echo "========================================\n\n";
echo "✅ Passou: " . count($passed) . "\n";
echo "⚠️  Avisos: " . count($warnings) . "\n";
echo "❌ Problemas: " . count($issues) . "\n\n";

if (!empty($passed)) {
    echo "✅ Testes que passaram:\n";
    foreach ($passed as $p) {
        echo "   - $p\n";
    }
    echo "\n";
}

if (!empty($warnings)) {
    echo "⚠️  Avisos:\n";
    foreach ($warnings as $w) {
        echo "   - $w\n";
    }
    echo "\n";
}

if (!empty($issues)) {
    echo "❌ Problemas encontrados:\n";
    foreach ($issues as $issue) {
        echo "   - $issue\n";
    }
    echo "\n";
    exit(1);
}

echo "✅ Nenhum problema crítico encontrado!\n";
exit(0);

