<?php

require_once APP_ROOT . '/models/Setting.php';

class Recaptcha
{
    private static ?Setting $settingModel = null;
    private static ?array $settings = null;

    private static function getSettings(): array
    {
        if (self::$settings === null) {
            self::$settingModel = new Setting();
            self::$settings = [
                'enabled' => self::$settingModel->get('recaptcha_enabled') === '1',
                'site_key' => self::$settingModel->get('recaptcha_site_key') ?: '',
                'secret_key' => self::$settingModel->get('recaptcha_secret_key') ?: ''
            ];
        }
        return self::$settings;
    }

    public static function isEnabled(): bool
    {
        // Quick disable option - uncomment next line to disable reCAPTCHA
        // return false;
        
        $settings = self::getSettings();
        return $settings['enabled'] && !empty($settings['site_key']) && !empty($settings['secret_key']);
    }

    public static function getSiteKey(): string
    {
        $settings = self::getSettings();
        return $settings['site_key'];
    }

    public static function verifyToken(string $token): bool
    {
        if (!self::isEnabled()) {
            return true; // If reCAPTCHA is disabled, always return true
        }

        $settings = self::getSettings();
        $secretKey = $settings['secret_key'];

        error_log('reCAPTCHA Debug: Token received: ' . ($token ? 'Yes' : 'No'));
        error_log('reCAPTCHA Debug: Secret key set: ' . ($secretKey ? 'Yes' : 'No'));

        if (empty($token) || empty($secretKey)) {
            error_log('reCAPTCHA Debug: Missing token or secret key');
            return false;
        }

        $response = file_get_contents('https://www.google.com/recaptcha/api/siteverify', false, stream_context_create([
            'http' => [
                'method' => 'POST',
                'header' => 'Content-Type: application/x-www-form-urlencoded',
                'content' => http_build_query([
                    'secret' => $secretKey,
                    'response' => $token
                ]),
                'timeout' => 10
            ]
        ]));

        if ($response === false) {
            error_log('reCAPTCHA Debug: Failed to get response from Google');
            return false;
        }

        $data = json_decode($response, true);
        error_log('reCAPTCHA Debug: Google response: ' . json_encode($data));
        
        // For V3, check success and score (lower score threshold for testing)
        $success = isset($data['success']) && $data['success'] === true;
        $score = $data['score'] ?? 0;
        
        // For development/testing, accept any score > 0.1
        $scoreValid = $score > 0.1;
        
        error_log('reCAPTCHA Debug: Success: ' . ($success ? 'Yes' : 'No') . ', Score: ' . $score . ', Score Valid: ' . ($scoreValid ? 'Yes' : 'No'));
        
        return $success && $scoreValid;
    }

    public static function renderScript(): string
    {
        if (!self::isEnabled()) {
            return '';
        }

        $siteKey = self::getSiteKey();
        return "<script src=\"https://www.google.com/recaptcha/api.js?render={$siteKey}\" async defer></script>";
    }
    
    public static function renderLazyScript(): string
    {
        if (!self::isEnabled()) {
            return '';
        }

        $siteKey = self::getSiteKey();
        return '
        <script>
        // Lazy load reCAPTCHA only when user interacts with form
        let recaptchaLoaded = false;
        let recaptchaLoading = false;
        
        function loadRecaptcha() {
            if (recaptchaLoaded || recaptchaLoading) return;
            recaptchaLoading = true;
            
            const script = document.createElement("script");
            script.src = "https://www.google.com/recaptcha/api.js?render=' . $siteKey . '";
            script.async = true;
            script.defer = true;
            script.onload = function() {
                recaptchaLoaded = true;
                recaptchaLoading = false;
                console.log("reCAPTCHA loaded successfully");
            };
            script.onerror = function() {
                recaptchaLoading = false;
                console.log("reCAPTCHA failed to load");
            };
            document.head.appendChild(script);
        }
        
        // Load reCAPTCHA when user focuses on any form input
        document.addEventListener("DOMContentLoaded", function() {
            const formInputs = document.querySelectorAll("input[type=text], input[type=email], input[type=password]");
            formInputs.forEach(function(input) {
                input.addEventListener("focus", loadRecaptcha, { once: true });
            });
            
            // Also load when user clicks submit button (fallback)
            const forms = document.querySelectorAll("form");
            forms.forEach(function(form) {
                form.addEventListener("submit", function(e) {
                    if (!recaptchaLoaded) {
                        e.preventDefault();
                        loadRecaptcha();
                        // Retry submission after reCAPTCHA loads
                        setTimeout(function() {
                            if (recaptchaLoaded) {
                                form.submit();
                            }
                        }, 2000);
                    }
                });
            });
        });
        </script>';
    }

    public static function renderHiddenInput(): string
    {
        if (!self::isEnabled()) {
            return '';
        }

        return '<input type="hidden" name="recaptcha_token" id="recaptcha_token">';
    }

    public static function renderJavaScript(): string
    {
        if (!self::isEnabled()) {
            return '';
        }

        $siteKey = self::getSiteKey();
        return '
        <script>
        function executeRecaptcha(callback) {
            if (typeof grecaptcha !== "undefined") {
                grecaptcha.ready(function() {
                    grecaptcha.execute("' . $siteKey . '", {action: "submit"}).then(function(token) {
                        document.getElementById("recaptcha_token").value = token;
                        if (callback) callback();
                    }).catch(function(error) {
                        console.log("reCAPTCHA execution failed:", error);
                        if (callback) callback(); // Continue even if reCAPTCHA fails
                    });
                });
            } else {
                console.log("reCAPTCHA not loaded, continuing without it");
                if (callback) callback(); // Continue if reCAPTCHA not loaded
            }
        }
        
        // Auto-execute when page loads
        document.addEventListener("DOMContentLoaded", function() {
            setTimeout(function() {
                if (typeof grecaptcha !== "undefined") {
                    executeRecaptcha();
                }
            }, 1000);
        });
        </script>';
    }
}
