<?php
/**
 * DIAGNÓSTICO: Teste Específico para Erro "payment methods inference error"
 * Este arquivo testa e mostra a causa raiz do erro de inferência de método de pagamento
 */

declare(strict_types=1);

// Configuração de logs
ini_set('display_errors', 1);
ini_set('log_errors', 1);
error_reporting(E_ALL);

// Headers para permitir acesso
header('Content-Type: text/html; charset=utf-8');

// Autoload do Composer
require __DIR__ . '/../vendor/autoload.php';

// Importa o arquivo com o access token
require __DIR__ . '/../config/token.php';

// Imports do SDK v3.5+
use MercadoPago\Client\Payment\PaymentClient;
use MercadoPago\Client\Common\RequestOptions;
use MercadoPago\MercadoPagoConfig;
use MercadoPago\Exceptions\MPApiException;

?>
<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Diagnóstico: payment methods inference error</title>
    <style>
        body {
            font-family: 'Courier New', monospace;
            padding: 20px;
            background: #1e1e1e;
            color: #fff;
        }
        .container {
            max-width: 1400px;
            margin: 0 auto;
        }
        h1 {
            color: #f44336;
            border-bottom: 2px solid #f44336;
            padding-bottom: 10px;
        }
        h2 {
            color: #2196F3;
            margin-top: 30px;
        }
        h3 {
            color: #ff9800;
            margin-top: 20px;
        }
        .section {
            background: #2d2d2d;
            padding: 20px;
            border-radius: 8px;
            margin: 20px 0;
            border-left: 4px solid #4CAF50;
        }
        .error {
            border-left-color: #f44336;
            background: #3d2d2d;
        }
        .warning {
            border-left-color: #ff9800;
            background: #3d3d2d;
        }
        .info {
            border-left-color: #2196F3;
            background: #2d2d3d;
        }
        pre {
            background: #1e1e1e;
            padding: 15px;
            border-radius: 5px;
            overflow-x: auto;
            border: 1px solid #444;
            font-size: 12px;
            line-height: 1.4;
        }
        .success {
            color: #4CAF50;
        }
        .error-text {
            color: #f44336;
            font-weight: bold;
        }
        .info-text {
            color: #2196F3;
        }
        .warning-text {
            color: #ff9800;
        }
        code {
            background: #1e1e1e;
            padding: 2px 6px;
            border-radius: 3px;
            color: #4CAF50;
        }
        ul {
            line-height: 1.8;
        }
        li {
            margin: 8px 0;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>🔍 Diagnóstico: Erro "payment methods inference error"</h1>
        
        <?php
        // Configurar o token de acesso do Mercado Pago
        try {
            MercadoPagoConfig::setAccessToken(ACCESS_TOKEN);
            MercadoPagoConfig::setRuntimeEnviroment(MercadoPagoConfig::LOCAL);
            
            echo '<div class="section success">';
            echo '<h2>✅ Configuração</h2>';
            echo '<p>Token configurado com sucesso</p>';
            echo '<p><strong>Token (primeiros 10 caracteres):</strong> ' . substr(ACCESS_TOKEN, 0, 10) . '***</p>';
            echo '</div>';
        } catch (Exception $e) {
            echo '<div class="section error">';
            echo '<h2>❌ Erro na Configuração</h2>';
            echo '<p class="error-text">' . htmlspecialchars($e->getMessage()) . '</p>';
            echo '</div>';
            exit;
        }
        
        // ============================================================
        // TESTE 1: Estrutura Mínima (SEM endereço)
        // ============================================================
        echo '<div class="section info">';
        echo '<h2>📦 Teste 1: Estrutura Mínima (Sem Endereço)</h2>';
        echo '<p class="info-text">Este teste verifica se o erro ocorre com a estrutura mínima obrigatória.</p>';
        
        $testDataMinimo = [
            'transaction_amount' => 100.00,
            'description' => 'Teste Diagnóstico - Estrutura Mínima',
            'payment_method_id' => 'visa',
            'token' => 'CARD_TOKEN_TEST', // Token de teste (será rejeitado, mas mostra a estrutura)
            'installments' => 1,
            'payer' => [
                'email' => 'test@example.com',
                'first_name' => 'Teste',
                'last_name' => 'Diagnóstico',
                'identification' => [
                    'type' => 'CPF',
                    'number' => '12345678909'
                ],
                'phone' => [
                    'area_code' => '11',
                    'number' => '987654321'
                ]
            ],
            'external_reference' => 'test_min_' . time(),
            'notification_url' => 'https://' . $_SERVER['HTTP_HOST'] . '/backend/webhook.php'
        ];
        
        echo '<h3>Payload Enviado:</h3>';
        echo '<pre>' . json_encode($testDataMinimo, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . '</pre>';
        
        try {
            $client = new PaymentClient();
            $requestOptions = new RequestOptions();
            $idempotencyKey = 'test_min_' . time();
            $requestOptions->setCustomHeaders(["X-Idempotency-Key: {$idempotencyKey}"]);
            
            $payment = $client->create($testDataMinimo, $requestOptions);
            
            echo '<p class="success">✅ SUCESSO! (Mas isso não deveria acontecer com token inválido)</p>';
            
        } catch (MPApiException $e) {
            echo '<h3>❌ Erro Capturado:</h3>';
            echo '<p class="error-text"><strong>Mensagem:</strong> ' . htmlspecialchars($e->getMessage()) . '</p>';
            echo '<p><strong>Status Code:</strong> ' . ($e->getStatusCode() ?? 'N/A') . '</p>';
            
            $apiResponse = null;
            if (method_exists($e, 'getApiResponse')) {
                try {
                    $mpResponse = $e->getApiResponse();
                    if (method_exists($mpResponse, 'getContent')) {
                        $apiResponse = $mpResponse->getContent();
                        echo '<h3>Resposta Completa da API:</h3>';
                        echo '<pre>' . json_encode($apiResponse, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . '</pre>';
                        
                        // Analisar se é o erro "payment methods inference error"
                        if (is_array($apiResponse)) {
                            $isInferenceError = false;
                            if (isset($apiResponse['message']) && stripos($apiResponse['message'], 'inference') !== false) {
                                $isInferenceError = true;
                            }
                            if (isset($apiResponse['cause']) && is_array($apiResponse['cause'])) {
                                foreach ($apiResponse['cause'] as $cause) {
                                    if (isset($cause['description']) && stripos($cause['description'], 'inference') !== false) {
                                        $isInferenceError = true;
                                    }
                                }
                            }
                            
                            if ($isInferenceError) {
                                echo '<div class="warning" style="margin-top: 20px; padding: 15px;">';
                                echo '<h3 class="warning-text">⚠️ ERRO DE INFERÊNCIA DETECTADO</h3>';
                                echo '<p><strong>Possíveis Causas:</strong></p>';
                                echo '<ul>';
                                echo '<li>Token do cartão inválido ou expirado</li>';
                                echo '<li><code>payment_method_id</code> não corresponde ao tipo de cartão no token</li>';
                                echo '<li>Token gerado incorretamente no frontend</li>';
                                echo '<li>Dados do cartão incompatíveis com o método de pagamento</li>';
                                echo '</ul>';
                                echo '</div>';
                            }
                        }
                    }
                } catch (Exception $ex) {
                    echo '<p class="error-text">Erro ao obter conteúdo: ' . htmlspecialchars($ex->getMessage()) . '</p>';
                }
            }
        } catch (Exception $e) {
            echo '<p class="error-text">Erro geral: ' . htmlspecialchars($e->getMessage()) . '</p>';
        }
        
        echo '</div>';
        
        // ============================================================
        // TESTE 2: Com Endereço (Estrutura Completa)
        // ============================================================
        echo '<div class="section info">';
        echo '<h2>📦 Teste 2: Estrutura Completa (Com Endereço - Produto Físico)</h2>';
        echo '<p class="info-text">Este teste verifica se o erro ocorre com a estrutura completa incluindo endereço.</p>';
        
        $testDataCompleto = $testDataMinimo;
        $testDataCompleto['description'] = 'Teste Diagnóstico - Estrutura Completa';
        $testDataCompleto['external_reference'] = 'test_completo_' . time();
        $testDataCompleto['additional_info'] = [
            'items' => [
                [
                    'id' => '1',
                    'title' => 'Produto Teste',
                    'quantity' => 1,
                    'unit_price' => 100.00
                ]
            ],
            'shipments' => [
                'receiver_address' => [
                    'zip_code' => '01310100',
                    'street_name' => 'Avenida Paulista',
                    'street_number' => '1000',
                    'city_name' => 'São Paulo',
                    'state_name' => 'SP'
                ]
            ]
        ];
        
        echo '<h3>Payload Enviado:</h3>';
        echo '<pre>' . json_encode($testDataCompleto, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . '</pre>';
        
        try {
            $client = new PaymentClient();
            $requestOptions = new RequestOptions();
            $idempotencyKey = 'test_completo_' . time();
            $requestOptions->setCustomHeaders(["X-Idempotency-Key: {$idempotencyKey}"]);
            
            $payment = $client->create($testDataCompleto, $requestOptions);
            
            echo '<p class="success">✅ SUCESSO! (Mas isso não deveria acontecer com token inválido)</p>';
            
        } catch (MPApiException $e) {
            echo '<h3>❌ Erro Capturado:</h3>';
            echo '<p class="error-text"><strong>Mensagem:</strong> ' . htmlspecialchars($e->getMessage()) . '</p>';
            echo '<p><strong>Status Code:</strong> ' . ($e->getStatusCode() ?? 'N/A') . '</p>';
            
            $apiResponse = null;
            if (method_exists($e, 'getApiResponse')) {
                try {
                    $mpResponse = $e->getApiResponse();
                    if (method_exists($mpResponse, 'getContent')) {
                        $apiResponse = $mpResponse->getContent();
                        echo '<h3>Resposta Completa da API:</h3>';
                        echo '<pre>' . json_encode($apiResponse, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . '</pre>';
                        
                        // Extrair informações detalhadas
                        if (is_array($apiResponse)) {
                            if (isset($apiResponse['cause']) && is_array($apiResponse['cause'])) {
                                echo '<h3>Causas do Erro:</h3>';
                                echo '<ul>';
                                foreach ($apiResponse['cause'] as $cause) {
                                    if (isset($cause['code'])) {
                                        echo '<li><strong>Código:</strong> <code>' . htmlspecialchars((string)$cause['code']) . '</code></li>';
                                    }
                                    if (isset($cause['description'])) {
                                        echo '<li><strong>Descrição:</strong> ' . htmlspecialchars($cause['description']) . '</li>';
                                    }
                                    if (isset($cause['data'])) {
                                        echo '<li><strong>Data:</strong> <code>' . htmlspecialchars($cause['data']) . '</code></li>';
                                    }
                                }
                                echo '</ul>';
                            }
                            
                            if (isset($apiResponse['message'])) {
                                echo '<h3>Mensagem Principal:</h3>';
                                echo '<p class="error-text"><code>' . htmlspecialchars($apiResponse['message']) . '</code></p>';
                            }
                        }
                    }
                } catch (Exception $ex) {
                    echo '<p class="error-text">Erro ao obter conteúdo: ' . htmlspecialchars($ex->getMessage()) . '</p>';
                }
            }
        } catch (Exception $e) {
            echo '<p class="error-text">Erro geral: ' . htmlspecialchars($e->getMessage()) . '</p>';
        }
        
        echo '</div>';
        
        // ============================================================
        // ANÁLISE E RECOMENDAÇÕES
        // ============================================================
        echo '<div class="section warning">';
        echo '<h2>💡 Análise do Erro "payment methods inference error"</h2>';
        echo '<p class="warning-text"><strong>Este erro geralmente indica:</strong></p>';
        echo '<ul>';
        echo '<li><strong>Token inválido:</strong> O token do cartão foi gerado incorretamente ou está expirado</li>';
        echo '<li><strong>Incompatibilidade payment_method_id:</strong> O <code>payment_method_id</code> não corresponde ao tipo de cartão no token</li>';
        echo '<li><strong>Dados do cartão:</strong> Os dados do cartão no token não são compatíveis com o método de pagamento</li>';
        echo '<li><strong>SDK/Frontend:</strong> Problema na geração do token no frontend (Mercado Pago SDK)</li>';
        echo '</ul>';
        
        echo '<h3>🔧 Soluções Recomendadas:</h3>';
        echo '<ol>';
        echo '<li><strong>Verificar o token no frontend:</strong> Certifique-se de que o token está sendo gerado corretamente pelo SDK do Mercado Pago</li>';
        echo '<li><strong>Verificar payment_method_id:</strong> O <code>payment_method_id</code> deve corresponder ao tipo de cartão (visa, master, amex, etc.)</li>';
        echo '<li><strong>Validar dados do cartão:</strong> Verifique se os dados do cartão estão sendo capturados corretamente</li>';
        echo '<li><strong>Logs do frontend:</strong> Verifique os logs do console do navegador para ver se há erros na geração do token</li>';
        echo '<li><strong>SDK atualizado:</strong> Certifique-se de que o SDK do Mercado Pago está atualizado no frontend</li>';
        echo '</ol>';
        echo '</div>';
        
        // ============================================================
        // VERIFICAÇÕES ADICIONAIS
        // ============================================================
        echo '<div class="section info">';
        echo '<h2>🔍 Verificações Adicionais</h2>';
        echo '<ul>';
        echo '<li><strong>PHP Version:</strong> ' . phpversion() . '</li>';
        echo '<li><strong>Servidor:</strong> ' . ($_SERVER['SERVER_SOFTWARE'] ?? 'N/A') . '</li>';
        echo '<li><strong>Host:</strong> ' . ($_SERVER['HTTP_HOST'] ?? 'N/A') . '</li>';
        echo '<li><strong>Data/Hora:</strong> ' . date('Y-m-d H:i:s') . '</li>';
        echo '<li><strong>Token MP (primeiros 10 chars):</strong> ' . substr(ACCESS_TOKEN, 0, 10) . '***</li>';
        echo '</ul>';
        echo '</div>';
        ?>
        
    </div>
</body>
</html>

