<?php
require_once 'config.php';

class SecurityManager {
    private static $instance = null;
    private $session_token;

    private function __construct() {
        $this->session_token = isset($_SESSION['security_token']) ? $_SESSION['security_token'] : $this->generateToken();
    }

    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new SecurityManager();
        }
        return self::$instance;
    }

    // Gera token único para a sessão
    private function generateToken() {
        $token = bin2hex(random_bytes(32));
        $_SESSION['security_token'] = $token;
        return $token;
    }

    // Verifica se a requisição é legítima
    public function validateRequest() {
        // Verifica se o site está sendo carregado em um iframe
        header('X-Frame-Options: DENY');
        
        // Previne XSS
        header('X-XSS-Protection: 1; mode=block');
        
        // Força HTTPS
        if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
            header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
            exit();
        }

        // Verifica domínio permitido
        $current_domain = $_SERVER['HTTP_HOST'];
        $allowed = false;
        foreach (ALLOWED_DOMAINS as $domain) {
            if (strpos($current_domain, $domain) !== false) {
                $allowed = true;
                break;
            }
        }

        if (!$allowed && !$this->isDevelopment()) {
            $this->blockAccess("Acesso não autorizado");
        }

        // Adiciona headers de segurança
        header('Strict-Transport-Security: max-age=31536000; includeSubDomains');
        header('X-Content-Type-Options: nosniff');
        header('Referrer-Policy: strict-origin-when-cross-origin');
        header('Permissions-Policy: geolocation=(), microphone=(), camera=()');
        
        // Define CSP para prevenir injeção de recursos maliciosos
        $csp = "default-src 'self' https: data:; ";
        $csp .= "script-src 'self' 'unsafe-inline' 'unsafe-eval' https://cdn.jsdelivr.net; ";
        $csp .= "style-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net https://cdnjs.cloudflare.com; ";
        $csp .= "img-src 'self' data: https:; ";
        $csp .= "connect-src 'self' https:; ";
        $csp .= "frame-ancestors 'none';";
        header("Content-Security-Policy: " . $csp);
    }

    // Verifica tentativas de login
    public function checkLoginAttempts($ip) {
        if (!isset($_SESSION['login_attempts'])) {
            $_SESSION['login_attempts'] = 0;
            $_SESSION['last_attempt'] = time();
        }

        if ($_SESSION['login_attempts'] >= MAX_LOGIN_ATTEMPTS) {
            $timeout = $_SESSION['last_attempt'] + LOGIN_TIMEOUT;
            if (time() < $timeout) {
                $minutes = ceil(($timeout - time()) / 60);
                $this->blockAccess("Muitas tentativas de login. Tente novamente em {$minutes} minutos.");
            } else {
                $_SESSION['login_attempts'] = 0;
            }
        }
    }

    // Incrementa contador de tentativas de login
    public function incrementLoginAttempts() {
        $_SESSION['login_attempts'] = isset($_SESSION['login_attempts']) ? $_SESSION['login_attempts'] + 1 : 1;
        $_SESSION['last_attempt'] = time();
    }

    // Reseta tentativas de login após sucesso
    public function resetLoginAttempts() {
        $_SESSION['login_attempts'] = 0;
        unset($_SESSION['last_attempt']);
    }

    // Verifica se está em ambiente de desenvolvimento
    private function isDevelopment() {
        return strpos($_SERVER['HTTP_HOST'], 'localhost') !== false || 
               strpos($_SERVER['HTTP_HOST'], '127.0.0.1') !== false;
    }

    // Bloqueia acesso suspeito
    public function blockAccess($message = "Acesso bloqueado por motivos de segurança") {
        http_response_code(403);
        exit($this->getBlockPage($message));
    }

    // Página de bloqueio personalizada
    private function getBlockPage($message) {
        return '<!DOCTYPE html>
        <html lang="pt-BR">
        <head>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>Acesso Bloqueado</title>
            <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
            <style>
                body {
                    background-color: #dc3545;
                    height: 100vh;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    color: white;
                }
                .block-container {
                    text-align: center;
                    padding: 2rem;
                    background-color: rgba(0,0,0,0.2);
                    border-radius: 10px;
                    max-width: 500px;
                }
                .block-icon {
                    font-size: 4rem;
                    margin-bottom: 1rem;
                }
            </style>
        </head>
        <body>
            <div class="block-container">
                <div class="block-icon">⚠️</div>
                <h1>Acesso Bloqueado</h1>
                <p class="lead">' . htmlspecialchars($message) . '</p>
            </div>
        </body>
        </html>';
    }

    // Proteção contra cópia de arquivos
    public function protectFile($file_path) {
        $extension = strtolower(pathinfo($file_path, PATHINFO_EXTENSION));
        $allowed_extensions = ['php', 'html', 'js', 'css'];
        
        if (in_array($extension, $allowed_extensions)) {
            $content = file_get_contents($file_path);
            $encrypted = $this->obfuscateCode($content);
            return $encrypted;
        }
        
        return false;
    }

    // Ofuscação básica de código
    private function obfuscateCode($code) {
        if (strpos($code, '<?php') === 0) {
            // Ofuscação de código PHP
            $code = preg_replace('/\/\*.*?\*\//s', '', $code); // Remove comentários multiline
            $code = preg_replace('/\/\/.*$/m', '', $code);     // Remove comentários inline
            $code = preg_replace('/\s+/', ' ', $code);         // Remove espaços extras
        }
        return $code;
    }
}

// Inicializa a segurança
session_start();
$security = SecurityManager::getInstance();
$security->validateRequest();
