<?php
/**
 * TESTE COMPLETO DE INTEGRAÇÃO: Simulação de Requisição Completa - Mercado Pago PIX
 * 
 * Este arquivo simula uma requisição completa (hardcoded) como se viesse do frontend,
 * incluindo dados do payer e estrutura de endereço perfeita, para validar se o
 * processamento está funcionando corretamente.
 * 
 * OBJETIVO: Provar que, se os dados chegarem certos do frontend, o Mercado Pago aceita.
 */

// 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");
}

// ============================================================
// SIMULAÇÃO COMPLETA DE DADOS DO FRONTEND (Hardcoded)
// ============================================================

// Dados do pagador (simulando dados_pessoais.php)
$dados_payer = [
    'email' => 'test_user_' . uniqid() . '@test.com',
    'first_name' => 'João',
    'last_name' => 'Silva',
    'full_name' => 'João Silva',
    'cpf' => '12345678909',
    'celular' => '11987654321',
    'identification' => [
        'type' => 'CPF',
        'number' => '12345678909'
    ],
    'phone' => [
        'area_code' => '11',
        'number' => '987654321',
        'country_code' => '+55'
    ]
];

// Endereço completo (simulando estrutura do endereco_json do frontend)
$endereco_array = [
    'cep' => '01310100',           // Apenas números (como vem do JS após replace)
    'rua' => 'Av. Paulista',
    'numero' => '1578',
    'complemento' => 'Sala 10',
    'bairro' => 'Bela Vista',
    'cidade' => 'São Paulo',
    'estado' => 'SP'
];

// Produto (simulando dados do checkout)
$produto = [
    'id' => 1,
    'titulo' => 'Teste - Produto Físico',
    'descricao' => 'Descrição do produto de teste',
    'preco' => 10.00,
    'link_entregavel' => ''
];

// ============================================================
// MONTAR ESTRUTURA EXATA QUE O BACKEND ESPERA
// ============================================================

$external_reference = 'TEST_FULL_' . uniqid();

// Simular o que o frontend envia (estrutura JSON - como vem do checkout.js)
$data_simulado = [
    'transaction_amount' => $produto['preco'],
    'description' => $produto['titulo'],
    'product' => [
        'id' => $produto['id'],
        'title' => $produto['titulo'],
        'description' => $produto['descricao'],
        'price' => $produto['preco'],
        'link_entregavel' => $produto['link_entregavel']
    ],
    'payer' => [
        'email' => $dados_payer['email'],
        'full_name' => $dados_payer['full_name'],
        'first_name' => $dados_payer['first_name'],
        'last_name' => $dados_payer['last_name'],
        'identification' => $dados_payer['identification'],
        'phone' => $dados_payer['phone']
    ],
    'endereco_json' => json_encode($endereco_array), // JSON string como vem do frontend (checkout.js)
    'frete_cobrado' => 0,
    'additional_products' => []
];

// ============================================================
// PROCESSAR COMO O BACKEND PROCESSARIA
// ============================================================

echo "📋 [TESTE] Dados simulados do frontend:\n";
echo "==========================================\n";
echo json_encode($data_simulado, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo "\n\n";

// Processar endereço (como o backend faz)
$safeEnderecoJson = null;
if (isset($data_simulado['endereco_json']) && !empty($data_simulado['endereco_json'])) {
    $endereco_decodificado = json_decode($data_simulado['endereco_json'], true);
    if (json_last_error() === JSON_ERROR_NONE && is_array($endereco_decodificado)) {
        if (!empty($endereco_decodificado['cep']) && !empty($endereco_decodificado['rua']) && 
            !empty($endereco_decodificado['numero']) && !empty($endereco_decodificado['bairro']) && 
            !empty($endereco_decodificado['cidade']) && !empty($endereco_decodificado['estado'])) {
            $safeEnderecoJson = $data_simulado['endereco_json'];
            echo "✅ [TESTE] Endereço validado e processado corretamente\n";
        }
    }
}

if (empty($safeEnderecoJson)) {
    die("❌ [TESTE] Endereço não foi validado corretamente. Verifique a estrutura.\n");
}

// ============================================================
// MONTAR PAYMENTDATA COMO O BACKEND MONTA
// ============================================================

// Separar nome completo
$first_name = $data_simulado['payer']['first_name'];
$last_name = $data_simulado['payer']['last_name'];

// Telefone
$area_code = $data_simulado['payer']['phone']['area_code'];
$phone_number = $data_simulado['payer']['phone']['number'];

// Montar paymentData (como process_payment_pix.php faz)
$paymentData = [
    "transaction_amount" => round((float)$data_simulado['transaction_amount'], 2),
    "description" => $data_simulado['description'],
    "payment_method_id" => "pix",
    "external_reference" => $external_reference,
    "notification_url" => "https://" . ($_SERVER['HTTP_HOST'] ?? 'localhost') . "/backend/webhook.php",
    "payer" => [
        "email" => $data_simulado['payer']['email'],
        "first_name" => $first_name,
        "last_name" => $last_name,
        "phone" => [
            "area_code" => $area_code,
            "number" => $phone_number
        ]
    ]
];

// Adicionar CPF
if (isset($data_simulado['payer']['identification']['number']) && !empty($data_simulado['payer']['identification']['number'])) {
    $paymentData['payer']['identification'] = [
        "type" => $data_simulado['payer']['identification']['type'],
        "number" => preg_replace('/\D/', '', $data_simulado['payer']['identification']['number'])
    ];
}

// Adicionar additional_info -> shipments -> receiver_address
if (!empty($safeEnderecoJson)) {
    $endereco_array_final = json_decode($safeEnderecoJson, true);
    if (json_last_error() === JSON_ERROR_NONE && is_array($endereco_array_final)) {
        // Sanitização rigorosa
        $cep = preg_replace('/[^0-9]/', '', $endereco_array_final['cep'] ?? '');
        $numero = (int) preg_replace('/[^0-9]/', '', $endereco_array_final['numero'] ?? 0);
        if ($numero === 0) $numero = 1;
        
        $produto_id = $data_simulado['product']['id'] ?? 1;
        $produto_nome = $data_simulado['description'] ?? 'Produto';
        $produto_preco = round((float)$data_simulado['transaction_amount'], 2);
        
        // Montar additional_info como o process_payment_pix.php faz (linhas 331-363)
        $paymentData['additional_info'] = [
            'items' => [
                [
                    'id' => (string) $produto_id,
                    'title' => $produto_nome,
                    'quantity' => 1,
                    'unit_price' => $produto_preco
                ]
            ],
            'shipments' => [
                'receiver_address' => [
                    'zip_code' => $cep,
                    'street_name' => $endereco_array_final['rua'] ?? 'Rua não informada',
                    'street_number' => $numero,
                    'city_name' => $endereco_array_final['cidade'] ?? '',
                    'state_name' => strtoupper($endereco_array_final['estado'] ?? ''),
                    'floor' => $endereco_array_final['complemento'] ?? '',
                    'apartment' => ''
                ]
            ]
        ];
        
        echo "✅ [TESTE] additional_info -> shipments -> receiver_address montado\n";
        echo json_encode($paymentData['additional_info'], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
        echo "\n\n";
    }
}

// ============================================================
// EXIBIR PAYMENTDATA COMPLETO
// ============================================================

echo "📋 [TESTE] PaymentData completo montado:\n";
echo "==========================================\n";
echo json_encode($paymentData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo "\n\n";

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

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

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

try {
    // Criar pagamento
    $payment = $client->create($paymentData, $requestOptions);
    
    // Se chegou aqui, funcionou!
    echo "✅ [TESTE] SUCESSO: Pagamento PIX criado com sucesso!\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
    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 completo concluído\n";
echo "==========================================\n";

