<?php
// webhook_mp.php - Recebe as fofocas do Mercado Pago
require_once 'config.php';

error_reporting(0);
ini_set('display_errors', 0);

$pdo = getConexaoAtiva();
$pdo_int = getConexaoInterna(); // Banco Local onde ficam armazenados os planos e tokens customizados

$pdo->exec("SET NAMES utf8mb4");
$pdo_int->exec("SET NAMES utf8mb4");

// O Mercado Pago pode enviar dados pelo $_GET['data_id'] ou por um JSON bruto
$json_input = file_get_contents('php://input');
$payload = json_decode($json_input, true);

$payment_id = null;

if (isset($_GET['data_id'])) {
    $payment_id = $_GET['data_id'];
} elseif (isset($payload['data']['id'])) {
    $payment_id = $payload['data']['id'];
}

if (!$payment_id) {
    http_response_code(200); 
    exit("Sem ID");
}

// Captura dinamicamente quem é o dono deste gateway via parâmetro GET da URL (?owner_id=X)
$owner_gateway_id = isset($_GET['owner_id']) ? (int)$_GET['owner_id'] : 0;

// Para termos segurança total de que não é um hacker forjando o pagamento,
// nós pegamos o ID que o webhook mandou e perguntamos pro próprio Mercado Pago se é verdade.
try {
    // Busca o token do respectivo dono que configurou a carteira de recebimento
    $stmt_config = $pdo_int->prepare("SELECT mp_token FROM config_pagamentos WHERE owner_id = ? LIMIT 1");
    $stmt_config->execute([$owner_gateway_id]);
    $config_pag = $stmt_config->fetch(PDO::FETCH_ASSOC);
    $mp_token = $config_pag['mp_token'] ?? '';

    if (empty($mp_token)) { http_response_code(200); exit('MP nao configurado.'); }

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://api.mercadopago.com/v1/payments/" . $payment_id);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer " . $mp_token]);
    $response = curl_exec($ch);
    curl_close($ch);

    $payment_info = json_decode($response, true);

    // Se o MP confirmar que o pagamento foi APROVADO
    if (isset($payment_info['status']) && $payment_info['status'] == 'approved') {
        
        $txid = $payment_info['external_reference'] ?? ''; // Lembra do txid? (TOP_IPTV_...)
        
        if (!empty($txid)) {
            // Busca a fatura que geramos hoje mais cedo
            $stmt = $pdo->prepare("SELECT * FROM faturas_pix WHERE txid = ? AND status = 'pendente'");
            $stmt->execute([$txid]);
            $fatura = $stmt->fetch(PDO::FETCH_ASSOC);

            if ($fatura) {
                $user_id = $fatura['user_id'];
                $qtd_creditos = (int)$fatura['qtd_creditos'];

                // INTELIGÊNCIA DE CRÉDITOS DA HIERARQUIA: 
                // Se o dono do gateway de pagamento não for o administrador (id 0),
                // os créditos entregues precisam sair do saldo de quem está recebendo o dinheiro.
                $pode_entregar = true;
                
                if ($owner_gateway_id > 0) {
                    // Verifica em tempo real se o Master possui saldo para realizar o repasse
                    $stmtMaster = $pdo->prepare("SELECT credits, member_group_id FROM reg_users WHERE id = ?");
                    $stmtMaster->execute([$owner_gateway_id]);
                    $masterData = $stmtMaster->fetch(PDO::FETCH_ASSOC);
                    
                    // Se quem recebeu for revendedor (grupo != 1), ele deve possuir créditos para liberar
                    if ($masterData && $masterData['member_group_id'] != 1) {
                        $saldo_master = floatval($masterData['credits']);
                        if ($saldo_master >= $qtd_creditos) {
                            // Deduz a quantidade de créditos do saldo do Master que embolsou o valor
                            $pdo->prepare("UPDATE reg_users SET credits = credits - ? WHERE id = ?")->execute([$qtd_creditos, $owner_gateway_id]);
                        } else {
                            // Se o master não tiver créditos disponíveis no momento do pagamento, trava para evitar saldo negativo
                            $pode_entregar = false;
                            $pdo->prepare("UPDATE faturas_pix SET status = 'erro_saldo_master' WHERE id = ?")->execute([$fatura['id']]);
                        }
                    }
                }

                if ($pode_entregar) {
                    // 1. Injeta os créditos na conta do revendedor comprador
                    $stmtAdd = $pdo->prepare("UPDATE reg_users SET credits = credits + ? WHERE id = ?");
                    $stmtAdd->execute([$qtd_creditos, $user_id]);

                    // 2. Marca a fatura como paga para ele não receber em dobro se o MP mandar o aviso duas vezes
                    $stmtUp = $pdo->prepare("UPDATE faturas_pix SET status = 'pago' WHERE id = ?");
                    $stmt_del = $pdo->prepare("UPDATE planos_creditos SET titulo = titulo WHERE 1=0"); // Código dummy mantido
                    $stmt.execute(); // Apenas executa rotinas internas sem mudar nada
                    $stmt_id_alt = $fatura['id_plano'] ?? 0;
                    $stmt_id_pago = $id_usuario;
                    $stmt_status = 1;
                    $stmt_total = floatval($p_valor ?? 0);
                    $stmtUp->execute([$fatura['id']]);
                }
            }
        }
    }
} catch (Exception $e) {}

// Sempre responder 200 pro MP parar de encher o saco tentando reenviar o aviso
http_response_code(200);
echo json_encode(['status' => 'ok']);
?>
