<?php
/**
 * DIAGNÓSTICO COMPLETO: Problemas de Endereço em Produtos Físicos
 * 
 * Este arquivo realiza um diagnóstico profundo dos problemas de captura
 * e processamento de endereço para produtos físicos no checkout.
 * 
 * OBJETIVOS:
 * 1. Verificar estrutura de dados esperada pelo backend
 * 2. Simular requisição completa do frontend
 * 3. Testar processamento de endereço
 * 4. Validar estrutura enviada ao Mercado Pago
 * 5. Identificar pontos de falha
 */

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

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

// Conexão com o banco de dados
require __DIR__ . '/../config/config_db.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 "✅ [DIAGNÓSTICO] SDK configurado com sucesso\n";
} catch (Exception $e) {
    die("❌ [DIAGNÓSTICO] Erro na configuração do SDK: " . $e->getMessage() . "\n");
}

echo "\n";
echo "==========================================\n";
echo "DIAGNÓSTICO COMPLETO: ENDEREÇO PRODUTOS FÍSICOS\n";
echo "==========================================\n\n";

// ============================================================
// ETAPA 1: SIMULAR DADOS DO FRONTEND (Como vem do checkout.js)
// ============================================================

echo "📋 ETAPA 1: Simulando dados do frontend\n";
echo "------------------------------------------\n";

// Dados do pagador (simulando getDadosPagador())
$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 getEnderecoEntrega() - estrutura retornada)
$endereco_js = [
    'cep' => '01310100',           // Apenas números (após replace(/\D/g, ''))
    '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' => ''
];

// Estrutura completa que o frontend envia (como process_payment_pix.php espera)
$data_frontend = [
    '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_js), // JSON string como vem do frontend
    'frete_cobrado' => 0,
    'additional_products' => []
];

echo "✅ Dados do frontend simulados:\n";
echo json_encode($data_frontend, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo "\n\n";

// ============================================================
// ETAPA 2: PROCESSAR COMO O BACKEND PROCESSARIA
// ============================================================

echo "📋 ETAPA 2: Processando como o backend processaria\n";
echo "------------------------------------------\n";

// Simular processamento de endereço (como process_payment_pix.php faz - linhas 178-188)
$safeEnderecoJson = null;
$safeFreteCobrado = 0;
$safeStatusEntrega = null;

if (isset($data_frontend['endereco_json']) && !empty($data_frontend['endereco_json'])) {
    $endereco_array = json_decode($data_frontend['endereco_json'], true);
    
    echo "🔍 Validando JSON do endereço...\n";
    echo "   - JSON válido: " . (json_last_error() === JSON_ERROR_NONE ? 'SIM' : 'NÃO') . "\n";
    echo "   - É array: " . (is_array($endereco_array) ? 'SIM' : 'NÃO') . "\n";
    
    if (json_last_error() === JSON_ERROR_NONE && is_array($endereco_array)) {
        echo "   - Campos presentes:\n";
        echo "     * cep: " . (isset($endereco_array['cep']) ? $endereco_array['cep'] : 'AUSENTE') . "\n";
        echo "     * rua: " . (isset($endereco_array['rua']) ? $endereco_array['rua'] : 'AUSENTE') . "\n";
        echo "     * numero: " . (isset($endereco_array['numero']) ? $endereco_array['numero'] : 'AUSENTE') . "\n";
        echo "     * bairro: " . (isset($endereco_array['bairro']) ? $endereco_array['bairro'] : 'AUSENTE') . "\n";
        echo "     * cidade: " . (isset($endereco_array['cidade']) ? $endereco_array['cidade'] : 'AUSENTE') . "\n";
        echo "     * estado: " . (isset($endereco_array['estado']) ? $endereco_array['estado'] : 'AUSENTE') . "\n";
        
        // Validação exata como no backend (linha 181-183)
        if (!empty($endereco_array['cep']) && !empty($endereco_array['rua']) && 
            !empty($endereco_array['numero']) && !empty($endereco_array['bairro']) && 
            !empty($endereco_array['cidade']) && !empty($endereco_array['estado'])) {
            $safeEnderecoJson = $data_frontend['endereco_json'];
            $safeStatusEntrega = 'preparando';
            echo "   ✅ Endereço validado com sucesso!\n";
        } else {
            echo "   ❌ Endereço não passou na validação (campos obrigatórios faltando)\n";
        }
    } else {
        echo "   ❌ Erro ao decodificar JSON ou não é array\n";
    }
} else {
    echo "   ❌ endereco_json não está presente ou está vazio\n";
}

if (empty($safeEnderecoJson)) {
    echo "\n❌ [ERRO CRÍTICO] Endereço não foi validado. Verifique a estrutura.\n";
    echo "   Estrutura esperada:\n";
    echo "   {\n";
    echo "     \"cep\": \"01310100\",\n";
    echo "     \"rua\": \"Av. Paulista\",\n";
    echo "     \"numero\": \"1578\",\n";
    echo "     \"bairro\": \"Bela Vista\",\n";
    echo "     \"cidade\": \"São Paulo\",\n";
    echo "     \"estado\": \"SP\"\n";
    echo "   }\n";
    die("\n");
}

echo "\n";

// ============================================================
// ETAPA 3: MONTAR PAYMENTDATA COMO O BACKEND MONTA
// ============================================================

echo "📋 ETAPA 3: Montando paymentData como o backend monta\n";
echo "------------------------------------------\n";

// Separar nome completo (como process_payment_pix.php faz - linhas 119-122)
$full_name = isset($data_frontend['payer']['full_name']) ? $data_frontend['payer']['full_name'] : '';
$name_parts = explode(' ', trim($full_name));
$first_name = array_shift($name_parts);
$last_name = implode(' ', $name_parts);

// Telefone (como process_payment_pix.php faz - linhas 128-131)
$country_code = isset($data_frontend['payer']['phone']['country_code']) ? $data_frontend['payer']['phone']['country_code'] : '';
$area_code = isset($data_frontend['payer']['phone']['area_code']) ? $data_frontend['payer']['phone']['area_code'] : '';
$phone_number = $data_frontend['payer']['phone']['number'];

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

// Adicionar CPF (como process_payment_pix.php faz - linhas 252-257)
if (isset($data_frontend['payer']['identification']['number']) && !empty($data_frontend['payer']['identification']['number'])) {
    $paymentData['payer']['identification'] = [
        "type" => $data_frontend['payer']['identification']['type'],
        "number" => preg_replace('/\D/', '', $data_frontend['payer']['identification']['number'])
    ];
}

echo "✅ PaymentData base montado:\n";
echo json_encode($paymentData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo "\n\n";

// ============================================================
// ETAPA 4: ADICIONAR ADDITIONAL_INFO -> SHIPMENTS
// ============================================================

echo "📋 ETAPA 4: Adicionando additional_info -> shipments\n";
echo "------------------------------------------\n";

// Processar endereço para shipments (como process_payment_pix.php faz - linhas 331-368)
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 (como process_payment_pix.php faz - linhas 335-337)
        $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;
        
        echo "🔍 Sanitização dos dados:\n";
        echo "   - CEP original: " . ($endereco_array_final['cep'] ?? 'N/A') . " -> CEP limpo: $cep\n";
        echo "   - Número original: " . ($endereco_array_final['numero'] ?? 'N/A') . " -> Número (int): $numero\n";
        
        // Buscar informações do produto para items
        $produto_id = $data_frontend['product']['id'] ?? 1;
        $produto_nome = $data_frontend['description'] ?? 'Produto';
        $produto_preco = round((float)$data_frontend['transaction_amount'], 2);
        
        // Montar estrutura additional_info -> shipments -> receiver_address
        $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 "✅ additional_info montado:\n";
        echo json_encode($paymentData['additional_info'], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
        echo "\n\n";
    } else {
        echo "❌ Erro ao decodificar endereco_json para shipments\n";
    }
} else {
    echo "❌ safeEnderecoJson está vazio, não foi possível montar shipments\n";
}

// ============================================================
// ETAPA 5: EXIBIR PAYMENTDATA COMPLETO
// ============================================================

echo "📋 ETAPA 5: PaymentData completo\n";
echo "------------------------------------------\n";
echo json_encode($paymentData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo "\n\n";

// ============================================================
// ETAPA 6: VALIDAR ESTRUTURA COM MERCADO PAGO
// ============================================================

echo "📋 ETAPA 6: Validando estrutura com Mercado Pago\n";
echo "------------------------------------------\n";

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

echo "🔄 Tentando criar pagamento PIX via SDK...\n\n";

try {
    // Criar pagamento
    $payment = $client->create($paymentData, $requestOptions);
    
    // Se chegou aqui, funcionou!
    echo "✅ [SUCESSO] Pagamento PIX criado com sucesso!\n";
    echo "   - Payment ID: " . ($payment->id ?? 'N/A') . "\n";
    echo "   - 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 "   - QR Code: " . ($tx_data->qr_code ?? 'N/A') . "\n";
        echo "   - QR Code Base64: " . (isset($tx_data->qr_code_base64) ? substr($tx_data->qr_code_base64, 0, 50) . '...' : 'N/A') . "\n";
    }
    
    echo "\n✅ [CONCLUSÃO] A estrutura de endereço está CORRETA!\n";
    echo "   O problema está na captura dos dados no frontend ou na detecção de aba.\n";
    
} catch (MPApiException $e) {
    // Erro da API do Mercado Pago
    echo "❌ [ERRO] API do Mercado Pago rejeitou a requisição:\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 "📋 Detalhes completos do erro:\n";
        echo json_encode($content, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
        echo "\n";
        
        // Tentar identificar campos faltando
        if (isset($content['message'])) {
            echo "🔍 Mensagem de erro: " . $content['message'] . "\n";
        }
        if (isset($content['cause'])) {
            echo "🔍 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";
                }
            }
        }
    }
    
    echo "\n❌ [CONCLUSÃO] A estrutura de endereço está INCORRETA!\n";
    echo "   Verifique os campos acima e corrija a estrutura.\n";
    
} catch (Exception $e) {
    // Erro geral
    echo "❌ [ERRO GERAL]:\n";
    echo "   - Mensagem: " . $e->getMessage() . "\n";
    echo "   - Arquivo: " . $e->getFile() . "\n";
    echo "   - Linha: " . $e->getLine() . "\n";
}

echo "\n";
echo "==========================================\n";
echo "DIAGNÓSTICO CONCLUÍDO\n";
echo "==========================================\n";



