<?php
// ==============================================================================
// CONFIGURAÇÕES INICIAIS E DEBUG
// ==============================================================================
// Mantemos o debug ligado para garantir que erros sejam vistos se ocorrerem
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// Função para registrar logs de operação
function logMsg($msg) {
    file_put_contents('debug_pix.txt', date('d/m/Y H:i:s') . " - " . print_r($msg, true) . PHP_EOL, FILE_APPEND);
}

logMsg("=== NOVA TRANSAÇÃO INICIADA ===");

// ==============================================================================
// 1. CONEXÃO COM O BANCO DE DADOS
// ==============================================================================
$paths = ['../../config.php', '../config.php', 'config.php'];
$config_loaded = false;
foreach ($paths as $path) { 
    if (file_exists($path)) { 
        require_once $path; 
        $config_loaded = true; 
        break; 
    }
}

if (!$config_loaded) { 
    die("<h1>ERRO CRÍTICO</h1><p>O arquivo de configuração (config.php) não foi encontrado.</p>"); 
}

// ==============================================================================
// 2. RECUPERAÇÃO DAS CREDENCIAIS DO GATEWAY
// ==============================================================================
try {
    $stmt = $pdo->prepare("SELECT * FROM config_gateway WHERE id = 1");
    $stmt->execute();
    $gateway = $stmt->fetch();
    
    if (!$gateway || empty($gateway['access_token'])) {
        die("<h1>ERRO DE CONFIGURAÇÃO</h1><p>A API Key não está configurada no painel administrativo.</p>");
    }
    
    $api_token = $gateway['access_token'];
    // URL OFICIAL DA WITETEC (NÃO ALTERAR)
    $api_url = "https://api.witetec.net/transactions"; 
    
} catch (Exception $e) {
    die("Erro ao conectar com o banco de dados: " . $e->getMessage());
}

// Verifica se a requisição veio do formulário
if ($_SERVER['REQUEST_METHOD'] !== 'POST') { 
    die("Acesso inválido. Por favor, inicie o checkout novamente."); 
}

// ==============================================================================
// 3. RECEBIMENTO E TRATAMENTO DOS DADOS
// ==============================================================================
$nome = filter_input(INPUT_POST, 'nome', FILTER_SANITIZE_STRING) ?? 'Cliente';
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
$cpf_bruto = $_POST['cpf'] ?? '';
$cpf = preg_replace('/[^0-9]/', '', $cpf_bruto); // Remove pontos e traços
$whatsapp = preg_replace('/[^0-9]/', '', $_POST['whatsapp'] ?? '');
$produto_id = filter_input(INPUT_POST, 'product_id', FILTER_VALIDATE_INT);

// Validação básica
if (!$email || !$produto_id || !$cpf) {
    die("<h1>DADOS INVÁLIDOS</h1><p>Por favor, preencha todos os campos obrigatórios (Email, CPF).</p><button onclick='history.back()'>Voltar</button>");
}

logMsg("Cliente: $nome | Email: $email | CPF: $cpf");

try {
    $pdo->beginTransaction();

    // ==========================================================================
    // 4. BUSCA PRODUTO E PREPARAÇÃO DE VALORES
    // ==========================================================================
    $stmt = $pdo->prepare("SELECT * FROM produtos WHERE id = ?");
    $stmt->execute([$produto_id]);
    $prod = $stmt->fetch();

    if (!$prod) { 
        throw new Exception("Produto não encontrado no banco de dados."); 
    }

    // A WiteTec trabalha com centavos (Inteiro). Ex: R$ 10,00 = 1000
    $amount_cents = (int)($prod['preco_atual'] * 100);

    // ==========================================================================
    // 5. GESTÃO DE USUÁRIO (CRIAÇÃO OU ATUALIZAÇÃO)
    // ==========================================================================
    // Define a senha padrão 'tiktok'
    $senha_padrao_hash = password_hash('tiktok', PASSWORD_DEFAULT);

    $stmt = $pdo->prepare("SELECT id FROM usuarios WHERE email = ?");
    $stmt->execute([$email]);
    $usuario = $stmt->fetch();
    
    if ($usuario) {
        // Usuário existe: Atualiza dados (mas mantém a senha antiga se já existir)
        $usuario_id = $usuario['id'];
        $stmt = $pdo->prepare("UPDATE usuarios SET nome=?, cpf=?, whatsapp=? WHERE id=?");
        $stmt->execute([$nome, $cpf, $whatsapp, $usuario_id]);
    } else {
        // Usuário novo: Cria registro com a senha padrão 'tiktok'
        $stmt = $pdo->prepare("INSERT INTO usuarios (nome, email, cpf, whatsapp, senha, tipo) VALUES (?, ?, ?, ?, ?, 'cliente')");
        $stmt->execute([$nome, $email, $cpf, $whatsapp, $senha_padrao_hash]);
        $usuario_id = $pdo->lastInsertId();
    }

    // ==========================================================================
    // 6. CRIAÇÃO DO PEDIDO (PENDENTE)
    // ==========================================================================
    $stmt = $pdo->prepare("INSERT INTO pedidos (usuario_id, produto_id, valor_total, status, forma_pagamento) VALUES (?, ?, ?, 'pendente', 'pix')");
    $stmt->execute([$usuario_id, $produto_id, $prod['preco_atual']]);
    $pedido_id = $pdo->lastInsertId();

    logMsg("Pedido #$pedido_id criado localmente. Enviando para WiteTec...");

    // ==========================================================================
    // 7. CHAMADA À API (INTEGRAÇÃO)
    // ==========================================================================
    $payload = [
        "amount" => $amount_cents,
        "method" => "PIX",
        "metadata" => [
            "sellerExternalRef" => (string)$pedido_id
        ],
        "customer" => [
            "name" => $nome,
            "email" => $email,
            "phone" => $whatsapp,
            "documentType" => "CPF",
            "document" => $cpf
        ],
        "items" => [
            [
                "title" => $prod['nome'],
                "amount" => $amount_cents,
                "quantity" => 1,
                "tangible" => false,
                "externalRef" => (string)$prod['id']
            ]
        ]
    ];

    $curl = curl_init();
    curl_setopt_array($curl, [
        CURLOPT_URL => $api_url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => json_encode($payload),
        CURLOPT_HTTPHEADER => [
            "Content-Type: application/json",
            "x-api-key: " . $api_token
        ],
    ]);

    $response = curl_exec($curl);
    $http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    $err = curl_error($curl);
    curl_close($curl);

    logMsg("Resposta da API (HTTP $http_code): " . $response);

    if ($err) {
        throw new Exception("Erro de conexão cURL: " . $err);
    }

    $retorno = json_decode($response, true);

    // Verifica se houve erro na API (Qualquer código diferente de 201 Created é erro)
    if ($http_code !== 201 || !isset($retorno['status']) || $retorno['status'] !== true) {
        $msg_erro = $retorno['message'] ?? 'Erro desconhecido na API';
        
        // Formata o erro para exibição amigável
        die("<div style='font-family:sans-serif; text-align:center; padding:50px;'>
                <h1 style='color:#ff0050'>Ops! Pagamento não iniciado.</h1>
                <p>O gateway recusou a transação.</p>
                <div style='background:#fde8e8; color:#9b1c1c; padding:15px; display:inline-block; border-radius:8px; margin:20px 0;'>
                    <strong>Motivo:</strong> $msg_erro <br>
                    <small>(HTTP Code: $http_code)</small>
                </div>
                <br>
                <button onclick='history.back()' style='padding:10px 20px; cursor:pointer;'>Voltar e tentar novamente</button>
             </div>");
    }

    // ==========================================================================
    // 8. PROCESSAMENTO DA RESPOSTA (SUCESSO)
    // ==========================================================================
    $transaction_id = $retorno['data']['id'];
    
    // Captura o código Pix Copia e Cola (pode vir como 'qrcode' ou 'copyPaste')
    $pix_copia_cola = $retorno['data']['pix']['qrcode'] ?? $retorno['data']['pix']['copyPaste'] ?? '';
    
    // Captura Imagem (Base64 ou URL)
    $qr_code_img = $retorno['data']['pix']['qrcode_base64'] ?? $retorno['data']['pix']['qrcodeUrl'] ?? '';

    if (empty($pix_copia_cola)) {
        throw new Exception("A API retornou sucesso, mas não forneceu o código Pix.");
    }

    // Atualiza o pedido com os dados do pagamento
    $stmt = $pdo->prepare("UPDATE pedidos SET transaction_id=?, pix_copia_cola=?, qr_code_img=? WHERE id=?");
    
    if(!$stmt->execute([$transaction_id, $pix_copia_cola, $qr_code_img, $pedido_id])) {
        // Se falhar aqui, é provável que seja o tamanho da coluna no banco
        $errorInfo = $stmt->errorInfo();
        logMsg("ERRO SQL AO SALVAR PIX: " . print_r($errorInfo, true));
        throw new Exception("Erro interno ao salvar dados do Pix.");
    }

    $pdo->commit();
    
    // ==========================================================================
    // 9. REDIRECIONAMENTO FINAL (IMEDIATO)
    // ==========================================================================
    header("Location: pagamento_pix.php?pedido_id=" . $pedido_id);
    exit;

} catch (Exception $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    logMsg("EXCEÇÃO: " . $e->getMessage());
    die("<div style='font-family:sans-serif; padding:30px; text-align:center;'>
            <h1>Erro no Sistema</h1>
            <p>Ocorreu um erro ao processar seu pedido.</p>
            <textarea style='width:100%; height:100px; margin-top:20px;'>" . $e->getMessage() . "</textarea>
         </div>");
}
?>