<?php
/**
 * TESTE DE ENDPOINTS VIA cURL
 * Este script testa cada endpoint enviando dados simulados e captura os erros reais
 * 
 * Execute via linha de comando: php teste_endpoints_curl.php
 * Ou acesse via navegador: http://seudominio.com/backend/teste_endpoints_curl.php
 */

// Ativar exibição de erros
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// Header HTML se executado via navegador
if (php_sapi_name() !== 'cli') {
    header('Content-Type: text/html; charset=utf-8');
    echo '<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Teste Endpoints cURL</title>';
    echo '<style>body{font-family:monospace;padding:20px;background:#f5f5f5;}pre{background:#2d2d2d;color:#f8f8f2;padding:15px;border-radius:5px;overflow-x:auto;}</style></head><body>';
    echo '<h1>🔍 Teste de Endpoints via cURL</h1>';
}

// Base URL (ajuste conforme necessário)
// Detectar se está em HTTPS ou HTTP
$isHttps = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') 
    || (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https')
    || (!empty($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] === 'on')
    || (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443);

$protocol = $isHttps ? 'https' : 'https'; // Forçar HTTPS pois o servidor redireciona

// Detectar domínio automaticamente
if (php_sapi_name() === 'cli') {
    // Se executado via CLI, usar domínio fixo (ajuste conforme necessário)
    $baseUrl = 'https://gestor.click';
} else {
    // Se executado via navegador, detectar automaticamente
    $host = $_SERVER['HTTP_HOST'] ?? 'gestor.click';
    $baseUrl = $protocol . '://' . $host;
}

// Remover /backend se já estiver na URL
$baseUrl = str_replace('/backend', '', $baseUrl);

// Dados de teste simulados
$testData = [
    'transaction_amount' => 100.00,
    'description' => 'Produto Teste',
    'link_entregavel' => 'https://exemplo.com/produto',
    'product' => [
        'id' => 1,
        'title' => 'Produto Teste',
        'description' => 'Descrição do produto teste',
        'price' => 100.00
    ],
    'payer' => [
        'email' => 'teste@teste.com',
        'first_name' => 'João',
        'last_name' => 'Silva',
        'full_name' => 'João Silva',
        'identification' => [
            'type' => 'CPF',
            'number' => '12345678909'
        ],
        'phone' => [
            'country_code' => '55',
            'area_code' => '11',
            'number' => '987654321'
        ]
    ],
    'token' => 'test_token_12345', // Para cartão
    'payment_method_id' => 'visa',
    'installments' => 1,
    'issuer' => 1,
    'device_id' => 'test_device_123',
    'client_ip' => '127.0.0.1'
];

// Endpoints para testar
$endpoints = [
    'process_payment.php' => [
        'name' => 'Cartão de Crédito',
        'data' => array_merge($testData, [
            'token' => 'test_token_12345',
            'payment_method_id' => 'visa',
            'installments' => 1
        ])
    ],
    'process_payment_pix.php' => [
        'name' => 'PIX',
        'data' => $testData
    ],
    'process_payment_boleto_mercadopago.php' => [
        'name' => 'Boleto',
        'data' => $testData
    ]
];

echo "\n" . str_repeat('=', 80) . "\n";
echo "TESTE DE ENDPOINTS - " . date('d/m/Y H:i:s') . "\n";
echo str_repeat('=', 80) . "\n\n";

foreach ($endpoints as $endpoint => $config) {
    echo "\n" . str_repeat('-', 80) . "\n";
    echo "📄 TESTANDO: {$config['name']} ({$endpoint})\n";
    echo str_repeat('-', 80) . "\n\n";
    
    $url = $baseUrl . '/backend/' . $endpoint;
    echo "URL: {$url}\n";
    echo "Método: POST\n";
    echo "Content-Type: application/json\n\n";
    
    // Preparar dados JSON
    $jsonData = json_encode($config['data'], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
    echo "Dados enviados:\n";
    echo substr($jsonData, 0, 500) . (strlen($jsonData) > 500 ? '...' : '') . "\n\n";
    
    // Garantir que a URL use HTTPS se o servidor redirecionar
    if (strpos($url, 'http://') === 0) {
        $url = str_replace('http://', 'https://', $url);
        echo "⚠️  URL corrigida para HTTPS: {$url}\n\n";
    }
    
    // Inicializar cURL
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => $jsonData,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => [
            'Content-Type: application/json',
            'Content-Length: ' . strlen($jsonData)
        ],
        CURLOPT_TIMEOUT => 30,
        CURLOPT_CONNECTTIMEOUT => 10,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_SSL_VERIFYHOST => false,
        CURLOPT_VERBOSE => false,
        CURLOPT_HEADER => true,
        CURLOPT_FOLLOWLOCATION => true,  // Seguir redirecionamentos
        CURLOPT_MAXREDIRS => 5,          // Máximo de 5 redirecionamentos
        CURLOPT_AUTOREFERER => true,     // Enviar referer em redirecionamentos
        CURLOPT_POSTREDIR => 3           // Manter método POST em redirecionamentos 301/302
    ]);
    
    // Executar requisição
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
    $error = curl_error($ch);
    curl_close($ch);
    
    // Separar headers e body
    $headers = substr($response, 0, $headerSize);
    $body = substr($response, $headerSize);
    
    // Exibir resultado
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
    echo "RESULTADO:\n";
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
    echo "HTTP Status Code: {$httpCode}\n";
    
    if ($error) {
        echo "❌ ERRO cURL: {$error}\n";
    }
    
    // Verificar se houve redirecionamento
    if ($httpCode == 301 || $httpCode == 302 || $httpCode == 307 || $httpCode == 308) {
        echo "⚠️  REDIRECIONAMENTO DETECTADO (HTTP {$httpCode})\n";
        if (preg_match('/Location:\s*(https?:\/\/[^\r\n]+)/i', $headers, $matches)) {
            echo "   Redirecionando para: {$matches[1]}\n";
            echo "   ⚠️  O script deve seguir redirecionamentos automaticamente.\n";
            echo "   Se este erro persistir, verifique se CURLOPT_FOLLOWLOCATION está habilitado.\n";
        }
    } elseif ($httpCode >= 200 && $httpCode < 300) {
        echo "✅ Status: OK\n";
    } elseif ($httpCode >= 400 && $httpCode < 500) {
        echo "⚠️  Status: Erro do Cliente (4xx)\n";
    } elseif ($httpCode >= 500) {
        echo "❌ Status: Erro do Servidor (5xx)\n";
    }
    
    echo "\nHeaders recebidos:\n";
    echo substr($headers, 0, 500) . (strlen($headers) > 500 ? '...' : '') . "\n";
    
    echo "\nBody recebido:\n";
    // Tentar decodificar JSON para exibir formatado
    $decoded = json_decode($body, true);
    if (json_last_error() === JSON_ERROR_NONE) {
        echo json_encode($decoded, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n";
    } else {
        echo $body . "\n";
        if (!empty($body)) {
            echo "\n⚠️  Resposta não é JSON válido. Possível erro PHP fatal.\n";
        }
    }
    
    // Análise do erro
    if ($httpCode === 500) {
        echo "\n🔍 ANÁLISE DO ERRO 500:\n";
        echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
        
        // Verificar se há mensagem de erro no body
        if (strpos($body, 'Fatal error') !== false || strpos($body, 'Parse error') !== false) {
            echo "❌ Erro PHP Fatal/Parse detectado na resposta\n";
            // Extrair linha do erro se possível
            if (preg_match('/on line (\d+)/', $body, $matches)) {
                echo "   Linha do erro: {$matches[1]}\n";
            }
        }
        
        if (strpos($body, 'Call to undefined') !== false) {
            echo "❌ Função ou classe não definida\n";
        }
        
        if (strpos($body, 'require') !== false || strpos($body, 'include') !== false) {
            echo "❌ Erro ao incluir/requerer arquivo\n";
        }
        
        if (strpos($body, 'Access denied') !== false || strpos($body, 'Permission denied') !== false) {
            echo "❌ Problema de permissão de arquivo\n";
        }
        
        // Verificar se retornou JSON de erro
        $errorJson = json_decode($body, true);
        if ($errorJson && isset($errorJson['status']) && $errorJson['status'] === 'error') {
            echo "✅ Endpoint retornou JSON de erro (tratamento funcionando)\n";
            echo "   Mensagem: " . ($errorJson['message'] ?? 'N/A') . "\n";
        } else {
            echo "⚠️  Endpoint não retornou JSON válido (possível erro fatal não tratado)\n";
        }
    }
    
    echo "\n";
}

echo "\n" . str_repeat('=', 80) . "\n";
echo "TESTE CONCLUÍDO\n";
echo str_repeat('=', 80) . "\n";

if (php_sapi_name() !== 'cli') {
    echo '</body></html>';
}

