<?php
/**
 * TESTE ISOLADO: Validação de Estrutura de Endereço para Produtos Físicos - Mercado Pago
 * 
 * Este arquivo testa a estrutura correta de endereço exigida pelo Mercado Pago
 * para pagamentos de produtos físicos, usando dados hardcoded (fixos).
 * 
 * OBJETIVO: Isolar se o problema é o frontend não enviando os dados ou o backend
 * montando o array errado para o SDK.
 */

// 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;

// Configurar o token de acesso do Mercado Pago
try {
    MercadoPagoConfig::setAccessToken(ACCESS_TOKEN);
    MercadoPagoConfig::setRuntimeEnviroment(MercadoPagoConfig::LOCAL);
    echo "✅ [TESTE] SDK configurado com sucesso\n";
    echo "✅ [TESTE] Access Token: " . substr(ACCESS_TOKEN, 0, 10) . "...\n\n";
} catch (Exception $e) {
    die("❌ [TESTE] Erro na configuração do SDK: " . $e->getMessage() . "\n");
}

// ============================================================
// DADOS HARDCODED PARA TESTE (Produto Físico - R$ 10,00)
// ============================================================

// Dados do pagador
$payer_email = "test_user_" . uniqid() . "@test.com"; // Email único para evitar conflitos
$payer_first_name = "João";
$payer_last_name = "Silva";
$payer_cpf = "12345678909";
$payer_phone_area = "11";
$payer_phone_number = "987654321";

// Dados do endereço de entrega (OBRIGATÓRIO para produtos físicos)
$endereco = [
    "zip_code" => "01001000",        // String, apenas números
    "street_name" => "Av. Paulista",
    "street_number" => 1578,          // Integer
    "city_name" => "São Paulo",
    "state_name" => "SP",
    "floor" => "1",                   // Opcional
    "apartment" => "10"               // Opcional
];

// ============================================================
// MONTAR ARRAY DE PAGAMENTO COM ESTRUTURA CORRETA
// ============================================================

$payment_data = [
    "transaction_amount" => 10.00,
    "description" => "Teste - Produto Físico",
    "payment_method_id" => "pix", // PIX não exige token, permitindo validar estrutura de endereço
    "external_reference" => "TEST_" . uniqid(),
    
    // Dados do pagador
    "payer" => [
        "email" => $payer_email,
        "first_name" => $payer_first_name,
        "last_name" => $payer_last_name,
        "identification" => [
            "type" => "CPF",
            "number" => $payer_cpf
        ],
        "phone" => [
            "area_code" => $payer_phone_area,
            "number" => $payer_phone_number
        ],
        // Endereço do pagador (pode ser o mesmo do receiver_address)
        "address" => [
            "zip_code" => $endereco["zip_code"],
            "street_name" => $endereco["street_name"],
            "street_number" => (string)$endereco["street_number"], // SDK pode exigir string
            "neighborhood" => "Bela Vista", // Adicionar bairro
            "city" => $endereco["city_name"],
            "federal_unit" => $endereco["state_name"]
        ]
    ],
    
    // ESTRUTURA OBRIGATÓRIA PARA PRODUTOS FÍSICOS
    "additional_info" => [
        "shipments" => [
            "receiver_address" => [
                "zip_code" => $endereco["zip_code"],
                "street_name" => $endereco["street_name"],
                "street_number" => (int)$endereco["street_number"], // Integer conforme documentação
                "city_name" => $endereco["city_name"],
                "state_name" => $endereco["state_name"],
                "floor" => $endereco["floor"],
                "apartment" => $endereco["apartment"]
            ]
        ]
    ]
];

// ============================================================
// EXIBIR ESTRUTURA MONTADA (DEBUG)
// ============================================================

echo "📋 [TESTE] Estrutura de pagamento montada:\n";
echo "==========================================\n";
echo json_encode($payment_data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo "\n\n";

// ============================================================
// TENTAR CRIAR PAGAMENTO VIA SDK
// ============================================================

$client = new PaymentClient();
$requestOptions = new RequestOptions();
$idempotencyKey = uniqid('test_', true) . '_' . time();
$requestOptions->setCustomHeaders(["X-Idempotency-Key: {$idempotencyKey}"]);

echo "🔄 [TESTE] Tentando criar pagamento via SDK...\n";
echo "==========================================\n\n";

try {
    // Criar pagamento
    $payment = $client->create($payment_data, $requestOptions);
    
    // Se chegou aqui, funcionou!
    echo "✅ [TESTE] SUCESSO: Estrutura de endereço aceita!\n";
    echo "✅ [TESTE] Payment ID: " . ($payment->id ?? 'N/A') . "\n";
    echo "✅ [TESTE] Status: " . ($payment->status ?? 'N/A') . "\n";
    
    // Para PIX, mostrar dados do QR Code se disponível
    if (isset($payment->point_of_interaction->transaction_data)) {
        $tx_data = $payment->point_of_interaction->transaction_data;
        echo "✅ [TESTE] QR Code: " . ($tx_data->qr_code ?? 'N/A') . "\n";
        echo "✅ [TESTE] QR Code Base64: " . (isset($tx_data->qr_code_base64) ? substr($tx_data->qr_code_base64, 0, 50) . '...' : 'N/A') . "\n";
    }
    
    echo "\n";
    echo "📝 [TESTE] Resposta completa do SDK:\n";
    echo json_encode($payment, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
    
} catch (MPApiException $e) {
    // Erro da API do Mercado Pago
    echo "❌ [TESTE] ERRO na API do Mercado Pago:\n";
    echo "==========================================\n";
    echo "Código HTTP: " . $e->getStatusCode() . "\n";
    echo "Mensagem: " . $e->getMessage() . "\n\n";
    
    // Detalhes completos do erro
    $apiResponse = $e->getApiResponse();
    if ($apiResponse) {
        $content = $apiResponse->getContent();
        echo "📋 [TESTE] Detalhes completos do erro (var_dump):\n";
        echo "==========================================\n";
        var_dump($content);
        echo "\n";
        
        echo "📋 [TESTE] Detalhes completos do erro (JSON):\n";
        echo "==========================================\n";
        echo json_encode($content, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
        echo "\n";
        
        // Tentar identificar campos faltando
        if (isset($content['message'])) {
            echo "🔍 [TESTE] Mensagem de erro: " . $content['message'] . "\n";
        }
        if (isset($content['cause'])) {
            echo "🔍 [TESTE] Causa do erro:\n";
            foreach ($content['cause'] as $cause) {
                if (isset($cause['code']) && isset($cause['description'])) {
                    echo "   - Código: " . $cause['code'] . " | Descrição: " . $cause['description'] . "\n";
                }
            }
        }
    } else {
        echo "⚠️ [TESTE] Não foi possível obter detalhes da resposta da API\n";
    }
    
} catch (Exception $e) {
    // Erro geral
    echo "❌ [TESTE] ERRO GERAL:\n";
    echo "==========================================\n";
    echo "Mensagem: " . $e->getMessage() . "\n";
    echo "Arquivo: " . $e->getFile() . "\n";
    echo "Linha: " . $e->getLine() . "\n";
    echo "\n";
    echo "Stack Trace:\n";
    echo $e->getTraceAsString() . "\n";
}

echo "\n";
echo "==========================================\n";
echo "✅ [TESTE] Teste concluído\n";
echo "==========================================\n";

