<?php
/**
 * wallet-functions.php
 * Funções centrais da carteira do sistema
 * Incluir em: settings.php ou initialize.php
 */

// ─────────────────────────────────────────────────────────
// LEITURA DA CARTEIRA
// ─────────────────────────────────────────────────────────

function wallet_get($customer_id) {
    global $conn;
    $cid = (int) $customer_id;
    // Cria carteira se não existir
    $conn->query("INSERT IGNORE INTO wallet (customer_id) VALUES ($cid)");
    $r = $conn->query("SELECT * FROM wallet WHERE customer_id = $cid");
    return $r->fetch_assoc();
}

// ─────────────────────────────────────────────────────────
// CRÉDITO (adicionar saldo)
// ─────────────────────────────────────────────────────────

function wallet_credit($customer_id, $amount, $type, $description, $ref_id = null, $ref_type = null) {
    global $conn;
    $cid    = (int)   $customer_id;
    $amount = (float) $amount;
    if ($amount <= 0) return false;

    $conn->begin_transaction();
    try {
        // Lock otimista – lê e trava a linha
        $w = $conn->query("SELECT balance_available, balance_total_earned FROM wallet
                           WHERE customer_id = $cid FOR UPDATE")->fetch_assoc();
        if (!$w) {
            // Cria carteira na primeira vez
            $conn->query("INSERT INTO wallet (customer_id) VALUES ($cid)");
            $w = ['balance_available' => 0.00, 'balance_total_earned' => 0.00];
        }

        $before = (float) $w['balance_available'];
        $after  = $before + $amount;
        $earned = (float) $w['balance_total_earned'] + $amount;

        $conn->query("UPDATE wallet
                      SET balance_available    = $after,
                          balance_total_earned = $earned,
                          updated_at           = NOW()
                      WHERE customer_id = $cid");

        $conn->query("INSERT INTO wallet_transactions
                      SET customer_id    = $cid,
                          type           = '$type',
                          amount         = $amount,
                          balance_before = $before,
                          balance_after  = $after,
                          description    = '" . $conn->real_escape_string($description) . "',
                          reference_id   = " . ($ref_id   ? (int)$ref_id   : 'NULL') . ",
                          reference_type = " . ($ref_type ? "'" . $conn->real_escape_string($ref_type) . "'" : 'NULL'));

        $conn->commit();
        return $after;
    } catch (Exception $e) {
        $conn->rollback();
        return false;
    }
}

// ─────────────────────────────────────────────────────────
// DÉBITO (retirar saldo)
// ─────────────────────────────────────────────────────────

function wallet_debit($customer_id, $amount, $type, $description, $ref_id = null, $ref_type = null) {
    global $conn;
    $cid    = (int)   $customer_id;
    $amount = (float) $amount;
    if ($amount <= 0) return false;

    $conn->begin_transaction();
    try {
        $w = $conn->query("SELECT balance_available FROM wallet
                           WHERE customer_id = $cid FOR UPDATE")->fetch_assoc();
        if (!$w || (float)$w['balance_available'] < $amount) {
            $conn->rollback();
            return false; // Saldo insuficiente
        }

        $before = (float) $w['balance_available'];
        $after  = $before - $amount;

        $conn->query("UPDATE wallet
                      SET balance_available = $after,
                          updated_at        = NOW()
                      WHERE customer_id = $cid");

        $conn->query("INSERT INTO wallet_transactions
                      SET customer_id    = $cid,
                          type           = '$type',
                          amount         = -$amount,
                          balance_before = $before,
                          balance_after  = $after,
                          description    = '" . $conn->real_escape_string($description) . "',
                          reference_id   = " . ($ref_id   ? (int)$ref_id   : 'NULL') . ",
                          reference_type = " . ($ref_type ? "'" . $conn->real_escape_string($ref_type) . "'" : 'NULL'));

        $conn->commit();
        return $after;
    } catch (Exception $e) {
        $conn->rollback();
        return false;
    }
}

// ─────────────────────────────────────────────────────────
// FILA DE NOTIFICAÇÕES WHATSAPP
// ─────────────────────────────────────────────────────────

function enqueue_whatsapp($customer_id, $event_type, $value = 0) {
    global $conn, $_settings;
    $cid      = (int) $customer_id;
    $siteName = $_settings->info('name');
    $customer = $conn->query("SELECT firstname, phone FROM customer_list
                               WHERE id = $cid")->fetch_assoc();
    if (!$customer) return;

    $name  = $customer['firstname'];
    $phone = $customer['phone'];
    $val   = number_format((float)$value, 2, ',', '.');

    $messages = [
        'deposit_confirmed'     => "✅ *Depósito Confirmado!*\n\nOlá *{$name}*! Seu depósito de *R\$ {$val}* foi creditado na sua carteira.\nAcesse e comece a investir agora! 🚀\n\n*{$siteName}*",
        'yield_received'        => "💰 *Rendimento Recebido!*\n\nOlá *{$name}*! Você recebeu *R\$ {$val}* de rendimento hoje.\nSeu dinheiro está trabalhando por você! 📈\n\n*{$siteName}*",
        'binary_bonus_received' => "🌐 *Bônus de Rede!*\n\nParabéns *{$name}*! Você ganhou *R\$ {$val}* de bônus binário.\nSua equipe está crescendo! 💪\n\n*{$siteName}*",
        'unilevel_received'     => "🔗 *Comissão de Indicação!*\n\nOlá *{$name}*! Você recebeu *R\$ {$val}* de comissão de indicação.\nContinue indicando e ganhando mais! 🎯\n\n*{$siteName}*",
        'auction_leading'       => "⚡ *Você está liderando!*\n\nOlá *{$name}*! Você está na liderança do leilão.\n⏱ *{$value}s* restantes — não perca!\n\n*{$siteName}*",
        'auction_won'           => "🏆 *VOCÊ GANHOU O LEILÃO!*\n\nParabéns *{$name}*! Você venceu com o lance final!\nEntraremos em contato para entrega do prêmio! 🎁\n\n*{$siteName}*",
        'withdrawal_approved'   => "💵 *Saque Aprovado!*\n\nOlá *{$name}*! Seu saque de *R\$ {$val}* foi aprovado.\nO valor chegará em instantes na sua chave PIX! ✅\n\n*{$siteName}*",
        'withdrawal_rejected'   => "❌ *Saque Recusado*\n\nOlá *{$name}*, seu saque de *R\$ {$val}* foi recusado.\nBetween em contato com o suporte para mais informações.\n\n*{$siteName}*",
        'investment_completed'  => "🎉 *Investimento Concluído!*\n\nOlá *{$name}*! Seu plano atingiu o teto de rendimento!\nAcesse o site para renovar e continuar crescendo! 🚀\n\n*{$siteName}*",
        'investment_activated'  => "📈 *Investimento Ativado!*\n\nOlá *{$name}*! Seu investimento de *R\$ {$val}* foi ativado com sucesso.\nSeu rendimento começará em breve! 💎\n\n*{$siteName}*",
        'registration'          => "🎉 *Bem-vindo(a) à {$siteName}!*\n\nOlá *{$name}*! Sua conta foi criada com sucesso.\nAcesse, deposite e comece a lucrar agora! 💰\n\n*{$siteName}*",
    ];

    $message = $messages[$event_type] ?? "Notificação do {$siteName}.";

    $conn->query("INSERT INTO notification_queue
                  SET customer_id    = $cid,
                      phone          = '" . $conn->real_escape_string($phone) . "',
                      event_type     = '" . $conn->real_escape_string($event_type) . "',
                      message        = '" . $conn->real_escape_string($message) . "'");
}

// ─────────────────────────────────────────────────────────
// GERAR DEPÓSITO PIX (usa gateways existentes do sistema)
// ─────────────────────────────────────────────────────────

function generate_deposit_pix($deposit_id, $amount, $customer_name, $customer_email, $customer_phone, $customer_cpf) {
    global $_settings, $conn;
    $gateway  = $_settings->info('payment_method');
    $expiry   = (int) ($_settings->info('deposit_expiration_minutes') ?: 30);

    switch ($gateway) {
        case 'openpix':
            openpix_generate_deposit_pix($deposit_id, $amount, $customer_name, $customer_email, $expiry, $customer_phone);
            break;
        case 'mercadopago':
            mercadopago_generate_deposit_pix($deposit_id, $amount, $customer_name, $customer_email, $expiry);
            break;
        case 'gerencianet':
            gerencianet_generate_deposit_pix($deposit_id, $amount, $customer_name, $customer_email, $expiry);
            break;
        case 'paggue':
            paggue_generate_deposit_pix($deposit_id, $amount, $customer_name, $customer_email, $expiry);
            break;
        case 'pay2m':
            pay2m_generate_deposit_pix($deposit_id, $amount, $customer_name, $customer_cpf, $expiry);
            break;
    }
}

// Wrapper OpenPix para depósitos
function openpix_generate_deposit_pix($deposit_id, $amount, $client_name, $client_email, $order_expiration, $customer_phone) {
    global $_settings, $conn;
    $appId  = $_settings->info('openpix_app_id');
    $tax    = (float) ($_settings->info('openpix_tax') ?: 0);
    $amount_cents = (int) round($amount * 100 * (1 + $tax / 100));

    $data = [
        'correlationID' => 'DEP-' . $deposit_id,
        'value'         => $amount_cents,
        'type'          => 'DYNAMIC',
        'comment'       => 'Depósito #' . $deposit_id,
        'expiresIn'     => $order_expiration * 60,
        'customer'      => ['name' => $client_name,
                            'email' => ($client_email ?: 'noreply@' . $_SERVER['SERVER_NAME']),
                            'phone' => $customer_phone]
    ];
    $curl = curl_init();
    curl_setopt_array($curl, [
        CURLOPT_URL => 'https://api.openpix.com.br/api/v1/charge',
        CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 0,
        CURLOPT_CUSTOMREQUEST => 'POST',
        CURLOPT_POSTFIELDS => json_encode($data),
        CURLOPT_HTTPHEADER => ['Authorization: ' . $appId, 'content-type: application/json']
    ]);
    $response = curl_exec($curl); curl_close($curl);
    $get = json_decode($response, true);
    $pix_code   = $get['charge']['brCode']     ?? '';
    $pix_qrcode = $get['charge']['qrCodeImage'] ?? '';
    $global_id  = $get['charge']['globalID']   ?? '';
    $conn->query("UPDATE deposits SET payment_method='OpenPix', pix_code='" . $conn->real_escape_string($pix_code) . "',
                  pix_qrcode='" . $conn->real_escape_string($pix_qrcode) . "', id_mp='" . $conn->real_escape_string($global_id) . "'
                  WHERE id = $deposit_id");
}

// Wrappers semelhantes para MP / GN / Paggue / Pay2m seguem o mesmo padrão
// (omitidos aqui pra brevidade — seguem a mesma lógica dos wrappers do settings.php)
?>
