<?php
error_reporting(E_ALL);
ini_set('display_errors', 1); // ⚠️ সাময়িক Debug
/**
 * submit_trx_verification.php
 * User Website-এ এসে, শুধু Transaction ID + Mobile Number জমা দেয়।
 * Amount এখানে দিতে হয় না — কারণ SMS থেকেই আসল, Verified Amount পাওয়া যাবে।
 */
session_start();
include __DIR__ . "/../conn.php";
header('Content-Type: application/json; charset=utf-8');

if (!isset($_SESSION['user_id']) && !isset($_POST['userId'])) {
    echo json_encode(['code' => 1, 'msg' => 'Login প্রয়োজন']);
    exit;
}

$userId = intval($_SESSION['user_id'] ?? $_POST['userId']);
$trxid = trim(mysqli_real_escape_string($conn, $_POST['trxid'] ?? ''));
$mobile = trim(mysqli_real_escape_string($conn, $_POST['mobile'] ?? ''));
$gateway = strtolower(trim($_POST['gateway'] ?? ''));
$amount = floatval($_POST['amount'] ?? 0); // ✅ নতুন যোগ — User এখন Amount-ও দেবে

if ($trxid === '' || $mobile === '' || $amount <= 0 || !in_array($gateway, ['bkash', 'nagad'])) {
    echo json_encode(['code' => 1, 'msg' => 'সব তথ্য দিন (Amount, TrxID, Mobile, Gateway)']);
    exit;
}

/* ══════════════════════════════════════════════════════════════
   ✅ নতুন যোগ — Deposit Request জমা নেওয়ার আগেই, User কোন
   Agent-এর Downline নাকি সরাসরি Admin-এর User তা বের করে,
   সেই Pool-এ যথেষ্ট Coin আছে কিনা Check করা হচ্ছে। না থাকলে,
   Request-ই তৈরি হবে না — User আগে থেকেই জানতে পারবে।
   ══════════════════════════════════════════════════════════════ */
$poolIsAgent = false;
$poolId = null;
$poolLabel = 'Admin';

$selfQ = $conn->query("SELECT code FROM shonu_subjects WHERE id = '$userId'");
$selfRow = $selfQ ? $selfQ->fetch_assoc() : null;

if ($selfRow && !empty($selfRow['code'])) {
    $refQ = $conn->query("SELECT id FROM shonu_subjects WHERE owncode = '" . $conn->real_escape_string($selfRow['code']) . "'");
    $refRow = $refQ ? $refQ->fetch_assoc() : null;
    if ($refRow) {
        $agentChk = $conn->query("SELECT userid FROM tb_agent WHERE userid = '{$refRow['id']}' AND status = '1'");
        if ($agentChk && $agentChk->num_rows > 0) {
            $poolIsAgent = true;
            $poolId = $refRow['id'];
            $poolLabel = 'Agent';
        }
    }
}

if (!$poolIsAgent) {
    $adminRow = $conn->query("SELECT unohs FROM nirvahaka_shonu ORDER BY unohs ASC LIMIT 1")->fetch_assoc();
    $poolId = $adminRow['unohs'] ?? null;
}

$poolBalance = 0;
if ($poolIsAgent) {
    $poolBalRow = $conn->query("SELECT motta FROM shonu_kaichila WHERE balakedara = '$poolId'")->fetch_assoc();
    $poolBalance = $poolBalRow ? floatval($poolBalRow['motta']) : 0;
} else {
    $poolBalRow = $conn->query("SELECT motta FROM nirvahaka_shonu WHERE unohs = '$poolId'")->fetch_assoc();
    $poolBalance = $poolBalRow ? floatval($poolBalRow['motta']) : 0;
}

if ($poolBalance < $amount) {
    $contactMsg = $poolIsAgent
        ? 'আপনার Agent-এর একাউন্টে পর্যাপ্ত Balance নেই, তাই Deposit হচ্ছে না। Agent-এর সাথে যোগাযোগ করুন।'
        : 'আপনার Admin-এর একাউন্টে পর্যাপ্ত Balance নেই, তাই Deposit হচ্ছে না। Admin-এর সাথে যোগাযোগ করুন।';
    echo json_encode(['code' => 1, 'msg' => $contactMsg]);
    exit;
}

// ✅ একই TrxID আগে ব্যবহার হয়েছে কিনা
$check = $conn->prepare("SELECT id FROM pending_verifications WHERE trxid = ? LIMIT 1");
$check->bind_param("s", $trxid);
$check->execute();
if ($check->get_result()->num_rows > 0) {
    echo json_encode(['code' => 1, 'msg' => 'এই Transaction ID আগেই ব্যবহার হয়েছে']);
    exit;
}
$check->close();

$stmt = $conn->prepare("
    INSERT INTO pending_verifications (trxid, mobile, user_id, gateway, status, expires_at)
    VALUES (?, ?, ?, ?, 'pending', DATE_ADD(NOW(), INTERVAL 30 MINUTE))
");
$stmt->bind_param("ssis", $trxid, $mobile, $userId, $gateway);

if ($stmt->execute()) {
    // ⚠️ সাময়িক Debug — Insert-এর পরে এই Code পর্যন্ত পৌঁছাচ্ছে কিনা
    $debugLogDir0 = __DIR__ . '/submit_debug_logs';
    if (!file_exists($debugLogDir0)) { @mkdir($debugLogDir0, 0777, true); }
    @file_put_contents($debugLogDir0 . '/log.txt',
        date('Y-m-d H:i:s') . " | REACHED post-insert code | TrxID=$trxid" . PHP_EOL,
        FILE_APPEND
    );

    /* ══════════════════════════════════════════════════════════════
       ✅ নতুন যোগ — Order তৈরি হওয়ার সাথে সাথেই, এই TrxID দিয়ে
       আগে কোনো "Orphan" SMS (Order তৈরির আগেই আসা SMS) এসেছিল
       কিনা Check করা হচ্ছে। থাকলে, এখনই সাথে সাথে Balance
       দিয়ে দেওয়া হচ্ছে — Retry-এর অপেক্ষা করতে হয় না।
       ══════════════════════════════════════════════════════════════ */
    $orphanCheck = $conn->prepare("SELECT * FROM orphan_sms_log WHERE trxid = ? AND is_claimed = 0 AND expires_at >= NOW() LIMIT 1");
    $orphanCheck->bind_param("s", $trxid);
    $orphanCheck->execute();
    $orphanResult = $orphanCheck->get_result();

    // ⚠️ সাময়িক Debug — File-এ সরাসরি Log রাখা হচ্ছে
    $debugLogDir = __DIR__ . '/submit_debug_logs';
    if (!file_exists($debugLogDir)) { @mkdir($debugLogDir, 0777, true); }
    @file_put_contents($debugLogDir . '/log.txt',
        date('Y-m-d H:i:s') . " | TrxID=$trxid | OrphanRowsFound=" . $orphanResult->num_rows . PHP_EOL,
        FILE_APPEND
    );

    if ($orphanResult->num_rows > 0) {
        $orphan = $orphanResult->fetch_assoc();

        $conn->begin_transaction();
        try {
            $conn->query("UPDATE orphan_sms_log SET is_claimed = 1 WHERE trxid = '" . $conn->real_escape_string($trxid) . "'");

            $updV = $conn->prepare("UPDATE pending_verifications SET status='verified', verified_amount=?, verified_at=NOW() WHERE trxid = ?");
            $updV->bind_param("ds", $orphan['amount'], $trxid);
            $updV->execute();

            if ($poolIsAgent) {
                $poolDeduct2 = $conn->prepare("UPDATE shonu_kaichila SET motta = motta - ? WHERE balakedara = ?");
                $poolDeduct2->bind_param("di", $orphan['amount'], $poolId);
            } else {
                $poolDeduct2 = $conn->prepare("UPDATE nirvahaka_shonu SET motta = motta - ? WHERE unohs = ?");
                $poolDeduct2->bind_param("di", $orphan['amount'], $poolId);
            }
            $poolDeduct2->execute();

            $balUpd2 = $conn->prepare("UPDATE shonu_kaichila SET motta = motta + ? WHERE balakedara = ?");
            $balUpd2->bind_param("di", $orphan['amount'], $userId);
            $balUpd2->execute();

            $conn->commit();
            // ✅ ঠিক করা হলো — File না থাকলে যেন ভেঙে না যায়
            $telegramFile2 = __DIR__ . "/../telegram_notify.php";
            if (file_exists($telegramFile2)) {
                require_once $telegramFile2;
                if (function_exists('notifyDeposit')) {
                    notifyDeposit($mobile, $orphan['amount'], $gateway, $trxid);
                }
            }

            echo json_encode(['code' => 0, 'msg' => '✅ তোমার Payment ইতিমধ্যেই এসে গিয়েছিল, সাথে সাথে ৳' . $orphan['amount'] . ' Balance-এ যোগ হয়ে গেলো!']);
            exit;
        } catch (Throwable $e) {
            $conn->rollback();
            // ⚠️ সাময়িক Debug — আসল Error দেখানো হচ্ছে
            echo json_encode(['code' => 1, 'msg' => 'DEBUG ERROR: ' . $e->getMessage()]);
            exit;
        }
    }

    echo json_encode([
        'code' => 0,
        'msg' => 'জমা হয়েছে, কিছুক্ষণের মধ্যেই Verify হয়ে যাবে',
        'debug_orphan_rows_found' => $orphanResult->num_rows,
        'debug_trxid_searched' => $trxid
    ]);
} else {
    echo json_encode(['code' => 1, 'msg' => 'সমস্যা হয়েছে, আবার চেষ্টা করুন']);
}
$stmt->close();
