<?php
/**
 * Backend PIX - Versão Simples Atualizada para SDK v3.5+
 * Mantém a lógica original, apenas atualiza para nova versão do SDK
 */

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

// Conexão com o banco de dados
require __DIR__ . '/../config/config_db.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;

// Tratamento global de erros
set_error_handler(function($errno, $errstr, $errfile, $errline) {
    error_log("Erro em process_payment_pix.php: [$errno] $errstr em $errfile:$errline");
    return false;
});

// Defina o cabeçalho da resposta como JSON
header('Content-Type: application/json; charset=utf-8');

// Garantir que sempre retorne JSON, mesmo em caso de erro fatal
register_shutdown_function(function() {
    $error = error_get_last();
    if ($error !== NULL && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) {
        http_response_code(500);
        echo json_encode([
            'status' => 'error',
            'message' => 'Erro interno do servidor. Por favor, tente novamente.'
        ]);
    }
});

// Configurar o token de acesso do Mercado Pago (Nova forma v3)
try {
    MercadoPagoConfig::setAccessToken(ACCESS_TOKEN);
    MercadoPagoConfig::setRuntimeEnviroment(MercadoPagoConfig::LOCAL);
} catch (Exception $e) {
    echo json_encode(['status' => 'error', 'message' => 'Erro na configuração do SDK: ' . $e->getMessage()]);
    exit;
}

try {
    // Recebe os dados enviados pelo front-end (JSON)
    $raw_input = file_get_contents('php://input');
    $data = json_decode($raw_input, true);
    
    // ============================================================
    // DEBUG TEMPORÁRIO: Log do payload recebido do frontend
    // ============================================================
    $debug_log = "=== DEBUG PIX ADDRESS PAYLOAD - " . date('Y-m-d H:i:s') . " ===\n";
    $debug_log .= "RAW INPUT (primeiros 1000 chars): " . substr($raw_input, 0, 1000) . "\n\n";
    $debug_log .= "DECODED DATA:\n";
    $debug_log .= print_r($data, true) . "\n";
    $debug_log .= "\nPOST DATA:\n";
    $debug_log .= print_r($_POST, true) . "\n";
    $debug_log .= "\n==========================================\n\n";
    file_put_contents(__DIR__ . '/debug_address_payload_pix.txt', $debug_log, FILE_APPEND);
    // ============================================================

    // Verifica se os dados obrigatórios foram fornecidos
    if (!isset($data['transaction_amount'], $data['payer']['email'], $data['payer']['phone']['number'], $data['link_entregavel'])) {
        throw new Exception('Dados obrigatórios não foram fornecidos.');
    }

    // ============================================================
    // BLINDAGEM: BUSCAR PREÇO REAL DO BANCO DE DADOS (Backend Authority)
    // ============================================================
    $produto_id_para_preco = isset($data['product']['id']) ? intval($data['product']['id']) : null;
    $transaction_amount_original = isset($data['transaction_amount']) ? floatval($data['transaction_amount']) : 0;
    
    // Se temos product_id, buscar preço do banco (ignorar valor do frontend)
    if ($produto_id_para_preco > 0) {
        try {
            $sql_preco = "SELECT preco_atual, preco FROM produtos WHERE id = :produto_id LIMIT 1";
            $stmt_preco = $pdo->prepare($sql_preco);
            $stmt_preco->execute([':produto_id' => $produto_id_para_preco]);
            $row_preco = $stmt_preco->fetch(PDO::FETCH_ASSOC);
            
            if ($row_preco) {
                // Priorizar preco_atual, se não tiver ou for 0, usar preco
                $preco_banco = !empty($row_preco['preco_atual']) && floatval($row_preco['preco_atual']) > 0 
                    ? floatval($row_preco['preco_atual']) 
                    : floatval($row_preco['preco']);
                
                if ($preco_banco > 0) {
                    // SOBRESCREVER: Usar preço do banco (ignorar valor do frontend)
                    $data['transaction_amount'] = round($preco_banco, 2);
                    error_log("PIX BACKEND AUTHORITY: Produto ID {$produto_id_para_preco} - Preço do banco: R$ " . number_format($preco_banco, 2, ',', '.') . " | Valor recebido do frontend: R$ " . number_format($transaction_amount_original, 2, ',', '.') . " (IGNORADO)");
                } else {
                    error_log("PIX BACKEND AUTHORITY: Produto ID {$produto_id_para_preco} encontrado, mas preço está zerado no banco. Usando valor do frontend: R$ " . number_format($transaction_amount_original, 2, ',', '.'));
                }
            } else {
                error_log("PIX BACKEND AUTHORITY: Produto ID {$produto_id_para_preco} não encontrado no banco. Usando valor do frontend: R$ " . number_format($transaction_amount_original, 2, ',', '.'));
            }
        } catch (PDOException $e) {
            error_log("PIX BACKEND AUTHORITY: Erro ao buscar preço do produto: " . $e->getMessage() . " | Usando valor do frontend: R$ " . number_format($transaction_amount_original, 2, ',', '.'));
        }
    } else {
        error_log("PIX BACKEND AUTHORITY: Product ID não fornecido. Usando valor do frontend: R$ " . number_format($transaction_amount_original, 2, ',', '.'));
    }
    
    // Validação final: Garantir que transaction_amount seja válido
    if (empty($data['transaction_amount']) || floatval($data['transaction_amount']) <= 0) {
        throw new Exception('Valor da transação inválido ou zerado. Não é possível gerar PIX.');
    }
    // ============================================================

    // Separar nome completo (com múltiplas fontes e fallback)
    $first_name = 'Consumidor';
    $last_name = '';
    
    // Prioridade 1: payer.full_name
    if (isset($data['payer']['full_name']) && !empty(trim($data['payer']['full_name']))) {
        $name_parts = explode(' ', trim($data['payer']['full_name']), 2);
        $first_name = $name_parts[0] ?? 'Consumidor';
        $last_name = $name_parts[1] ?? '';
    }
    // Prioridade 2: payer.first_name + last_name
    elseif (isset($data['payer']['first_name']) && !empty(trim($data['payer']['first_name']))) {
        $first_name = trim($data['payer']['first_name']);
        $last_name = isset($data['payer']['last_name']) ? trim($data['payer']['last_name']) : '';
    }
    
    // Garantir que first_name não esteja vazio
    if (empty(trim($first_name))) {
        $first_name = 'Consumidor';
    }

    // Criar uma referência externa única
    $external_reference = uniqid('txn_', true);

    // Concatena código do país e código de área do telefone
    $country_code = isset($data['payer']['phone']['country_code']) ? preg_replace('/[^0-9+]/', '', $data['payer']['phone']['country_code']) : '';
    $area_code = isset($data['payer']['phone']['area_code']) ? preg_replace('/[^0-9]/', '', $data['payer']['phone']['area_code']) : '11'; // Fallback: São Paulo
    $phone_number_raw = isset($data['payer']['phone']['number']) ? $data['payer']['phone']['number'] : '000000000';
    $phone_number = preg_replace('/[^0-9]/', '', $phone_number_raw);
    
    // Garantir que area_code tenha 2 dígitos e phone_number tenha 9 dígitos
    if (strlen($area_code) > 2) {
        $area_code = substr($area_code, 0, 2);
    }
    if (strlen($phone_number) > 9) {
        $phone_number = substr($phone_number, -9);
    }
    if (empty($phone_number) || strlen($phone_number) < 8) {
        $phone_number = '000000000';
    }
    
    $full_phone_number = trim($country_code . ' ' . $area_code . ' ' . $phone_number);

    // Buscar produto_id e produtor_id
    $produto_id = isset($data['product']['id']) ? intval($data['product']['id']) : null;
    $produtor_id = null;
    $afiliado_id = null;
    $tipo_produto = 'digital'; // Default
    
    if ($produto_id) {
        try {
            $sql_produto = "SELECT usuario_id, tipo_produto FROM produtos WHERE id = :produto_id LIMIT 1";
            $stmt_produto = $pdo->prepare($sql_produto);
            $stmt_produto->execute([':produto_id' => $produto_id]);
            $produto = $stmt_produto->fetch(PDO::FETCH_ASSOC);
            if ($produto) {
                $produtor_id = intval($produto['usuario_id']);
                $tipo_produto = $produto['tipo_produto'] ?? 'digital';
            }
        } catch (PDOException $e) {
            error_log("Erro ao buscar produtor: " . $e->getMessage());
        }
    }
    
    // Buscar afiliado do cookie
    if (isset($_COOKIE['affiliate_id']) && isset($_COOKIE['affiliate_produto_id'])) {
        $cookie_afiliado_id = intval($_COOKIE['affiliate_id']);
        $cookie_produto_id = intval($_COOKIE['affiliate_produto_id']);
        
        // Validar se o afiliado é válido para este produto
        if ($cookie_produto_id == $produto_id && $cookie_afiliado_id > 0) {
            try {
                $sql_afiliado = "SELECT usuario_id FROM afiliacoes WHERE id = :afiliado_id AND produto_id = :produto_id AND status = 'ativo' LIMIT 1";
                $stmt_afiliado = $pdo->prepare($sql_afiliado);
                $stmt_afiliado->execute([':afiliado_id' => $cookie_afiliado_id, ':produto_id' => $produto_id]);
                $afiliado = $stmt_afiliado->fetch(PDO::FETCH_ASSOC);
                if ($afiliado) {
                    $afiliado_id = intval($afiliado['usuario_id']);
                }
            } catch (PDOException $e) {
                error_log("Erro ao buscar afiliado: " . $e->getMessage());
            }
        }
    }
    
    // ENDEREÇO E FRETE (Produtos Físicos)
    $safeEnderecoJson = null;
    $safeFreteCobrado = 0;
    $safeStatusEntrega = null;
    
    // VALIDAÇÃO CRÍTICA: Se produto é físico, endereço é OBRIGATÓRIO
    if ($tipo_produto === 'fisico') {
        if (!isset($data['endereco_json']) || empty($data['endereco_json'])) {
            throw new Exception('Por favor, preencha todos os campos de endereço obrigatórios. Produtos físicos requerem endereço de entrega.');
        }
        
        $endereco_array = json_decode($data['endereco_json'], true);
        if (json_last_error() !== JSON_ERROR_NONE || !is_array($endereco_array)) {
            throw new Exception('Erro ao processar dados de endereço. Por favor, verifique os campos e tente novamente.');
        }
        
        // Validar campos obrigatórios
        $campos_faltando = [];
        if (empty($endereco_array['cep']) || strlen(preg_replace('/[^0-9]/', '', $endereco_array['cep'])) !== 8) {
            $campos_faltando[] = 'CEP';
        }
        if (empty($endereco_array['rua'])) {
            $campos_faltando[] = 'Rua';
        }
        if (empty($endereco_array['numero']) || $endereco_array['numero'] === '0') {
            $campos_faltando[] = 'Número';
        }
        if (empty($endereco_array['bairro'])) {
            $campos_faltando[] = 'Bairro';
        }
        if (empty($endereco_array['cidade'])) {
            $campos_faltando[] = 'Cidade';
        }
        if (empty($endereco_array['estado']) || strlen($endereco_array['estado']) !== 2) {
            $campos_faltando[] = 'Estado (UF)';
        }
        
        if (!empty($campos_faltando)) {
            throw new Exception('Por favor, preencha todos os campos de endereço obrigatórios: ' . implode(', ', $campos_faltando));
        }
        
        $safeEnderecoJson = $data['endereco_json'];
        $safeStatusEntrega = 'preparando';
    } elseif (isset($data['endereco_json']) && !empty($data['endereco_json'])) {
        // Produto digital mas endereço fornecido (opcional)
        $endereco_array = json_decode($data['endereco_json'], true);
        if (json_last_error() === JSON_ERROR_NONE && is_array($endereco_array)) {
            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['endereco_json'];
            }
        }
    }
    
    if (isset($data['frete_cobrado']) && is_numeric($data['frete_cobrado'])) {
        $safeFreteCobrado = max(0, floatval($data['frete_cobrado']));
    }

    // Insere a transação no banco de dados
    try {
        $stmt = $pdo->prepare("INSERT INTO transacoes (produto_id, produtor_id, afiliado_id, nome, sobrenome, email, telefone, cpf, device_ip, valor, descricao, status, tipo_pagamento, gateway, device_id, external_reference, metadados, link_entregavel, endereco_json, frete_cobrado, status_entrega) 
                               VALUES (:produto_id, :produtor_id, :afiliado_id, :nome, :sobrenome, :email, :telefone, :cpf, :device_ip, :valor, :descricao, :status, :tipo_pagamento, :gateway, :device_id, :external_reference, :metadados, :link_entregavel, :endereco_json, :frete_cobrado, :status_entrega)");
        $stmt->execute([
            ':produto_id' => $produto_id,
            ':produtor_id' => $produtor_id,
            ':afiliado_id' => $afiliado_id,
            ':nome' => $first_name,
            ':sobrenome' => $last_name,
            ':email' => $data['payer']['email'],
            ':telefone' => $full_phone_number,
            ':cpf' => isset($data['payer']['identification']['number']) ? $data['payer']['identification']['number'] : null,
            ':device_ip' => isset($data['client_ip']) ? $data['client_ip'] : null,
            ':valor' => round((float)$data['transaction_amount'], 2),
            ':descricao' => $data['description'],
            ':status' => 'Pendente',
            ':tipo_pagamento' => 'Pix',
            ':gateway' => 'mercadopago',
            ':device_id' => isset($data['device_id']) ? $data['device_id'] : null,
            ':external_reference' => $external_reference,
            ':metadados' => json_encode($data['additional_products'] ?? []),
            ':link_entregavel' => $data['link_entregavel'] ?? '',
            ':endereco_json' => $safeEnderecoJson,
            ':frete_cobrado' => $safeFreteCobrado,
            ':status_entrega' => $safeStatusEntrega
        ]);
    } catch (PDOException $e) {
        // Se falhar por colunas novas, tentar sem elas
        if (strpos($e->getMessage(), 'endereco_json') !== false || strpos($e->getMessage(), 'frete_cobrado') !== false || strpos($e->getMessage(), 'status_entrega') !== false) {
            try {
                $stmt = $pdo->prepare("INSERT INTO transacoes (produto_id, produtor_id, afiliado_id, nome, sobrenome, email, telefone, cpf, device_ip, valor, descricao, status, tipo_pagamento, gateway, device_id, external_reference, metadados, link_entregavel) 
                                       VALUES (:produto_id, :produtor_id, :afiliado_id, :nome, :sobrenome, :email, :telefone, :cpf, :device_ip, :valor, :descricao, :status, :tipo_pagamento, :gateway, :device_id, :external_reference, :metadados, :link_entregavel)");
                $stmt->execute([
                    ':produto_id' => $produto_id,
                    ':produtor_id' => $produtor_id,
                    ':afiliado_id' => $afiliado_id,
                    ':nome' => $first_name,
                    ':sobrenome' => $last_name,
                    ':email' => $data['payer']['email'],
                    ':telefone' => $full_phone_number,
                    ':cpf' => isset($data['payer']['identification']['number']) ? $data['payer']['identification']['number'] : null,
                    ':device_ip' => isset($data['client_ip']) ? $data['client_ip'] : null,
                    ':valor' => round((float)$data['transaction_amount'], 2),
                    ':descricao' => $data['description'],
                    ':status' => 'Pendente',
                    ':tipo_pagamento' => 'Pix',
                    ':gateway' => 'mercadopago',
                    ':device_id' => isset($data['device_id']) ? $data['device_id'] : null,
                    ':external_reference' => $external_reference,
                    ':metadados' => json_encode($data['additional_products'] ?? []),
                    ':link_entregavel' => $data['link_entregavel'] ?? ''
                ]);
            } catch (PDOException $e2) {
                // Retrocompatibilidade: se as colunas principais não existirem
                if (strpos($e2->getMessage(), 'produto_id') !== false || strpos($e2->getMessage(), 'produtor_id') !== false || strpos($e2->getMessage(), 'afiliado_id') !== false) {
                    $stmt = $pdo->prepare("INSERT INTO transacoes (nome, sobrenome, email, telefone, cpf, device_ip, valor, descricao, status, tipo_pagamento, gateway, device_id, external_reference, metadados, link_entregavel) 
                                           VALUES (:nome, :sobrenome, :email, :telefone, :cpf, :device_ip, :valor, :descricao, :status, :tipo_pagamento, :gateway, :device_id, :external_reference, :metadados, :link_entregavel)");
                    $stmt->execute([
                        ':nome' => $first_name,
                        ':sobrenome' => $last_name,
                        ':email' => $data['payer']['email'],
                        ':telefone' => $full_phone_number,
                        ':cpf' => isset($data['payer']['identification']['number']) ? $data['payer']['identification']['number'] : null,
                        ':device_ip' => isset($data['client_ip']) ? $data['client_ip'] : null,
                        ':valor' => round((float)$data['transaction_amount'], 2),
                        ':descricao' => $data['description'],
                        ':status' => 'Pendente',
                        ':tipo_pagamento' => 'Pix',
                        ':gateway' => 'mercadopago',
                        ':device_id' => isset($data['device_id']) ? $data['device_id'] : null,
                        ':external_reference' => $external_reference,
                        ':metadados' => json_encode($data['additional_products'] ?? []),
                        ':link_entregavel' => $data['link_entregavel'] ?? ''
                    ]);
                } else {
                    throw $e2;
                }
            }
        } else {
            throw $e;
        }
    }

    // Obtém o último ID inserido no banco de dados
    $transaction_id = $pdo->lastInsertId();

    // Inserir cada produto adicional na tabela `transacoes_adicionais`
    if (isset($data['additional_products']) && is_array($data['additional_products']) && !empty($data['additional_products'])) {
        foreach ($data['additional_products'] as $produto) {
            // Validar estrutura do produto antes de inserir
            if (isset($produto['id']) && isset($produto['nome']) && isset($produto['preco'])) {
                try {
                    $stmt = $pdo->prepare("INSERT INTO transacoes_adicionais (transacao_id, produto_id, nome, preco) 
                                           VALUES (:transacao_id, :produto_id, :nome, :preco)");
                    $stmt->execute([
                        ':transacao_id' => $transaction_id,
                        ':produto_id' => (int)$produto['id'],
                        ':nome' => trim($produto['nome']),
                        ':preco' => round((float)$produto['preco'], 2) // Garantindo precisão decimal
                    ]);
                } catch (PDOException $e) {
                    error_log("Erro ao inserir produto adicional: " . $e->getMessage());
                    // Continuar processamento mesmo se houver erro em produto adicional
                }
            } else {
                error_log("Produto adicional com estrutura inválida: " . json_encode($produto));
            }
        }
    }

    // ============ NOVA FORMA DE CRIAR PAGAMENTO PIX COM SDK v3 ============
    
    $client = new PaymentClient();
    
    // Criar request options com idempotency key
    $requestOptions = new RequestOptions();
    $idempotencyKey = uniqid('pix_', true) . '_' . time();
    $requestOptions->setCustomHeaders(["X-Idempotency-Key: {$idempotencyKey}"]);
    
    // Validações finais antes de montar payload
    if (empty($data['payer']['email']) || !filter_var($data['payer']['email'], FILTER_VALIDATE_EMAIL)) {
        throw new Exception('Email do pagador é obrigatório e deve ser válido.');
    }
    
    if (empty(trim($first_name))) {
        throw new Exception('Nome do pagador é obrigatório.');
    }
    
    // Preparar dados do pagamento PIX (Nova estrutura v3)
    $paymentData = [
        "transaction_amount" => round((float)$data['transaction_amount'], 2),
        "description" => $data['description'],
        "payment_method_id" => "pix",
        "external_reference" => $external_reference,
        "notification_url" => "https://" . $_SERVER['HTTP_HOST'] . "/backend/webhook.php",
        "payer" => [
            "email" => trim($data['payer']['email']),
            "first_name" => trim($first_name),
            "last_name" => trim($last_name),
            "phone" => [
                "area_code" => $area_code,
                "number" => $phone_number
            ]
        ]
    ];
    
    // Adicionar CPF se fornecido (OBRIGATÓRIO para PIX)
    if (isset($data['payer']['identification']['number']) && !empty($data['payer']['identification']['number'])) {
        $cpf_limpo = preg_replace('/[^0-9]/', '', $data['payer']['identification']['number']);
        if (strlen($cpf_limpo) === 11) {
            $paymentData['payer']['identification'] = [
                "type" => isset($data['payer']['identification']['type']) ? strtoupper(trim($data['payer']['identification']['type'])) : 'CPF',
                "number" => $cpf_limpo
            ];
        } else {
            throw new Exception('CPF do pagador é obrigatório e deve ter 11 dígitos.');
        }
    } else {
        throw new Exception('CPF do pagador é obrigatório para gerar PIX.');
    }
    
    // ============================================================
    // ESTRUTURA PARA PRODUTOS FÍSICOS: additional_info -> items (SEM shipments para PIX)
    // IMPORTANTE: Para PIX, o Mercado Pago NÃO aceita shipments.receiver_address
    // O endereço é salvo no banco, mas não é enviado na estrutura additional_info para PIX
    // ============================================================
    // Montar items: produto principal + produtos adicionais (se houver)
    $items = [];
    
    // Item principal
    $produto_nome = $data['description'] ?? 'Produto';
    $produto_preco = round((float)$data['transaction_amount'], 2);
    
    $items[] = [
        'id' => (string) ($produto_id ?? '1'),
        'title' => $produto_nome,
        'quantity' => 1,
        'unit_price' => $produto_preco
    ];
    
    // Adicionar produtos adicionais aos items se existirem
    if (isset($data['additional_products']) && is_array($data['additional_products']) && !empty($data['additional_products'])) {
        foreach ($data['additional_products'] as $produto_adicional) {
            if (isset($produto_adicional['id']) && isset($produto_adicional['nome']) && isset($produto_adicional['preco'])) {
                $items[] = [
                    'id' => (string) $produto_adicional['id'],
                    'title' => trim($produto_adicional['nome']),
                    'quantity' => 1,
                    'unit_price' => round((float)$produto_adicional['preco'], 2)
                ];
            }
        }
    }
    
    // Para PIX, enviar apenas items (sem shipments)
    // O endereço já foi validado e salvo no banco de dados
    if (!empty($items)) {
        $paymentData['additional_info'] = [
            'items' => $items
        ];
        error_log("PIX - additional_info montado (apenas items): " . json_encode($paymentData['additional_info']));
    }
    
    // Log do payload antes de enviar (debug)
    error_log("PIX - Payload completo antes de enviar: " . json_encode([
        'transaction_amount' => $paymentData['transaction_amount'] ?? null,
        'description' => $paymentData['description'] ?? null,
        'payment_method_id' => $paymentData['payment_method_id'] ?? null,
        'payer_email' => $paymentData['payer']['email'] ?? null,
        'has_additional_info' => isset($paymentData['additional_info']),
        'produto_id' => $produto_id,
        'tipo_produto' => $tipo_produto
    ]));
    
    // Criar pagamento PIX via SDK v3
    try {
        $payment = $client->create($paymentData, $requestOptions);
        
        error_log("PIX - Pagamento criado com sucesso. Status: " . ($payment->status ?? 'N/A') . " | ID: " . ($payment->id ?? 'N/A'));
    } catch (MPApiException $e) {
        // Re-throw para ser capturado pelo catch externo
        throw $e;
    } catch (Exception $e) {
        error_log("PIX - Erro ao criar pagamento: " . $e->getMessage());
        throw $e;
    }

    // Verifica se o pagamento foi criado com sucesso
    if (isset($payment->status) && $payment->status == 'pending') {
        // Verificar se point_of_interaction existe e tem transaction_data
        if (!isset($payment->point_of_interaction) || !isset($payment->point_of_interaction->transaction_data)) {
            error_log("PIX - Estrutura de resposta inválida. point_of_interaction não encontrado.");
            throw new Exception('Erro: Estrutura de resposta do Mercado Pago inválida. Tente novamente.');
        }
        
        // Pega os códigos QR gerados
        $qr_code_base64 = $payment->point_of_interaction->transaction_data->qr_code_base64 ?? null;
        $qr_code = $payment->point_of_interaction->transaction_data->qr_code ?? null;
        
        if (empty($qr_code_base64) || empty($qr_code)) {
            error_log("PIX - QR Code não encontrado na resposta. Payment ID: " . ($payment->id ?? 'N/A'));
            throw new Exception('Erro: QR Code não foi gerado pelo Mercado Pago. Tente novamente.');
        }

        // Atualiza a transação no banco de dados com o QR Code e o ID do pagamento
        try {
            $stmt = $pdo->prepare("UPDATE transacoes SET qr_code = :qr_code, qr_code_base64 = :qr_code_base64, payment_id = :payment_id, status = 'Pendente' WHERE id = :id");
            $stmt->execute([
                ':qr_code' => $qr_code,
                ':qr_code_base64' => $qr_code_base64,
                ':payment_id' => $payment->id,
                ':id' => $transaction_id
            ]);
            error_log("PIX - Transação atualizada com sucesso. Transaction ID: {$transaction_id} | Payment ID: " . ($payment->id ?? 'N/A'));
        } catch (PDOException $e) {
            error_log("PIX - Erro ao atualizar transação: " . $e->getMessage());
            // Continuar mesmo se falhar a atualização, pois o PIX foi gerado
        }

        // Retorna o QR Code e status de sucesso
        echo json_encode([
            'status' => 'success',
            'qr_code_base64' => $qr_code_base64,
            'qr_code' => $qr_code,
            'transaction_id' => $transaction_id
        ]);
    } else {
        $status_detail = property_exists($payment, 'status_detail') ? $payment->status_detail : 'Status desconhecido: ' . ($payment->status ?? 'N/A');
        error_log("PIX - Pagamento não está pending. Status: " . ($payment->status ?? 'N/A') . " | Detail: " . $status_detail);
        throw new Exception('Erro ao gerar pagamento Pix. Status: ' . ($payment->status ?? 'desconhecido') . '. Detalhes: ' . $status_detail);
    }
    
} catch (MPApiException $e) {
    // Log detalhado do erro
    error_log('=== ERRO DA API MERCADO PAGO PIX ===');
    error_log('Mensagem: ' . $e->getMessage());
    error_log('Código: ' . $e->getCode());
    
    // Tentar extrair informações adicionais se métodos existirem
    if (method_exists($e, 'getApiResponse')) {
        try {
            $api_response = $e->getApiResponse();
            error_log('Resposta da API: ' . json_encode($api_response));
            
            // Tentar extrair mensagem mais específica
            if (is_array($api_response) && isset($api_response['message'])) {
                $error_message = $api_response['message'];
            } elseif (is_array($api_response) && isset($api_response['cause']) && is_array($api_response['cause'])) {
                $causes = [];
                foreach ($api_response['cause'] as $cause) {
                    if (isset($cause['description'])) {
                        $causes[] = $cause['description'];
                    }
                }
                if (!empty($causes)) {
                    $error_message = implode('. ', $causes);
                } else {
                    $error_message = $e->getMessage();
                }
            } else {
                $error_message = $e->getMessage();
            }
        } catch (Exception $ex) {
            error_log('Erro ao processar resposta da API: ' . $ex->getMessage());
            $error_message = $e->getMessage();
        }
    } else {
        $error_message = $e->getMessage();
    }
    
    // Log do payload enviado para debug
    if (isset($paymentData)) {
        error_log('Payload enviado à API: ' . json_encode([
            'transaction_amount' => $paymentData['transaction_amount'] ?? null,
            'description' => $paymentData['description'] ?? null,
            'payment_method_id' => $paymentData['payment_method_id'] ?? null,
            'has_payer' => isset($paymentData['payer']),
            'has_additional_info' => isset($paymentData['additional_info']),
            'additional_info_keys' => isset($paymentData['additional_info']) ? array_keys($paymentData['additional_info']) : []
        ]));
    }

    // Atualiza a transação com o status de erro
    if (isset($transaction_id)) {
        try {
            $stmt = $pdo->prepare("UPDATE transacoes SET status = 'Erro', erro = :erro WHERE id = :id");
            $stmt->execute([
                ':erro' => $error_message,
                ':id' => $transaction_id
            ]);
        } catch (PDOException $db_error) {
            error_log("Erro ao atualizar transação após erro da API: " . $db_error->getMessage());
        }
    }

    // Retorna o erro em formato JSON com mensagem mais amigável
    http_response_code(400);
    echo json_encode([
        'status' => 'error', 
        'message' => 'Erro ao gerar PIX: ' . $error_message
    ]);
} catch (Exception $e) {
    // Log do erro
    error_log('Erro no pagamento Pix: ' . $e->getMessage());

    // Atualiza a transação com o status de erro
    if (isset($transaction_id)) {
        $stmt = $pdo->prepare("UPDATE transacoes SET status = 'Erro', erro = :erro WHERE id = :id");
        $stmt->execute([
            ':erro' => $e->getMessage(),
            ':id' => $transaction_id
        ]);
    }

    echo json_encode(['status' => 'error', 'message' => 'Erro ao processar pagamento Pix: ' . $e->getMessage()]);
}
?>