<?php
// Oculta erros para não bugar a resposta do Asaas
error_reporting(0);
ini_set('display_errors', 0);

require_once 'config.php';

// Lê o pacote de dados (JSON) que o Asaas enviou
$json = file_get_contents('php://input');
$data = json_decode($json, true);

// Se não tiver dados (ex: você abriu pelo navegador), ele só diz "ok" e fecha a porta
if (!$data || !isset($data['event'])) {
    echo '{"status":"ok"}';
    exit;
}

// O Asaas manda vários avisos, só queremos o aviso de PAGAMENTO RECEBIDO ou CONFIRMADO
if ($data['event'] === 'PAYMENT_RECEIVED' || $data['event'] === 'PAYMENT_CONFIRMED') {
    
    // Pega o ID da transação que o Asaas enviou
    $transacao_id = $data['payment']['id'];

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

    try {
        $pdo = getConexaoAtiva();
        $pdo_int = getConexaoInterna(); // Conexão com o banco local onde ficam armazenados os planos customizados

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

        // Procura no nosso painel se existe uma fatura PENDENTE com esse ID
        $stmt = $pdo->prepare("SELECT * FROM faturas_loja WHERE transacao_id = ? AND status = 'pendente' LIMIT 1");
        $stmt->execute([$transacao_id]);
        $fatura = $stmt->fetch(PDO::FETCH_ASSOC);

        if ($fatura) {
            $fatura_id = $fatura['id'];
            $user_id = (int)$fatura['user_id'];
            $plano_id = (int)$fatura['plano_id'];

            // 1. Atualiza a fatura para 'pago' para não receber créditos duplicados
            $pdo->prepare("UPDATE faturas_loja SET status = 'pago' WHERE id = ?")->execute([$fatura_id]);

            // 2. Descobre quantos créditos o revendedor comprou (buscando na tabela do banco local que suporta owner_id)
            $stmtPlano = $pdo_int->prepare("SELECT qtd_creditos FROM planos_creditos WHERE id = ?");
            $stmtPlano->execute([$plano_id]);
            $plano = $stmtPlano->fetch(PDO::FETCH_ASSOC);

            if ($plano) {
                $creditos_comprados = (int)$plano['qtd_creditos'];

                // 3. INTELIGÊNCIA DE CRÉDITOS DA HIERARQUIA: 
                // Se o dono do gateway de pagamento NÃO for o administrador master principal (id 0),
                // os créditos entregues ao comprador precisam sair do saldo do seu respectivo Master.
                $pode_entregar = true;
                
                if ($owner_gateway_id > 0) {
                    // Verifica em tempo real o saldo do Master que vai fornecer esses créditos
                    $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 o Master não for administrador (grupo != 1), ele precisa ter saldo para repassar
                    if ($masterData && $masterData['member_group_id'] != 1) {
                        $saldo_master = floatval($masterData['credits']);
                        if ($saldo_master >= $creditos_comprados) {
                            // Deduz a quantidade de créditos do saldo do Master
                            $pdo->prepare("UPDATE reg_users SET credits = credits - ? WHERE id = ?")->execute([$creditos_comprados, $owner_gateway_id]);
                        } else {
                            // Se o master não tiver saldo suficiente na VPS, bloqueia a entrega automática para evitar saldo negativo
                            $pode_entregar = false;
                            $pdo->prepare("UPDATE faturas_loja SET status = 'erro_saldo_master' WHERE id = ?")->execute([$fatura_id]);
                        }
                    }
                }

                if ($pode_entregar) {
                    // 4. INJETA OS CRÉDITOS NA CONTA DO REVENDEDOR COM COMPRA APROVADA
                    $pdo->prepare("UPDATE reg_users SET credits = credits + ? WHERE id = ?")->execute([$creditos_comprados, $user_id]);
                    
                    // (Opcional) Salva no log de consumo que ele comprou créditos
                    try {
                        $agora = date('Y-m-d H:i:s');
                        $acao = "Compra de " . $creditos_comprados . " Creditos (Automático)";
                        // Desconta 0, pois é uma entrada, só para ficar registrado
                        $pdo->prepare("INSERT INTO logs_creditos (revendedor_id, cliente_user, acao, qtd_descontada, data_hora) VALUES (?, 'Sistema', ?, 0, ?)")->execute([$user_id, $acao, $agora]);
                    } catch(Exception $e) {}
                }
            }
        }
    } catch (Exception $e) {
        // Se der erro no banco, morre em silêncio
    }
}

// Responde com status 200 (Sucesso) para o Asaas saber que recebemos a mensagem
http_response_code(200);
echo '{"status":"sucesso"}';
?>
