<?php
require '../../config/db.php';

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    echo json_encode(['error' => 'Método não permitido.']);
    exit;
}

$json = file_get_contents("php://input");

$decod = json_decode($json, true);

// Registra um log para depuração
file_put_contents('webhook_teste.txt', date('Y-m-d H:i:s') . 'Chegou Webhook: Transação ' . $decod['idtransaction'] . ' com status' . $decod['status'] . PHP_EOL, FILE_APPEND);

if (isset($decod['idtransaction']) && isset($decod['status']) && $decod['status'] === 'PAID_OUT') {
    try {
        $pdo->beginTransaction();
        // Consulta dados da transação
        $stmt = $pdo->prepare("SELECT * FROM transactions WHERE idTransaction = :idTransaction");
        $stmt->execute([
            ':idTransaction' => $decod['idtransaction']
        ]);
        $result = $stmt->fetch(PDO::FETCH_ASSOC);

        if ($result['status'] === 'paid') {
            echo json_encode(['error' => 'A transação já está com o status PAGO!']);
            exit; 
        }

        // Consulta dados do usuário
        $stmtUser = $pdo->prepare("SELECT * FROM users WHERE id = :id");
        $stmtUser->execute([
            ':id' => $result['user_id']
        ]);
        $resultUser = $stmtUser->fetch(PDO::FETCH_ASSOC);

        // Atualiza status da transação
        $stmtInsert = $pdo->prepare("UPDATE transactions SET date_payment = :date_payment, gateway = :gateway, status = :status WHERE idTransaction = :idTransaction");
        $stmtInsert->execute([
            ':date_payment' => date('Y-m-d H:i:s'),
            ':status' => 'paid',
            ':idTransaction' => $decod['idtransaction'],
            ':gateway' => 'SyncPay'
        ]);

        // Seta o saldo ao usuário
        $stmtUpdate = $pdo->prepare("UPDATE users SET balance = balance + :balance WHERE id = :user_id");
        $stmtUpdate->execute([
            ':balance' => $result['value'],
            ':user_id' => $result['user_id']
        ]);

        // Registra um log no banco
        $stmtHistory = $pdo->prepare("INSERT INTO history (user_id, action) VALUES (:user_id, :action)");
        $stmtHistory->execute([
            ':user_id' => $result['user_id'],
            ':action' => 'Acabou de depositar R$ ' . $result['value']
        ]);

        // Verifica se o depositante tem um afiliado
        if ($resultUser['indicated_by'] !== null) {
            $stmtAffiliate = $pdo->prepare("SELECT * FROM users WHERE affiliate_code = :affiliate_code");
            $stmtAffiliate->execute([
                ':affiliate_code' => $resultUser['indicated_by']
            ]);

            if ($stmtAffiliate->rowCount() > 0) {
                // Pega dados do afiliado se existir
                $resultAffiliate = $stmtAffiliate->fetch(PDO::FETCH_ASSOC);

                // Atualiza informações para afiliado
                $stmtUpdateAffiliate = $pdo->prepare("UPDATE users SET total_indicated_deposits = total_indicated_deposits + :total_indicated_deposits WHERE id = :id");
                $stmtUpdateAffiliate->execute([
                    ':total_indicated_deposits' => $result['value'],
                    ':id' => $resultAffiliate['id'],
                ]);


                // Registra em log no banco
                $stmtHistory = $pdo->prepare("INSERT INTO history (user_id, action) VALUES (:user_id, :action)");
                $stmtHistory->execute([
                    ':user_id' => $result['user_id'],
                    ':action' => 'Indicado de ID: ' . $resultAffiliate['id'] . ' - Indicado ID: ' . $resultUser['id'] . ' depositou R$ ' . $result['value']
                ]);
            }
        }
        echo json_encode(['success' => 'Saldo atualizado.']);
        $pdo->commit();
    } catch (PDOException $e) {
        $pdo->rollBack();
        echo "Erro na atualização com o banco: " . $e->getMessage();
    }
}
