<?php
include_once dirname(__DIR__) . '/settings/config_xui_api.php';
include_once dirname(__DIR__) . '/settings/config_utils.php';
global $connection, $data, $text, $from_id, $admin, $userInfo, $message_id, $mainValues, $buttonValues, $cancelKey, $removeKeyboard, $fileid, $caption, $botState, $first_name, $username, $newRremark, $days, $volume, $marzbanText, $configLocation, $configReality, $type, $ticketList, $permissions, $row, $markup, $botUrl;


// --- Start of Range 846 to 1188 ---
if ($data == 'createMultipleAccounts' && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $stmt = $connection->prepare("SELECT * FROM `server_info` WHERE `active`=1 and `ucount` > 0 ORDER BY `id` ASC");
    $stmt->execute();
    $respd = $stmt->get_result();
    $stmt->close();
    if ($respd->num_rows == 0) {
        sendMessage($mainValues['no_server_available']);
        exit;
    }
    $keyboard = [];
    while ($cat = $respd->fetch_assoc()) {
        $id = $cat['id'];
        $name = $cat['title'];
        $flag = $cat['flag'];
        $keyboard[] = ['text' => "$flag $name", 'callback_data' => "createAccServer$id"];
    }
    $keyboard[] = ['text' => $buttonValues['back_to_main'], 'callback_data' => "managePanel"];
    $keyboard = array_chunk($keyboard, 1);
    editText($message_id, $mainValues['buy_sub_select_location'], json_encode(['inline_keyboard' => $keyboard]));
}
if (preg_match('/createAccServer(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $sid = $match[1];

    $stmt = $connection->prepare("SELECT * FROM `server_categories` WHERE `parent`=0 order by `id` asc");
    $stmt->execute();
    $respd = $stmt->get_result();
    $stmt->close();
    if ($respd->num_rows == 0) {
        alert("هیچ دسته بندی برای این سرور وجود ندارد");
    } else {

        $keyboard = [];
        while ($file = $respd->fetch_assoc()) {
            $id = $file['id'];
            $name = $file['title'];
            $stmt = $connection->prepare("SELECT * FROM `server_plans` WHERE `server_id`=? and `catid`=? and `active`=1");
            $stmt->bind_param("ii", $sid, $id);
            $stmt->execute();
            $rowcount = $stmt->get_result()->num_rows;
            $stmt->close();
            if ($rowcount > 0)
                $keyboard[] = ['text' => "$name", 'callback_data' => "createAccCategory{$id}_{$sid}"];
        }
        if (empty($keyboard)) {
            alert("هیچ دسته بندی برای این سرور وجود ندارد");
            exit;
        }
        alert("♻️ | دریافت دسته بندی ...");
        $keyboard[] = ['text' => $buttonValues['back_to_main'], 'callback_data' => "createMultipleAccounts"];
        $keyboard = array_chunk($keyboard, 1);
        editText($message_id, "2️⃣ مرحله دو:

دسته بندی مورد نظرت رو انتخاب کن 🤭", json_encode(['inline_keyboard' => $keyboard]));
    }
}
if (preg_match('/createAccCategory(\d+)_(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $call_id = $match[1];
    $sid = $match[2];
    $stmt = $connection->prepare("SELECT * FROM `server_plans` WHERE `server_id`=? and `catid`=? and `active`=1 order by `id` asc");
    $stmt->bind_param("ii", $sid, $call_id);
    $stmt->execute();
    $respd = $stmt->get_result();
    $stmt->close();

    if ($respd->num_rows == 0) {
        // متن تغییر کرده و ایموجی حذف شد
        sendMessage("پلنی در این دسته بندی وجود ندارد.");
    } else {
        // alert("📍در حال دریافت لیست پلن ها"); // این خط رو اگر نیاز نداری می‌تونی پاک کنی یا متنش رو ساده کنی
        $keyboard = [];
        while ($file = $respd->fetch_assoc()) {
            $id = $file['id'];
            $name = $file['title'];
            $keyboard[] = ['text' => "$name", 'callback_data' => "createAccPlan{$id}"];
        }
        $keyboard[] = ['text' => $buttonValues['back_to_main'], 'callback_data' => "createAccServer$sid"];
        $keyboard = array_chunk($keyboard, 1);

        // متن اصلی تغییر کرد
        editText($message_id, "مرحله سوم:

لطفا یکی از پلن های زیر را انتخاب کنید.", json_encode(['inline_keyboard' => $keyboard]));
    }
}
if (preg_match('/^createAccPlan(\d+)/', (string)$data, $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    delMessage();
    sendMessage("❗️لطفا مدت زمان اکانت را به ( روز ) وارد کن:", $cancelKey);
    setUser('createAccDate' . $match[1]);
}
if (preg_match('/^createAccDate(\d+)/', (string)$userInfo['step'], $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    if (is_numeric($text)) {
        if ($text > 0) {
            sendMessage("❕حجم اکانت ها رو به گیگابایت ( GB ) وارد کن:");
            setUser('createAccVolume' . $match[1] . "_" . $text);
        } else {
            sendMessage("عدد باید بیشتر از 0 باشه");
        }
    } else {
        sendMessage('😡 | مگه نمیگم فقط عدد بفرس نمیفهمی؟ یا خودتو زدی به نفهمی؟');
    }
}
if (preg_match('/^createAccVolume(\d+)_(\d+)/', (string)$userInfo['step'], $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    if (!is_numeric($text)) {
        sendMessage($mainValues['send_only_number']);
        exit();
    } elseif ($text <= 0) {
        sendMessage("مقداری بزرگتر از 0 وارد کن");
        exit();
    }
    sendMessage($mainValues['enter_account_amount']);
    setUser("createAccAmount" . $match[1] . "_" . $match[2] . "_" . $text);
}
if (preg_match('/^createAccAmount(\d+)_(\d+)_(\d+)/', (string)$userInfo['step'], $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    if (!is_numeric($text)) {
        sendMessage($mainValues['send_only_number']);
        exit();
    } elseif ($text <= 0) {
        sendMessage("مقداری بزرگتر از 0 وارد کن");
        exit();
    }
    $uid = $from_id;
    $fid = $match[1];
    $acctxt = '';


    $stmt = $connection->prepare("SELECT * FROM `server_plans` WHERE `id`=?");
    $stmt->bind_param("i", $fid);
    $stmt->execute();
    $file_detail = $stmt->get_result()->fetch_assoc();
    $stmt->close();

    $days = $match[2];
    $date = time();
    $expire_microdate = ($days > 0) ? floor(microtime(true) * 1000) + (864000 * $days * 100) : 0;
    $expire_date = ($days > 0) ? $date + (86400 * $days) : 0;
    $type = $file_detail['type'];
    $volume = $match[3];
    $protocol = $file_detail['protocol'];
    $price = $file_detail['price'];
    $rahgozar = $file_detail['rahgozar'];
    $customPath = $file_detail['custom_path'];
    $customPort = $file_detail['custom_port'];
    $customSni = $file_detail['custom_sni'];



    $server_id = $file_detail['server_id'];
    $netType = $file_detail['type'];
    $acount = $file_detail['acount'];
    $inbound_id = $file_detail['inbound_id'];
    $limitip = $file_detail['limitip'];


    if ($acount == 0 and $inbound_id != 0) {
        alert($mainValues['out_of_connection_capacity']);
        exit;
    }
    if ($inbound_id == 0) {
        $stmt = $connection->prepare("SELECT * FROM `server_info` WHERE `id`=?");
        $stmt->bind_param("i", $server_id);
        $stmt->execute();
        $server_info = $stmt->get_result()->fetch_assoc();
        $stmt->close();

        if ($server_info['ucount'] <= 0) {
            alert($mainValues['out_of_server_capacity']);
            exit;
        }
    } else {
        if ($acount < $text) {
            sendMessage(str_replace("AMOUNT", $acount, $mainValues['can_create_specific_account']));
            exit();
        }
    }

    $stmt = $connection->prepare("SELECT * FROM `server_info` WHERE `id`=?");
    $stmt->bind_param("i", $server_id);
    $stmt->execute();
    $serverInfo = $stmt->get_result()->fetch_assoc();
    $srv_remark = $serverInfo['remark'];
    $stmt->close();
    $savedinfo = file_get_contents('settings/temp.txt');
    $savedinfo = explode('-', $savedinfo);
    $port = $savedinfo[0];
    $last_num = $savedinfo[1];
    include 'phpqrcode/qrlib.php';
    $ecc = 'L';
    $pixel_Size = 11;
    $frame_Size = 0;

    $stmt = $connection->prepare("SELECT * FROM `server_config` WHERE `id`=?");
    $stmt->bind_param("i", $server_id);
    $stmt->execute();
    $serverConfig = $stmt->get_result()->fetch_assoc();
    $serverType = $serverConfig['type'];
    $portType = $serverConfig['port_type'];
    $panelUrl = $serverConfig['panel_url'];
    $stmt->close();


    $stmt = $connection->prepare("INSERT INTO `orders_list` 
	    (`userid`, `token`, `transid`, `fileid`, `server_id`, `inbound_id`, `remark`, `uuid`, `protocol`, `expire_date`, `link`, `amount`, `status`, `date`, `notif`, `rahgozar`)
	    VALUES (?, ?, '', ?, ?, ?, ?, ?, ?, ?, ?, ?,1, ?, 0, ?);");
    define('IMAGE_WIDTH', 540);
    define('IMAGE_HEIGHT', 540);
    for ($i = 1; $i <= $text; $i++) {
        $uniqid = generateRandomString(42, $protocol);
        if ($portType == "auto") {
            $port++;
        } else {
            $port = rand(1111, 65000);
        }
        $last_num++;

        if ($botState['remark'] == "digits") {
            $rnd = rand(10000, 99999);
            $remark = "{$srv_remark}-{$rnd}";
        } else {
            $rnd = rand(1111, 99999);
            $remark = "{$srv_remark}-{$from_id}-{$rnd}";
        }

        if ($inbound_id == 0) {
            if ($serverType == "marzban") {
                $response = addMarzbanUser($server_id, $remark, $volume, $days, $fid);
                if (!$response->success) {
                    if ($response->msg == "User already exists") {
                        $remark .= rand(1111, 99999);
                        $response = addMarzbanUser($server_id, $remark, $volume, $days, $fid);
                    }
                }
            } else {
                $response = addUser($server_id, $uniqid, $protocol, $port, $expire_microdate, $remark, $volume, $netType, 'none', $rahgozar, $fid);

                if (!$response->success) {
                    if (strstr($response->msg, "Duplicate email"))
                        $remark .= RandomString();
                    elseif (strstr($response->msg, "Port already exists"))
                        $port = rand(1111, 65000);

                    $response = addUser($server_id, $uniqid, $protocol, $port, $expire_microdate, $remark, $volume, $netType, 'none', $rahgozar, $fid);
                }
            }
        } else {
            $response = addInboundAccount($server_id, $uniqid, $inbound_id, $expire_microdate, $remark, $volume, $limitip, null, $fid);
            if (!$response->success) {
                if (strstr($response->msg, "Duplicate email"))
                    $remark .= RandomString();

                $response = addInboundAccount($server_id, $uniqid, $inbound_id, $expire_microdate, $remark, $volume, $limitip, null, $fid);
            }
        }

        if (is_null($response)) {
            sendMessage('❌ | 🥺 گلم ، اتصال به سرور برقرار نیست لطفا مدیر رو در جریان بزار ...');
            break;
        }
        if ($response == "inbound not Found") {
            sendMessage("❌ | 🥺 سطر (inbound) با آیدی $inbound_id تو این سرور وجود نداره ، مدیر رو در جریان بزار ...");
            break;
        }
        if (!$response->success) {
            sendMessage('❌ | 😮 وای خطا داد لطفا سریع به مدیر بگو ...');
            sendMessage("خطای سرور {$serverInfo['title']}:\n\n" . ($response->msg), null, null, $admin);
            break;
        }

        if ($serverType == "marzban") {
            $uniqid = $token = str_replace("/sub/", "", $response->sub_link);
            $subLink = $botState['subLinkState'] == "on" ? $panelUrl . $response->sub_link : "";
            $vraylink = [$subLink];
            $vray_link = json_encode($response->vray_links);
        } else {
            $token = RandomString(30);
            $vraylink = getConnectionLink($server_id, $uniqid, $protocol, $remark, $port, $netType, $inbound_id, $rahgozar, $customPath, $customPort, $customSni);
            $subLink = $botState['subLinkState'] == "on" ? $botUrl . "settings/subLink.php?token=" . $token : "";
            $vray_link = json_encode($vraylink);
        }
        foreach ($vraylink as $link) {
            $acc_text = "
    
        🔮 $remark \n " . ($botState['configLinkState'] != "off" && $serverType != "marzban" ? "<code>$link</code>" : "");
            if ($botState['subLinkState'] == "on")
                $acc_text .=
                    " \n🌐 subscription : <code>$subLink</code>";

            $file = RandomString() . ".png";

            QRcode::png($link, $file, $ecc, $pixel_Size, $frame_Size);
            addBorderImage($file);


            $backgroundImage = imagecreatefromjpeg(dirname(__DIR__) . "/settings/QRCode.jpg");
            $qrImage = imagecreatefrompng($file);

            $qrWidth = imagesx($qrImage); $qrHeight = imagesy($qrImage);
            $newWidth = round($qrWidth * 1.5); $newHeight = round($qrHeight * 1.5);
            $startX = round((imagesx($backgroundImage) - $newWidth) / 2);
            $startY = round(300 - ($newHeight - $qrHeight) / 2);
            imagecopyresampled($backgroundImage, $qrImage, $startX, $startY, 0, 0, $newWidth, $newHeight, $qrWidth, $qrHeight);
            imagepng($backgroundImage, $file);
            imagedestroy($backgroundImage);
            imagedestroy($qrImage);


            sendPhoto($file, $acc_text, json_encode(['inline_keyboard' => [[['text' => $buttonValues['back_to_main'], 'callback_data' => "mainMenu", 'style' => 'danger', 'icon_custom_emoji_id' => '5352759161945867747']]]]), "HTML", $uid);
            unlink($file);
        }
        $stmt->bind_param("ssiiisssisiii", $uid, $token, $fid, $server_id, $inbound_id, $remark, $uniqid, $protocol, $expire_date, $vray_link, $price, $date, $rahgozar);
        $stmt->execute();
    }
    $stmt->close();
    if ($portType == "auto") {
        file_put_contents('settings/temp.txt', $port . '-' . $last_num);
    }
    if ($inbound_id == 0) {
        $stmt = $connection->prepare("UPDATE `server_info` SET `ucount` = `ucount` - 1 WHERE `id`=?");
        $stmt->bind_param("i", $server_id);
        $stmt->execute();
        $stmt->close();
    } else {
        $stmt = $connection->prepare("UPDATE `server_plans` SET `acount` = `acount` - ? WHERE id=?");
        $stmt->bind_param("ii", $text, $fid);
        $stmt->execute();
        $stmt->close();
    }
    sendMessage("☑️|❤️ اکانت های جدید با موفقیت ساخته شد", getMainKeys());
    setUser();
}


// --- Start of Range 2172 to 2565 ---
if ($data == 'dayPlanSettings' and ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $stmt = $connection->prepare("SELECT * FROM `increase_day`");
    $stmt->execute();
    $res = $stmt->get_result();
    $stmt->close();

    if ($res->num_rows == 0) {
        editText($message_id, 'لیست پلن های زمانی خالی است ', json_encode([
            'inline_keyboard' => [
                [['text' => "افزودن پلن زمانی جدید", 'callback_data' => "addNewDayPlan"]],
                [['text' => $buttonValues['back_button'], 'callback_data' => "backplan"]]
            ]
        ]));
        exit;
    }
    $keyboard = [];
    $keyboard[] = [['text' => "حذف", 'callback_data' => "NetFreedomVPN"], ['text' => "قیمت", 'callback_data' => "NetFreedomVPN"], ['text' => "تعداد روز", 'callback_data' => "NetFreedomVPN"]];
    while ($cat = $res->fetch_assoc()) {
        $id = $cat['id'];
        $title = $cat['volume'];
        $price = number_format($cat['price']) . " تومان";
        $acount = $cat['acount'];

        $keyboard[] = [['text' => "❌", 'callback_data' => "deleteDayPlan" . $id], ['text' => $price, 'callback_data' => "changeDayPlanPrice" . $id], ['text' => $title, 'callback_data' => "changeDayPlanDay" . $id]];
    }
    $keyboard[] = [['text' => "افزودن پلن زمانی جدید", 'callback_data' => "addNewDayPlan"]];
    $keyboard[] = [['text' => $buttonValues['back_button'], 'callback_data' => "backplan"]];
    $msg = ' 📍 برای دیدن جزییات پلن زمانی روی آن بزنید👇';

    editText($message_id, $msg, json_encode([
        'inline_keyboard' => $keyboard
    ]));

    exit;
}
if ($data == 'addNewDayPlan' and ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    setUser($data);
    delMessage();
    sendMessage("تعداد روز و قیمت آن را بصورت زیر وارد کنید :
10-30000

مقدار اول مدت زمان (10) روز
مقدار دوم قیمت (30000) تومان
 ", $cancelKey);
    exit;
}
if ($userInfo['step'] == "addNewDayPlan" and $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $input = explode('-', $text);
    $volume = $input[0];
    $price = $input[1];
    $stmt = $connection->prepare("INSERT INTO `increase_day` VALUES (NULL, ?, ?)");
    $stmt->bind_param("ii", $volume, $price);
    $stmt->execute();
    $stmt->close();

    sendMessage("پلن زمانی جدید با موفقیت اضافه شد", $removeKeyboard);
    sendMessage($mainValues['reached_main_menu'], getAdminKeys());
    setUser();
}
if (preg_match('/^deleteDayPlan(\d+)/', (string)$data, $match) and ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $stmt = $connection->prepare("DELETE FROM `increase_day` WHERE `id` = ?");
    $stmt->bind_param("i", $match[1]);
    $stmt->execute();
    $stmt->close();
    alert("پلن موردنظر با موفقیت حذف شد");


    $stmt = $connection->prepare("SELECT * FROM `increase_day`");
    $stmt->execute();
    $res = $stmt->get_result();
    $stmt->close();

    if ($res->num_rows == 0) {
        editText($message_id, 'لیست پلن های زمانی خالی است ', json_encode([
            'inline_keyboard' => [
                [['text' => "افزودن پلن زمانی جدید", 'callback_data' => "addNewDayPlan"]],
                [['text' => $buttonValues['back_button'], 'callback_data' => "managePanel"]]
            ]
        ]));
        exit;
    }
    $keyboard = [];
    $keyboard[] = [['text' => "حذف", 'callback_data' => "NetFreedomVPN"], ['text' => "قیمت", 'callback_data' => "NetFreedomVPN"], ['text' => "تعداد روز", 'callback_data' => "NetFreedomVPN"]];
    while ($cat = $res->fetch_assoc()) {
        $id = $cat['id'];
        $title = $cat['volume'];
        $price = number_format($cat['price']) . " تومان";
        $acount = $cat['acount'];

        $keyboard[] = [['text' => "❌", 'callback_data' => "deleteDayPlan" . $id], ['text' => $price, 'callback_data' => "changeDayPlanPrice" . $id], ['text' => $title, 'callback_data' => "changeDayPlanDay" . $id]];
    }
    $keyboard[] = [['text' => "افزودن پلن زمانی جدید", 'callback_data' => "addNewDayPlan"]];
    $keyboard[] = [['text' => $buttonValues['back_button'], 'callback_data' => "managePanel"]];
    $msg = ' 📍 برای دیدن جزییات پلن زمانی روی آن بزنید👇';

    editText($message_id, $msg, json_encode([
        'inline_keyboard' => $keyboard
    ]));

    exit;
}
if (preg_match('/^changeDayPlanPrice(\d+)/', (string)$data, $match) and ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    setUser($data);
    delMessage();
    sendMessage("قیمت جدید را وارد کنید:", $cancelKey);
    exit;
}
if (preg_match('/^changeDayPlanPrice(\d+)/', (string)$userInfo['step'], $match) and $text != $buttonValues['cancel']) {
    if (is_numeric($text)) {
        setUser();
        $stmt = $connection->prepare("UPDATE `increase_day` SET `price` = ? WHERE `id` = ?");
        $stmt->bind_param("ii", $text, $match[1]);
        $stmt->execute();
        $stmt->close();

        sendMessage("✅عملیات با موفقیت انجام شد", $removeKeyboard);

        $stmt = $connection->prepare("SELECT * FROM `increase_day`");
        $stmt->execute();
        $res = $stmt->get_result();
        $stmt->close();

        if ($res->num_rows == 0) {
            sendMessage('لیست پلن های زمانی خالی است ', json_encode([
                'inline_keyboard' => [
                    [['text' => "افزودن پلن زمانی جدید", 'callback_data' => "addNewDayPlan"]],
                    [['text' => $buttonValues['back_button'], 'callback_data' => "managePanel"]]
                ]
            ]));
            exit;
        }
        $keyboard = [];
        $keyboard[] = [['text' => "حذف", 'callback_data' => "NetFreedomVPN"], ['text' => "قیمت", 'callback_data' => "NetFreedomVPN"], ['text' => "تعداد روز", 'callback_data' => "NetFreedomVPN"]];
        while ($cat = $res->fetch_assoc()) {
            $id = $cat['id'];
            $title = $cat['volume'];
            $price = number_format($cat['price']) . " تومان";
            $acount = $cat['acount'];

            $keyboard[] = [['text' => "❌", 'callback_data' => "deleteDayPlan" . $id], ['text' => $price, 'callback_data' => "changeDayPlanPrice" . $id], ['text' => $title, 'callback_data' => "changeDayPlanDay" . $id]];
        }
        $keyboard[] = [['text' => "افزودن پلن زمانی جدید", 'callback_data' => "addNewDayPlan"]];
        $keyboard[] = [['text' => $buttonValues['back_button'], 'callback_data' => "managePanel"]];
        $msg = ' 📍 برای دیدن جزییات پلن زمانی روی آن بزنید👇';

        sendMessage($msg, json_encode([
            'inline_keyboard' => $keyboard
        ]));
    } else {
        sendMessage("یک مقدار عددی و صحیح وارد کنید");
    }
}
if (preg_match('/^changeDayPlanDay(\d+)/', (string)$data, $match) and ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    setUser($data);
    delMessage();
    sendMessage("روز جدید را وارد کنید:", $cancelKey);
    exit;
}
if (preg_match('/^changeDayPlanDay(\d+)/', (string)$userInfo['step'], $match) && ($from_id == $admin || $userInfo['isAdmin'] == true) and $text != $buttonValues['cancel']) {
    setUser();
    $stmt = $connection->prepare("UPDATE `increase_day` SET `volume` = ? WHERE `id` = ?");
    $stmt->bind_param("ii", $text, $match[1]);
    $stmt->execute();
    $stmt->close();

    sendMessage("✅عملیات با موفقیت انجام شد", $removeKeyboard);

    $stmt = $connection->prepare("SELECT * FROM `increase_day`");
    $stmt->execute();
    $res = $stmt->get_result();
    $stmt->close();

    if ($res->num_rows == 0) {
        sendMessage('لیست پلن های زمانی خالی است ', json_encode([
            'inline_keyboard' => [
                [['text' => "افزودن پلن زمانی جدید", 'callback_data' => "addNewDayPlan"]],
                [['text' => $buttonValues['back_button'], 'callback_data' => "managePanel"]]
            ]
        ]));
        exit;
    }
    $keyboard = [];
    $keyboard[] = [['text' => "حذف", 'callback_data' => "NetFreedomVPN"], ['text' => "قیمت", 'callback_data' => "NetFreedomVPN"], ['text' => "تعداد روز", 'callback_data' => "NetFreedomVPN"]];
    while ($cat = $res->fetch_assoc()) {
        $id = $cat['id'];
        $title = $cat['volume'];
        $price = number_format($cat['price']) . " تومان";
        $acount = $cat['acount'];

        $keyboard[] = [['text' => "❌", 'callback_data' => "deleteDayPlan" . $id], ['text' => $price, 'callback_data' => "changeDayPlanPrice" . $id], ['text' => $title, 'callback_data' => "changeDayPlanDay" . $id]];
    }
    $keyboard[] = [['text' => "افزودن پلن زمانی جدید", 'callback_data' => "addNewDayPlan"]];
    $keyboard[] = [['text' => $buttonValues['back_button'], 'callback_data' => "managePanel"]];
    $msg = ' 📍 برای دیدن جزییات پلن زمانی روی آن بزنید👇';

    sendMessage($msg, json_encode([
        'inline_keyboard' => $keyboard
    ]));
}
if ($data == 'volumePlanSettings' and ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $stmt = $connection->prepare("SELECT * FROM `increase_plan`");
    $stmt->execute();
    $plans = $stmt->get_result();
    $stmt->close();

    if ($plans->num_rows == 0) {
        editText($message_id, 'لیست پلن های حجمی خالی است ', json_encode([
            'inline_keyboard' => [
                [['text' => "افزودن پلن حجمی جدید", 'callback_data' => "addNewVolumePlan"]],
                [['text' => $buttonValues['back_button'], 'callback_data' => "backplan"]]
            ]
        ]));
        exit;
    }
    $keyboard = [];
    $keyboard[] = [['text' => "حذف", 'callback_data' => "NetFreedomVPN"], ['text' => "قیمت", 'callback_data' => "NetFreedomVPN"], ['text' => "مقدار حجم", 'callback_data' => "NetFreedomVPN"]];
    while ($cat = $plans->fetch_assoc()) {
        $id = $cat['id'];
        $title = $cat['volume'];
        $price = number_format($cat['price']) . " تومان";

        $keyboard[] = [['text' => "❌", 'callback_data' => "deleteVolumePlan" . $id], ['text' => $price, 'callback_data' => "changeVolumePlanPrice" . $id], ['text' => $title, 'callback_data' => "changeVolumePlanVolume" . $id]];
    }
    $keyboard[] = [['text' => "افزودن پلن حجمی جدید", 'callback_data' => "addNewVolumePlan"]];
    $keyboard[] = [['text' => $buttonValues['back_button'], 'callback_data' => "backplan"]];
    $msg = ' 📍 برای دیدن جزییات پلن حجمی روی آن بزنید👇';

    $res = editText($message_id, $msg, json_encode([
        'inline_keyboard' => $keyboard
    ]));
    exit;
}
if ($data == 'addNewVolumePlan' and ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    setUser($data);
    delMessage();
    sendMessage("حجم و قیمت آن را بصورت زیر وارد کنید :
10-30000

مقدار اول حجم (10) گیگابایت
مقدار دوم قیمت (30000) تومان
 ", $cancelKey);
    exit;
}
if ($userInfo['step'] == "addNewVolumePlan" and $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $input = explode('-', $text);
    $volume = $input[0];
    $price = $input[1];
    $stmt = $connection->prepare("INSERT INTO `increase_plan` VALUES (NULL, ? ,?)");
    $stmt->bind_param("ii", $volume, $price);
    $stmt->execute();
    $stmt->close();

    sendMessage("پلن حجمی جدید با موفقیت اضافه شد", $removeKeyboard);
    sendMessage($mainValues['reached_main_menu'], getAdminKeys());
    setUser();
}
if (preg_match('/^deleteVolumePlan(\d+)/', (string)$data, $match) and ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $stmt = $connection->prepare("DELETE FROM `increase_plan` WHERE `id` = ?");
    $stmt->bind_param("i", $match[1]);
    $stmt->execute();
    $stmt->close();
    alert("پلن موردنظر با موفقیت حذف شد");


    $stmt = $connection->prepare("SELECT * FROM `increase_plan`");
    $stmt->execute();
    $plans = $stmt->get_result();
    $stmt->close();

    if ($plans->num_rows == 0) {
        editText($message_id, 'لیست پلن های حجمی خالی است ', json_encode([
            'inline_keyboard' => [
                [['text' => "افزودن پلن حجمی جدید", 'callback_data' => "addNewVolumePlan"]],
                [['text' => $buttonValues['back_button'], 'callback_data' => "managePanel"]]
            ]
        ]));
        exit;
    }
    $keyboard = [];
    $keyboard[] = [['text' => "حذف", 'callback_data' => "NetFreedomVPN"], ['text' => "قیمت", 'callback_data' => "NetFreedomVPN"], ['text' => "مقدار حجم", 'callback_data' => "NetFreedomVPN"]];
    while ($cat = $plans->fetch_assoc()) {
        $id = $cat['id'];
        $title = $cat['volume'];
        $price = number_format($cat['price']) . " تومان";

        $keyboard[] = [['text' => "❌", 'callback_data' => "deleteVolumePlan" . $id], ['text' => $price, 'callback_data' => "changeVolumePlanPrice" . $id], ['text' => $title, 'callback_data' => "changeVolumePlanVolume" . $id]];
    }
    $keyboard[] = [['text' => "افزودن پلن حجمی جدید", 'callback_data' => "addNewVolumePlan"]];
    $keyboard[] = [['text' => $buttonValues['back_button'], 'callback_data' => "managePanel"]];
    $msg = ' 📍 برای دیدن جزییات پلن حجمی روی آن بزنید👇';

    $res = editText($message_id, $msg, json_encode([
        'inline_keyboard' => $keyboard
    ]));
}
if (preg_match('/^changeVolumePlanPrice(\d+)/', (string)$data, $match) and ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    setUser($data);
    delMessage();
    sendMessage("قیمت جدید را وارد کنید:", $cancelKey);
    exit;
}
if (preg_match('/^changeVolumePlanPrice(\d+)/', (string)$userInfo['step'], $match) and $text != $buttonValues['cancel'] and ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $pid = $match[1];
    if (is_numeric($text)) {
        $stmt = $connection->prepare("UPDATE `increase_plan` SET `price` = ? WHERE `id` = ?");
        $stmt->bind_param("ii", $text, $pid);
        $stmt->execute();
        $stmt->close();
        sendMessage("عملیات با موفقیت انجام شد", $removeKeyboard);

        setUser();
        $stmt = $connection->prepare("SELECT * FROM `increase_plan`");
        $stmt->execute();
        $plans = $stmt->get_result();
        $stmt->close();

        if ($plans->num_rows == 0) {
            sendMessage('لیست پلن های حجمی خالی است ', json_encode([
                'inline_keyboard' => [
                    [['text' => "افزودن پلن حجمی جدید", 'callback_data' => "addNewVolumePlan"]],
                    [['text' => $buttonValues['back_button'], 'callback_data' => "managePanel"]]
                ]
            ]));
            exit;
        }
        $keyboard = [];
        $keyboard[] = [['text' => "حذف", 'callback_data' => "NetFreedomVPN"], ['text' => "قیمت", 'callback_data' => "NetFreedomVPN"], ['text' => "مقدار حجم", 'callback_data' => "NetFreedomVPN"]];
        while ($cat = $plans->fetch_assoc()) {
            $id = $cat['id'];
            $title = $cat['volume'];
            $price = number_format($cat['price']) . " تومان";

            $keyboard[] = [['text' => "❌", 'callback_data' => "deleteVolumePlan" . $id], ['text' => $price, 'callback_data' => "changeVolumePlanPrice" . $id], ['text' => $title, 'callback_data' => "changeVolumePlanVolume" . $id]];
        }
        $keyboard[] = [['text' => "افزودن پلن حجمی جدید", 'callback_data' => "addNewVolumePlan"]];
        $keyboard[] = [['text' => $buttonValues['back_button'], 'callback_data' => "managePanel"]];
        $msg = ' 📍 برای دیدن جزییات پلن حجمی روی آن بزنید👇';

        $res = sendMessage($msg, json_encode([
            'inline_keyboard' => $keyboard
        ]));
    } else {
        sendMessage("یک مقدار عددی و صحیح وارد کنید");
    }
}
if (preg_match('/^changeVolumePlanVolume(\d+)/', (string)$data) and ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    setUser($data);
    delMessage();
    sendMessage("حجم جدید را وارد کنید:", $cancelKey);
    exit;
}
if (preg_match('/^changeVolumePlanVolume(\d+)/', (string)$userInfo['step'], $match) and $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $pid = $match[1];
    $stmt = $connection->prepare("UPDATE `increase_plan` SET `volume` = ? WHERE `id` = ?");
    $stmt->bind_param("ii", $text, $pid);
    $stmt->execute();
    $stmt->close();
    sendMessage("✅عملیات با موفقیت انجام شد", $removeKeyboard);
    setUser();

    $stmt = $connection->prepare("SELECT * FROM `increase_plan`");
    $stmt->execute();
    $plans = $stmt->get_result();
    $stmt->close();

    if ($plans->num_rows == 0) {
        sendMessage('لیست پلن های حجمی خالی است ', json_encode([
            'inline_keyboard' => [
                [['text' => "افزودن پلن حجمی جدید", 'callback_data' => "addNewVolumePlan"]],
                [['text' => $buttonValues['back_button'], 'callback_data' => "managePanel"]]
            ]
        ]));
        exit;
    }
    $keyboard = [];
    $keyboard[] = [['text' => "حذف", 'callback_data' => "NetFreedomVPN"], ['text' => "قیمت", 'callback_data' => "NetFreedomVPN"], ['text' => "مقدار حجم", 'callback_data' => "NetFreedomVPN"]];
    while ($cat = $plans->fetch_assoc()) {
        $id = $cat['id'];
        $title = $cat['volume'];
        $price = number_format($cat['price']) . " تومان";

        $keyboard[] = [['text' => "❌", 'callback_data' => "deleteVolumePlan" . $id], ['text' => $price, 'callback_data' => "changeVolumePlanPrice" . $id], ['text' => $title, 'callback_data' => "changeVolumePlanVolume" . $id]];
    }
    $keyboard[] = [['text' => "افزودن پلن حجمی جدید", 'callback_data' => "addNewVolumePlan"]];
    $keyboard[] = [['text' => $buttonValues['back_button'], 'callback_data' => "managePanel"]];
    $msg = ' 📍 برای دیدن جزییات پلن حجمی روی آن بزنید👇';

    $res = sendMessage($msg, json_encode([
        'inline_keyboard' => $keyboard
    ]));
}

// --- Start of Range 3368 to 3430 ---
if (preg_match('/^marzbanHostSettings(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $stmt = $connection->prepare("SELECT * FROM `server_plans` WHERE `id` = ?");
    $stmt->bind_param('i', $match[1]);
    $stmt->execute();
    $serverId = $stmt->get_result()->fetch_assoc()['server_id'];
    $stmt->close();

    $hosts = getMarzbanHosts($serverId)->inbounds;
    $networkType = array();
    foreach ($hosts as $key => $inbound) {
        $networkType[] = [['text' => $inbound->tag, 'callback_data' => "selectHost{$match[1]}*_*{$inbound->protocol}*_*{$inbound->tag}"]];
    }
    $networkType[] = [['text' => $buttonValues['cancel'], 'callback_data' => "planDetails" . $match[1]]];
    $networkType = json_encode(['inline_keyboard' => $networkType]);
    editText($message_id, "لطفا نوع شبکه های این پلن را انتخاب کنید", $networkType);
}
if (preg_match('/^selectHost(?<planId>\d+)\*_\*(?<protocol>.+)\*_\*(?<tag>.*)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $saveBtn = "ذخیره ✅";
    unset($markup[count($markup) - 1]);
    if ($markup[count($markup) - 1][0]['text'] == $saveBtn)
        unset($markup[count($markup) - 1]);
    foreach ($markup as $key => $keyboard) {
        if ($keyboard[0]['callback_data'] == $data)
            $markup[$key][0]['text'] = $keyboard['0']['text'] == $match['tag'] . " ✅" ? $match['tag'] : $match['tag'] . " ✅";
    }

    if (strstr(json_encode($markup, JSON_UNESCAPED_UNICODE), "✅") && !strstr(json_encode($markup, JSON_UNESCAPED_UNICODE), $saveBtn)) {
        $markup[] = [['text' => $saveBtn, 'callback_data' => "saveServerHost" . $match['planId']]];
    }
    $markup[] = [['text' => $buttonValues['cancel'], 'callback_data' => "planDetails" . $match['planId']]];
    $markup = json_encode(['inline_keyboard' => array_values($markup)]);
    editKeys($markup);
}
if (preg_match('/^saveServerHost(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $inbounds = array();
    $proxies = array();
    unset($markup[count($markup) - 1]);
    unset($markup[count($markup) - 1]);

    foreach ($markup as $key => $value) {
        $tag = trim(str_replace("✅", "", $value[0]['text'], $state));
        if ($state > 0) {
            preg_match('/^selectHost(?<serverId>\d+)\*_\*(?<protocol>.+)\*_\*(?<tag>.*)/', $value[0]['callback_data'], $info);
            $inbounds[$info['protocol']][] = $tag;
            $proxies[$info['protocol']] = array();

            if ($info['protocol'] == "vless") {
                $proxies["vless"] = ["flow" => ""];
            } elseif ($info['protocol'] == "shadowsocks") {
                $proxies["shadowsocks"] = ['method' => "chacha20-ietf-poly1305"];
            }
        }
    }
    $info = json_encode(['inbounds' => $inbounds, 'proxies' => $proxies]);
    $stmt = $connection->prepare("UPDATE `server_plans` SET `custom_sni`=? WHERE `id`=?");
    $stmt->bind_param("si", $info, $match[1]);
    $stmt->execute();
    $stmt->close();

    editText($message_id, "با موفقیت ذخیره شد", getPlanDetailsKeys($match[1]));
    setUser();
}

if (($data == 'addNewPlan' || $data == "addNewRahgozarPlan" || $data == "addNewMarzbanPlan" || $data == "addNewAgentPlan") && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    delMessage();
    setUser($data, 'temp');

    $stmt = $connection->prepare("DELETE FROM `server_plans` WHERE `active` = 0");
    $stmt->execute();
    $stmt->close();

    $planType = ($data == "addNewAgentPlan") ? "agent_quota" : "client_centric";
    $rahgozarVal = ($data == "addNewRahgozarPlan") ? 1 : 0;
    $timeVal = (string)time();
    $stmt = $connection->prepare("INSERT INTO `server_plans` (`fileid`, `catid`, `server_id`, `inbound_id`, `acount`, `limitip`, `title`, `protocol`, `days`, `volume`, `type`, `price`, `descr`, `pic`, `active`, `step`, `date`, `rahgozar`) VALUES ('', 0, 0, 0, 0, 0, '', '', 0, 0, ?, 0, '', '', 0, 1, ?, ?)");
    $stmt->bind_param("ssi", $planType, $timeVal, $rahgozarVal);
    $stmt->execute();
    $stmt->close();

    $msg = "✍️ مرحله اول:\n▪️لطفاً یک نام یا عنوان برای این پلن انتخاب کنید (مثلا: پلن یک‌ماهه VIP):";
    $keyboard = json_encode(['inline_keyboard' => [[['text' => "❌ انصراف", 'callback_data' => "mainMenu"]]]]);

    $res = bot('sendMessage', [
        'chat_id' => $from_id,
        'text' => wizwiz_getPlanSummaryTxt([]) . $msg,
        'reply_markup' => $keyboard,
        'parse_mode' => "HTML"
    ]);

    $prompt_id = $message_id + 1;
    if (is_string($res)) {
        $resDecoded = json_decode($res, true);
        if (isset($resDecoded['result']['message_id'])) $prompt_id = $resDecoded['result']['message_id'];
    } elseif (is_object($res)) {
        if (isset($res->result->message_id)) $prompt_id = $res->result->message_id;
    } elseif (is_array($res)) {
        if (isset($res['result']['message_id'])) $prompt_id = $res['result']['message_id'];
    }

    setUser('addPlanTitle' . json_encode(['prompt_id' => $prompt_id], JSON_UNESCAPED_UNICODE));
    exit();
}

if (preg_match('/^addPlanTitle(.*)/', (string)$userInfo['step'], $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    $d = json_decode($match[1], true);
    $d['title'] = $text;

    $stmt = $connection->prepare("UPDATE `server_plans` SET `title` = ? WHERE `active` = 0");
    $stmt->bind_param("s", $text);
    $stmt->execute();
    $stmt->close();

    $msg = "💰 مرحله دوم:\n▪️لطفاً قیمت پلن را به <b>تومان</b> وارد کنید (فقط عدد):";
    $keyboard = json_encode(['inline_keyboard' => [
        [['text' => "🔙 مرحله قبل", 'callback_data' => "backPlanStep_addPlanTitle", 'style' => 'danger', 'icon_custom_emoji_id' => '5352759161945867747']],
        [['text' => "❌ انصراف", 'callback_data' => "mainMenu", 'style' => 'danger', 'icon_custom_emoji_id' => '5215680783863261658']]
    ]]);

    bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $d['prompt_id'], 'text' => wizwiz_getPlanSummaryTxt($d) . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
    setUser('addPlanPrice' . json_encode($d, JSON_UNESCAPED_UNICODE));
    exit();
}

if (preg_match('/^addPlanPrice(.*)/', (string)$userInfo['step'], $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    $d = json_decode($match[1], true);

    if (!is_numeric($text)) {
        $msg = "⚠️ <b>خطا: قیمت وارد شده باید کاملاً عددی باشد!</b>\n\n▪️لطفاً قیمت پلن را مجدداً به تومان وارد کنید:";
        $keyboard = json_encode(['inline_keyboard' => [[['text' => "🔙 مرحله قبل", 'callback_data' => "backPlanStep_addPlanTitle", 'style' => 'danger', 'icon_custom_emoji_id' => '5352759161945867747']], [['text' => "❌ انصراف", 'callback_data' => "mainMenu", 'style' => 'danger', 'icon_custom_emoji_id' => '5215680783863261658']]]]);
        bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $d['prompt_id'], 'text' => wizwiz_getPlanSummaryTxt($d) . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
        exit();
    }

    $d['price'] = $text;
    $stmt = $connection->prepare("UPDATE `server_plans` SET `price` = ? WHERE `active` = 0");
    $stmt->bind_param("s", $text);
    $stmt->execute();
    $stmt->close();

    $msg = "📃 <b>مرحله سوم: توضیحات پلن</b>\n\nلطفاً توضیحات پلن را وارد کنید (مثلا ویژگی‌های خاص یا اطلاعات اتصال):\n\n💡 (اگر نمی‌خواهید توضیحی بنویسید، عبارت <code>بدون توضیحات</code> یا یک علامت مثل <code>.</code> بفرستید)";
    $keyboard = json_encode(['inline_keyboard' => [
        [['text' => "🔙 مرحله قبل", 'callback_data' => "backPlanStep_addPlanPrice", 'style' => 'danger', 'icon_custom_emoji_id' => '5352759161945867747']],
        [['text' => "❌ انصراف", 'callback_data' => "mainMenu", 'style' => 'danger', 'icon_custom_emoji_id' => '5215680783863261658']]
    ]]);

    bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $d['prompt_id'], 'text' => wizwiz_getPlanSummaryTxt($d) . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
    setUser('addPlanDescr' . json_encode($d, JSON_UNESCAPED_UNICODE));
    exit();
}

if (preg_match('/^addPlanDescr(.*)/', (string)$userInfo['step'], $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    $d = json_decode($match[1], true);

    $d['descr'] = $text;
    $stmt = $connection->prepare("UPDATE `server_plans` SET `descr` = ? WHERE `active` = 0");
    $stmt->bind_param("s", $text);
    $stmt->execute();
    $stmt->close();

    $msg = "📂 مرحله چهارم:\n▪️لطفاً یک دسته بندی برای این پلن از لیست زیر انتخاب کنید:";
    $inline_keyboard = [];
    $stmt = $connection->prepare("SELECT * FROM `server_categories` WHERE `parent` = 0 AND `active` = 1");
    $stmt->execute();
    $cats = $stmt->get_result();
    $stmt->close();

    while ($cat = $cats->fetch_assoc()) {
        $inline_keyboard[] = [['text' => "📁 " . $cat['title'], 'callback_data' => "setPlanCat_" . $cat['id'] . "_" . $cat['title']]];
    }
    $inline_keyboard[] = [['text' => "🔙 مرحله قبل", 'callback_data' => "backPlanStep_addPlanDescr", 'style' => 'danger', 'icon_custom_emoji_id' => '5352759161945867747']];
    $inline_keyboard[] = [['text' => "❌ انصراف", 'callback_data' => "mainMenu", 'style' => 'danger', 'icon_custom_emoji_id' => '5215680783863261658']];

    bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $d['prompt_id'], 'text' => wizwiz_getPlanSummaryTxt($d) . $msg, 'reply_markup' => json_encode(['inline_keyboard' => $inline_keyboard]), 'parse_mode' => "HTML"]);
    setUser('addPlanCategory' . json_encode($d, JSON_UNESCAPED_UNICODE));
    exit();
}

if (preg_match('/^setPlanCat_(?<id>\d+)_(?<title>.+)/', (string)$data, $catMatch) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    preg_match('/^[a-zA-Z]+({.*})/', $userInfo['step'], $jsonMatch);
    $d = json_decode($jsonMatch[1], true) ?? [];

    $d['catid'] = $catMatch['id'];
    $d['cat_name'] = $catMatch['title'];

    $stmt = $connection->prepare("UPDATE `server_plans` SET `catid` = ? WHERE `active` = 0");
    $stmt->bind_param("i", $catMatch['id']);
    $stmt->execute();
    $stmt->close();

    $msg = "🖥 <b>مرحله چهارم: انتخاب سرور میزبان</b>\n\nلطفاً سروری که می‌خواهید این پلن روی آن تعریف و لیست شود را انتخاب کنید:";
    $inline_keyboard = [];
    $stmt = $connection->prepare("SELECT * FROM `server_info` WHERE `active` = 1");
    $stmt->execute();
    $servers = $stmt->get_result();
    $stmt->close();

    while ($srv = $servers->fetch_assoc()) {
        $inline_keyboard[] = [['text' => "🖥 " . $srv['title'], 'callback_data' => "setPlanServer_" . $srv['id'] . "_" . $srv['title']]];
    }
    $inline_keyboard[] = [['text' => "🔙 مرحله قبل", 'callback_data' => "backPlanStep_addPlanCategory", 'style' => 'danger', 'icon_custom_emoji_id' => '5352759161945867747']];
    $inline_keyboard[] = [['text' => "❌ انصراف", 'callback_data' => "mainMenu", 'style' => 'danger', 'icon_custom_emoji_id' => '5215680783863261658']];

    bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $d['prompt_id'], 'text' => wizwiz_getPlanSummaryTxt($d) . $msg, 'reply_markup' => json_encode(['inline_keyboard' => $inline_keyboard]), 'parse_mode' => "HTML"]);
    setUser('addPlanServerStep' . json_encode($d, JSON_UNESCAPED_UNICODE));
    exit();
}

if (preg_match('/^setPlanServer_(?<id>\d+)_(?<title>.+)/', (string)$data, $srvMatch) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    preg_match('/^[a-zA-Z]+({.*})/', $userInfo['step'], $jsonMatch);
    $d = json_decode($jsonMatch[1], true) ?? [];

    $d['server_id'] = $srvMatch['id'];
    $d['server_name'] = $srvMatch['title'];

    $stmt = $connection->prepare("UPDATE `server_plans` SET `server_id` = ? WHERE `active` = 0");
    $stmt->bind_param("i", $srvMatch['id']);
    $srvOk = $stmt->execute();
    $stmt->close();

    if ($userInfo['temp'] == 'addNewAgentPlan') {
        $d['limitip'] = 0;
        $d['target_inbounds'] = 'all';

        $stmt = $connection->prepare("UPDATE `server_plans` SET `limitip` = 0, `inbound_id` = '0' WHERE `active` = 0");
        $stmt->execute();
        $stmt->close();

        $msg = "👥 <b>مرحله پنجم (نمایندگان): تعیین تعداد اکانت‌های مجاز نمایندگی</b>\n\nلطفاً مشخص کنید نماینده با خرید این پلن حداکثر چند اکانت می‌تواند ایجاد کند؟\n\n💡 (جهت بدون محدودیت بودن عدد <code>0</code> را ارسال کنید)";
        $keyboard = json_encode(['inline_keyboard' => [[['text' => "❌ انصراف", 'callback_data' => "mainMenu"]]]]);
        $summaryPrefix = wizwiz_getPlanSummaryTxt($d) . "---------------------------------------\n";

        bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $d['prompt_id'], 'text' => $summaryPrefix . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
        setUser('addPlanAgentAccountsStep' . json_encode($d, JSON_UNESCAPED_UNICODE));
        exit();
    }

    // 🆕 ورود به گام تعیین تعداد کاربر
    $msg = "🧲 <b>مرحله پنجم: تعیین تعداد کاربر (محدودیت IP هم‌زمان)</b>\n\nلطفاً مشخص کنید چند کاربر به صورت هم‌زمان می‌توانند از کانفیگ‌های این پلن استفاده کنند؟\n\n💡 <b>مثال:</b> عدد <code>2</code> یعنی اتصال حداکثر ۲ دستگاه هم‌زمان.\n🔻 (جهت بدون محدودیت بودن عدد <code>0</code> را ارسال کنید)";
    $keyboard = json_encode(['inline_keyboard' => [
        [['text' => "🔙 مرحله قبل", 'callback_data' => "backPlanStep_addPlanServerStep", 'style' => 'danger', 'icon_custom_emoji_id' => '5352759161945867747']],
        [['text' => "❌ انصراف", 'callback_data' => "mainMenu", 'style' => 'danger', 'icon_custom_emoji_id' => '5215680783863261658']]
    ]]);

    bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $d['prompt_id'], 'text' => wizwiz_getPlanSummaryTxt($d) . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
    setUser('addPlanLimitIPStep' . json_encode($d, JSON_UNESCAPED_UNICODE));
    exit();
}

if (preg_match('/^addPlanAgentAccountsStep(.*)/', (string)$userInfo['step'], $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    $d = json_decode($match[1], true);

    if (!is_numeric($text) || intval($text) < 0) {
        $msg = "⚠️ <b>خطا: لطفاً مقدار را فقط به صورت عدد مثبت یا 0 وارد کنید!</b>\n\nلطفاً تعداد مجاز اکانت را ارسال کنید (0 = نامحدود):";
        $keyboard = json_encode(['inline_keyboard' => [[['text' => "❌ انصراف", 'callback_data' => "mainMenu"]]]]);
        bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $d['prompt_id'], 'text' => wizwiz_getPlanSummaryTxt($d) . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
        exit();
    }

    $accountsCount = intval($text);
    $d['acount'] = $accountsCount;

    $stmt = $connection->prepare("UPDATE `server_plans` SET `acount` = ? WHERE `active` = 0");
    $stmt->bind_param("i", $accountsCount);
    $stmt->execute();
    $stmt->close();

    $msg = "📅🔋 <b>مرحله نهایی (نمایندگان): تنظیم زمان (روز) و حجم (گیگابایت)</b>\n\n" .
        "لطفاً مقدار زمان و حجم مجاز این پلن نمایندگی را دقیقاً با فرمت زیر ارسال کنید:\n" .
        "<code>تعداد روز/حجم به گیگابایت</code>\n\n" .
        "📝 <b>مثال‌های ورودی:</b>\n" .
        "👈 ۳۰ روزه با حجم ۵۰ گیگابایت 🔻 <code>30/50</code>\n" .
        "👈 ۹۰ روزه با حجم نامحدود 🔻 <code>90/0</code>";

    $keyboard = json_encode(['inline_keyboard' => [[['text' => "❌ انصراف", 'callback_data' => "mainMenu"]]]]);
    $summaryPrefix = wizwiz_getPlanSummaryTxt($d) . "---------------------------------------\n";

    bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $d['prompt_id'], 'text' => $summaryPrefix . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
    setUser('saveFinalPlanParams' . json_encode($d, JSON_UNESCAPED_UNICODE));
    exit();
}

// 🆕 پردازش و ذخیره تعداد کاربر و ورود به مرحله اتصال اینباندها
if (preg_match('/^addPlanLimitIPStep(.*)/', (string)$userInfo['step'], $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    $d = json_decode($match[1], true);

    if (!is_numeric($text)) {
        $msg = "⚠️ <b>خطا: لطفاً مقدار را فقط به صورت عدد وارد کنید!</b>\n\nلطفاً تعداد مجاز کاربر (اتصال هم‌زمان) را ارسال کنید (0 = نامحدود):";
        $keyboard = json_encode(['inline_keyboard' => [[['text' => "🔙 مرحله قبل", 'callback_data' => "backPlanStep_addPlanServerStep"]], [['text' => "❌ انصراف", 'callback_data' => "mainMenu"]]]]);
        bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $d['prompt_id'], 'text' => wizwiz_getPlanSummaryTxt($d) . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
        exit();
    }

    $d['limitip'] = intval($text);
    $stmt = $connection->prepare("UPDATE `server_plans` SET `limitip` = ? WHERE `active` = 0");
    $stmt->bind_param("i", $d['limitip']);
    $stmt->execute();
    $stmt->close();

    $msg = "🌐 <b>مرحله ششم (تنظیمات اینباندها در متد کلاینت‌محور):</b>\n\n" .
        "در نسخه جدید، کاربر مستقیماً به اینباندهای انتخابی شما متصل (Attach) می‌شود.\n\n" .
        "👇 <b>یکی از روش‌های زیر را برای تعیین دسترسی انتخاب کنید:</b>\n" .
        "۱. کلیک روی دکمه <b>«اتصال به همه اینباندها 🌐»</b>\n" .
        "۲. وارد کردن آیدی یا آیدی‌های اینباند به صورت متنی (مثال: <code>1</code> یا برای چند اینباند به صورت کاما پورت: <code>1,2,5</code>)";

    $keyboard = json_encode(['inline_keyboard' => [
        [['text' => "🌐 اتصال به همه اینباندها", 'callback_data' => "connectAllInbounds"]],
        [['text' => "🔙 مرحله قبل", 'callback_data' => "backPlanStep_addPlanLimitIPStep", 'style' => 'danger', 'icon_custom_emoji_id' => '5352759161945867747']],
        [['text' => "❌ انصراف", 'callback_data' => "mainMenu", 'style' => 'danger', 'icon_custom_emoji_id' => '5215680783863261658']]
    ]]);

    bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $d['prompt_id'], 'text' => wizwiz_getPlanSummaryTxt($d) . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
    setUser('addPlanInbounds' . json_encode($d, JSON_UNESCAPED_UNICODE));
    exit();
}

if ((preg_match('/^addPlanInbounds(.*)/', (string)$userInfo['step'], $match) && $text != $buttonValues['cancel']) || ($data == "connectAllInbounds" && ($from_id == $admin || $userInfo['isAdmin'] == true))) {
    if ($data == "connectAllInbounds") {
        preg_match('/^[a-zA-Z]+({.*})/', $userInfo['step'], $jsonMatch);
        $d = json_decode($jsonMatch[1], true) ?? [];
        $d['target_inbounds'] = 'all';
    } else {
        bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
        $d = json_decode($match[1], true);
        $d['target_inbounds'] = str_replace(' ', '', $text);
    }

    $msg = "📅🔋 <b>مرحله آخر: تنظیم زمان (روز) و حجم (گیگابایت)</b>\n\n" .
        "لطفاً مقدار زمان و حجم مجاز پلن را دقیقاً با فرمت یکپارچه زیر ارسال کنید:\n" .
        "<code>تعداد روز/حجم به گیگابایت</code>\n\n" .
        "📝 <b>مثال‌های ورودی:</b>\n" .
        "👈 پلن ۳۰ روزه با حجم ۵۰ گیگابایت 🔻 <code>30/50</code>\n" .
        "👈 پلن ۹۰ روزه با حجم نامحدود 🔻 <code>90/0</code>";

    $keyboard = json_encode(['inline_keyboard' => [[['text' => "❌ انصراف", 'callback_data' => "mainMenu", 'style' => 'danger', 'icon_custom_emoji_id' => '5215680783863261658']]]]);

    $summaryPrefix = wizwiz_getPlanSummaryTxt($d) . "▪️ اینباندهای متصل: " . (($d['target_inbounds'] == 'all') ? "همه اینباندهای فعال پنل 🌐" : "آیدی‌های " . $d['target_inbounds']) . "\n---------------------------------------\n";

    bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $d['prompt_id'], 'text' => $summaryPrefix . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
    setUser('saveFinalPlanParams' . json_encode($d, JSON_UNESCAPED_UNICODE));
    exit();
}

if (preg_match('/^saveFinalPlanParams(.*)/', (string)$userInfo['step'], $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    $d = json_decode($match[1], true);

    if (!preg_match('/^(\d+)\/(\d+)$/', $text, $planParams)) {
        $msg = "⚠️ <b>خطا: فرمت وارد شده نامعتبر است!</b>\n\nلطفاً دقیقاً به صورت <code>روز/حجم</code> وارد کنید (مثال: 30/50):";
        $keyboard = json_encode(['inline_keyboard' => [[['text' => "❌ انصراف", 'callback_data' => "mainMenu", 'style' => 'danger', 'icon_custom_emoji_id' => '5215680783863261658']]]]);
        bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $d['prompt_id'], 'text' => wizwiz_getPlanSummaryTxt($d) . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
        exit();
    }

    $days = intval($planParams[1]);
    $volume = intval($planParams[2]);
    $inboundIdsArray = [];

    $stmt = $connection->prepare("SELECT * FROM `server_config` WHERE `id` = ?");
    $stmt->bind_param("i", $d['server_id']);
    $stmt->execute();
    $srvConfig = $stmt->get_result()->fetch_assoc();
    $stmt->close();

    if ($userInfo['temp'] == 'addNewAgentPlan') {
        $inboundIdsString = '0';
    } else {
        if ($d['target_inbounds'] == 'all') {
            $inboundIdsString = '0';
        } else {
            $inboundIdsArray = array_map('intval', explode(',', $d['target_inbounds']));
            if (empty($inboundIdsArray)) $inboundIdsArray = [1];
            $inboundIdsString = implode(',', $inboundIdsArray);
        }
    }

    // به‌روزرسانی نهایی سطر فعال پلن و فعال‌سازی آن (`active`=1)
    $stmt = $connection->prepare("UPDATE `server_plans` SET `days` = ?, `volume` = ?, `inbound_id` = ?, `active` = 1, `step` = 10 WHERE `active` = 0");
    $stmt->bind_param("iis", $days, $volume, $inboundIdsString);
    $stmt->execute();
    $stmt->close();

    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $d['prompt_id']]);

    $successTxt = "🎉 <b>پلن با موفقیت ایجاد و فعال شد!</b>\n\n" .
        "ℹ️ این پلن روی سرور <b>{$d['server_name']}</b> با سقف محدودیت دستگاه هم‌زمان <code>" . ($d['limitip'] == 0 ? "نامحدود" : $d['limitip']) . "</code> با موفقیت ذخیره شد.";

    sendMessage($successTxt, $removeKeyboard);

    $serverListKeys = getServerListKeys();
    sendMessage("☑️ مدیریت سرور ها", $serverListKeys);
    setUser();
    exit();
}

// -------------------------------------------------------------------------
// ۱. منوی اصلی مدیریت پلن ها
// -------------------------------------------------------------------------
if ($data == 'backplan' && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    // واکشی دسته‌بندی‌ها یا سرورها برای نمایش تفکیک شده پلن‌ها
    $stmt = $connection->prepare("SELECT * FROM `server_info` WHERE `active` = 1");
    $stmt->execute();
    $res = $stmt->get_result();
    $stmt->close();

    $keyboard = [];
    while ($cat = $res->fetch_assoc()) {
        $id = $cat['id'];
        $title = $cat['title'];
        $keyboard[] = ['text' => "📊 پلن‌های سرور: $title", 'callback_data' => "plansList$id"];
    }
    $keyboard = array_chunk($keyboard, 1); // نمایش زیر هم سرورها برای خوانایی بیشتر

    // دکمه‌های افزودن پلن بر اساس ساختار جدید کلاینت‌محور
    $keyboard[] = [['text' => "⚙️ تنظیمات پلن دلخواه (بر اساس مصرف)", 'callback_data' => "editCustomPlan"]];
    $keyboard[] = [['text' => '➕ افزودن پلن جدید X-UI', 'callback_data' => "addNewPlan"]];
    $keyboard[] = [['text' => '➕ افزودن پلن جدید نمایندگان', 'callback_data' => "addNewAgentPlan"]];
    $keyboard[] = [
        ['text' => '➕ پلن رهگذر', 'callback_data' => "addNewRahgozarPlan"],
        ['text' => "➕ پلن مرزبان", 'callback_data' => "addNewMarzbanPlan"]
    ];
    $keyboard[] = [['text' => $buttonValues['back_button'], 'callback_data' => "managePanel"]];

    $msg = "⚙️ <b>به بخش مدیریت پلن‌های ربات خوش آمدید:</b>\n\nلطفاً جهت مشاهده و ویرایش پلن‌های موجود روی سرور مورد نظر کلیک کنید یا یک پلن جدید ایجاد کنید:";

    if (isset($data) && $data == 'backplan') {
        bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $message_id, 'text' => $msg, 'reply_markup' => json_encode(['inline_keyboard' => $keyboard]), 'parse_mode' => "HTML"]);
    } else {
        bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
        sendMessage($msg, json_encode(['inline_keyboard' => $keyboard]), "HTML");
    }
    exit;
}

// -------------------------------------------------------------------------
// ۲. تنظیمات پلن دلخواه (بر اساس گیگ و روز) - نسخه اصلاح شده و پایدار
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
// بخش اول: دریافت متن (عدد) از سمت ادمین - با بالاترین اولویت (اصلاح شده)
// -------------------------------------------------------------------------

// --- Start of Range 4387 to 4497 ---
if (empty($data) && preg_match('/^editCustom(gbPrice|dayPrice|agentAccountPrice)/', (string)$userInfo['step'], $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]); // حذف فوری عددی که ادمین فرستاده

    // بررسی دکمه انصراف (😪 منصرف شدم بیخیال)
    if ($text == $buttonValues['cancel'] || $text == '😪 منصرف شدم بیخیال') {
        setUser();
        sendMessage("✖️ عملیات تغییر قیمت لغو شد.", getAdminKeys()); // بازگرداندن کیبورد اصلی مدیریت

        // لود مجدد منوی اصلی پلن دلخواه به صورت یک پیام جدید
        $gbPrice = number_format(intval($botState['gbPrice'] ?? 0)) . " تومان";
        $dayPrice = number_format(intval($botState['dayPrice'] ?? 0)) . " تومان";
        $agentAccountPrice = number_format(intval($botState['agentAccountPrice'] ?? 10000)) . " تومان";
        $keys = json_encode(['inline_keyboard' => [
            [['text' => $gbPrice, 'callback_data' => "editCustomgbPrice"], ['text' => "💰 هزینه هر گیگابایت مصرف:", 'callback_data' => "NetFreedomVPN"]],
            [['text' => $dayPrice, 'callback_data' => "editCustomdayPrice"], ['text' => "📅 هزینه هر روز اعتبار:", 'callback_data' => "NetFreedomVPN"]],
            [['text' => $agentAccountPrice, 'callback_data' => "editCustomagentAccountPrice"], ['text' => "👤 هزینه هر اکانت نماینده:", 'callback_data' => "NetFreedomVPN"]],
            [['text' => "🔙 بازگشت به مدیریت پلن‌ها", 'callback_data' => "backplan"]]
        ]]);
        $msg = "⚙️ <b>تنظیمات قیمت‌گذاری پلن دلخواه (هوشمند):</b>\n\n👇 برای تغییر هر نرخ روی دکمه قیمت آن کلیک کنید:";
        sendMessage($msg, $keys, "HTML");
        exit();
    }

    if (is_numeric($text)) {
        $targetKey = $match[1]; // gbPrice یا dayPrice یا agentAccountPrice

        // ذخیره قطعی در تنظیمات دیتابیس
        setSettings($targetKey, $text);

        // به‌روزرسانی آنی آرایه وضعیت ربات برای لود صحیح دکمه‌ها
        $botState[$targetKey] = $text;

        sendMessage("✅ مبلغ جدید با موفقیت روی <code>" . number_format(intval($text)) . " تومان</code> تنظیم شد.", getAdminKeys(), "HTML");

        // ✨ تولید مستقیم و بدون خطای منوی شیشه‌ای جدید پس از ثبت موفقیت
        $gbPrice = number_format(intval($botState['gbPrice'] ?? 0)) . " تومان";
        $dayPrice = number_format(intval($botState['dayPrice'] ?? 0)) . " تومان";
        $agentAccountPrice = number_format(intval($botState['agentAccountPrice'] ?? 10000)) . " تومان";

        $keys = json_encode(['inline_keyboard' => [
            [
                ['text' => $gbPrice, 'callback_data' => "editCustomgbPrice"],
                ['text' => "💰 هزینه هر گیگابایت مصرف:", 'callback_data' => "NetFreedomVPN"]
            ],
            [
                ['text' => $dayPrice, 'callback_data' => "editCustomdayPrice"],
                ['text' => "📅 هزینه هر روز اعتبار:", 'callback_data' => "NetFreedomVPN"]
            ],
            [
                ['text' => $agentAccountPrice, 'callback_data' => "editCustomagentAccountPrice"],
                ['text' => "👤 هزینه هر اکانت نماینده:", 'callback_data' => "NetFreedomVPN"]
            ],
            [
                ['text' => "🔙 بازگشت به مدیریت پلن‌ها", 'callback_data' => "backplan"]
            ]
        ]]);

        $msg = "⚙️ <b>تنظیمات قیمت‌گذاری پلن دلخواه (هوشمند):</b>\n\nکاربران در این بخش می‌توانند حجم و زمان دلخواه خود را تعیین کنند و ربات بر اساس نرخ‌های زیر قیمت نهایی را محاسبه می‌کند.\n👇 برای تغییر هر نرخ روی دکمه قیمت آن کلیک کنید:";

        sendMessage($msg, $keys, "HTML");
        setUser(); // پاک کردن استپ کاربر
        exit();
    } else {
        sendMessage("⚠️ لطفاً فقط مقدار عددی و بدون حروف وارد کنید (مثال: 11000):", $cancelKey);
        exit();
    }
}

// -------------------------------------------------------------------------
// بخش دوم: نمایش و مدیریت منوی شیشه‌ای پلن دلخواه (از طریق Callback کلیک دکمه)
// -------------------------------------------------------------------------
if (!empty($data) && $data == "editCustomPlan" && ($from_id == $admin || $userInfo['isAdmin'] == true)) {

    $gbPrice = number_format(intval($botState['gbPrice'] ?? 0)) . " تومان";
    $dayPrice = number_format(intval($botState['dayPrice'] ?? 0)) . " تومان";
    $agentAccountPrice = number_format(intval($botState['agentAccountPrice'] ?? 10000)) . " تومان";

    $keys = json_encode(['inline_keyboard' => [
        [
            ['text' => $gbPrice, 'callback_data' => "editCustomgbPrice"],
            ['text' => "💰 هزینه هر گیگابایت مصرف:", 'callback_data' => "NetFreedomVPN"]
        ],
        [
            ['text' => $dayPrice, 'callback_data' => "editCustomdayPrice"],
            ['text' => "📅 هزینه هر روز اعتبار:", 'callback_data' => "NetFreedomVPN"]
        ],
        [
            ['text' => $agentAccountPrice, 'callback_data' => "editCustomagentAccountPrice"],
            ['text' => "👤 هزینه هر اکانت نماینده:", 'callback_data' => "NetFreedomVPN"]
        ],
        [
            ['text' => "🔙 بازگشت به مدیریت پلن‌ها", 'callback_data' => "backplan"]
        ]
    ]]);

    $msg = "⚙️ <b>تنظیمات قیمت‌گذاری پلن دلخواه (هوشمند):</b>\n\nکاربران در این بخش می‌توانند حجم و زمان دلخواه خود را تعیین کنند و ربات بر اساس نرخ‌های زیر قیمت نهایی را محاسبه می‌کند.\n👇 برای تغییر هر نرخ روی دکمه قیمت آن کلیک کنید:";

    bot('editMessageText', [
        'chat_id' => $from_id,
        'message_id' => $message_id,
        'text' => $msg,
        'reply_markup' => $keys,
        'parse_mode' => "HTML"
    ]);
    setUser();
    exit();
}

// -------------------------------------------------------------------------
// بخش سوم: کال‌بک کلیک روی دکمه‌های قیمت (ورود به حالت دریافت متن)
// -------------------------------------------------------------------------
if (!empty($data) && preg_match('/^editCustom(gbPrice|dayPrice|agentAccountPrice)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    delMessage(); // حذف منوی شیشه‌ای قبلی
    if ($match[1] == "dayPrice") {
        $title = "هر روز اعتبار مجاز";
    } elseif ($match[1] == "agentAccountPrice") {
        $title = "هر اکانت مجاز نماینده (سهمیه)";
    } else {
        $title = "هر گیگابایت ترافیک مصرفی";
    }

    sendMessage("✍️ لطفاً هزینه مربوط به <b>" . $title . "</b> را به <b>تومان</b> وارد کنید:", $cancelKey, "HTML");
    setUser($data); // قرار دادن کاربر در استپ (مثلاً editCustomgbPrice)
    exit();
}

// -------------------------------------------------------------------------
// ۳. لیست کردن پلن‌های یک سرور مشخص جهت ویرایش
// -------------------------------------------------------------------------

// --- Start of Range 4498 to 4673 ---
if (preg_match('/plansList(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $stmt = $connection->prepare("SELECT * FROM `server_plans` WHERE `server_id` = ? ORDER BY `id` ASC");
    $stmt->bind_param("i", $match[1]);
    $stmt->execute();
    $res = $stmt->get_result();
    $stmt->close();

    if ($res->num_rows == 0) {
        alert("متاسفانه، هنوز هیچ پلنی برای این سرور تعریف نکرده‌اید! 😑");
        exit;
    } else {
        $keyboard = [];
        while ($cat = $res->fetch_assoc()) {
            $id = $cat['id'];
            $title = $cat['title'];
            $keyboard[] = ['text' => "📦 پلن #$id | $title", 'callback_data' => "planDetails$id"];
        }
        $keyboard = array_chunk($keyboard, 1);
        $keyboard[] = [['text' => "🔙 بازگشت به قبل", 'callback_data' => "backplan"]];

        $msg = '📂 <b>لیست پلن‌های فعال این سرور:</b>\n\nجهت ورود به پنل ویرایش تخصصی هر پلن، روی آن کلیک کنید:';
        bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $message_id, 'text' => $msg, 'reply_markup' => json_encode(['inline_keyboard' => $keyboard]), 'parse_mode' => "HTML"]);
    }
    exit();
}

if (preg_match('/planDetails(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $keys = getPlanDetailsKeys($match[1]);
    if ($keys == null) {
        alert("مشخصات پلن یافت نشد!");
        exit;
    } else {
        bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $message_id, 'text' => "🛠 <b>پنل تنظیمات و ویرایش تخصصی پلن #" . $match[1] . "</b>\n\nاز گزینه‌های زیر جهت ویرایش پارامترها استفاده کنید:", 'reply_markup' => $keys, 'parse_mode' => "HTML"]);
    }
}

// -------------------------------------------------------------------------
// ۴. حذف پلن
// -------------------------------------------------------------------------
if (preg_match('/^wizwizplandelete(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $stmt = $connection->prepare("DELETE FROM `server_plans` WHERE `id` = ?");
    $stmt->bind_param("i", $match[1]);
    $stmt->execute();
    $stmt->close();
    alert("پلن مورد نظر با موفقیت حذف شد! 🗑");

    // بازگشت خودکار به منوی اصلی مدیریت پلن‌ها با ادیت پیام
    $stmt = $connection->prepare("SELECT * FROM `server_info` WHERE `active` = 1");
    $stmt->execute();
    $res = $stmt->get_result();
    $stmt->close();
    $keyboard = [];
    while ($cat = $res->fetch_assoc()) {
        $keyboard[] = [['text' => "📊 پلن‌های سرور: " . $cat['title'], 'callback_data' => "plansList" . $cat['id']]];
    }
    $keyboard[] = [['text' => '🔙 بازگشت به پنل مدیریت', 'callback_data' => "managePanel"]];
    bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $message_id, 'text' => "⚙️ مدیریت پلن‌ها:", 'reply_markup' => json_encode(['inline_keyboard' => $keyboard])]);
}

// -------------------------------------------------------------------------
// ۵. ویرایش فیلدها (عنوان، سطر اینباند، توضیحات و ...) به صورت شیشه‌ای
// -------------------------------------------------------------------------

// الف) ویرایش نام/عنوان پلن
if (preg_match('/^wizwizplanname(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    setUser($data);
    delMessage();
    sendMessage("✍️ لطفاً عنوان جدید را برای این پلن ارسال کنید:", $cancelKey);
    exit;
}
if (preg_match('/^wizwizplanname(\d+)/', (string)$userInfo['step'], $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    $stmt = $connection->prepare("UPDATE `server_plans` SET `title` = ? WHERE `id` = ?");
    $stmt->bind_param("si", $text, $match[1]);
    $stmt->execute();
    $stmt->close();

    sendMessage("✅ عنوان پلن با موفقیت به <code>$text</code> تغییر یافت.", null, "HTML");
    setUser();
    $keys = getPlanDetailsKeys($match[1]);
    if ($keys != null) sendMessage("🛠 ویرایش تنظیمات پلن", $keys, "HTML");
}

// ویرایش تعداد اکانت مجاز پلن نمایندگی
if (preg_match('/^editAgentPlanAccounts(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    setUser($data);
    delMessage();
    sendMessage("👥 لطفاً تعداد اکانت مجاز جدید برای این پلن را وارد کنید (0 = نامحدود):", $cancelKey);
    exit;
}
if (preg_match('/^editAgentPlanAccounts(\d+)/', (string)$userInfo['step'], $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    
    if (!is_numeric($text) || intval($text) < 0) {
        sendMessage("⚠️ خطا: لطفاً مقدار را فقط به صورت عدد مثبت یا 0 وارد کنید!");
        exit;
    }
    
    $accs = intval($text);
    $stmt = $connection->prepare("UPDATE `server_plans` SET `acount` = ? WHERE `id` = ?");
    $stmt->bind_param("ii", $accs, $match[1]);
    $stmt->execute();
    $stmt->close();

    sendMessage("✅ تعداد اکانت مجاز با موفقیت بروزرسانی شد.");
    setUser();
    $keys = getPlanDetailsKeys($match[1]);
    if ($keys != null) sendMessage("🛠 ویرایش تنظیمات پلن", $keys, "HTML");
}

// ب) ویرایش ظرفیت یا ویژگی چندکاربره (Limit IP / Account)
if (preg_match('/^wizwizplanslimit(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    setUser($data);
    delMessage();
    sendMessage("🧲 لطفاً سقف محدودیت آی‌پی (کاربر همزمان) جدید را وارد کنید (مثال: 2):", $cancelKey);
    exit;
}
if (preg_match('/^wizwizplanslimit(\d+)/', (string)$userInfo['step'], $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    $stmt = $connection->prepare("UPDATE `server_plans` SET `limitip` = ? WHERE `id` = ?");
    $stmt->bind_param("ii", $text, $match[1]);
    $stmt->execute();
    $stmt->close();

    sendMessage("✅ محدودیت اتصال همزمان با موفقیت بروزرسانی شد.");
    setUser();
    $keys = getPlanDetailsKeys($match[1]);
    if ($keys != null) sendMessage("🛠 ویرایش تنظیمات پلن", $keys, "HTML");
}

// ج) ویرایش آیدی سطر اینباندها (Attached Inbound IDs) - منطبق بر معماری v3.1.0
if (preg_match('/^wizwizplansinobundid(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    setUser($data);
    delMessage();
    sendMessage("🌐 <b>تنظیم آیدی اینباندهای متصل (Attached Inbounds):</b>\n\nلطفاً آیدی سطر اینباندها را وارد کنید.\nاگر مایلید پلن به چند اینباند وصل شود، آیدی‌ها را با کاما جدا کنید.\n📝 مثال: <code>1</code> یا <code>1,2,5</code>", $cancelKey, "HTML");
    exit;
}
if (preg_match('/^wizwizplansinobundid(\d+)/', (string)$userInfo['step'], $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);

    // پردازش متن ورودی و ذخیره به فرمت آرایه جیسون عددی یکپارچه برای متد کلاینت سنتریک جدید
    $cleanInput = str_replace(' ', '', $text);
    $idsArray = array_map('intval', explode(',', $cleanInput));
    $jsonIds = json_encode($idsArray);

    $stmt = $connection->prepare("UPDATE `server_plans` SET `inbound_id` = ? WHERE `id` = ?");
    $stmt->bind_param("si", $jsonIds, $match[1]);
    $stmt->execute();
    $stmt->close();

    sendMessage("✅ اینباندهای متصل به این پلن با موفقیت بروزرسانی شدند.");
    setUser();
    $keys = getPlanDetailsKeys($match[1]);
    if ($keys != null) sendMessage("🛠 ویرایش تنظیمات پلن", $keys, "HTML");
}

// د) ویرایش توضیحات پلن
if (preg_match('/^wizwizplaneditdes(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    setUser($data);
    delMessage();
    sendMessage("📝 لطفاً توضیحات جدید پلن را وارد کنید:", $cancelKey);
    exit;
}
if (preg_match('/^wizwizplaneditdes(\d+)/', (string)$userInfo['step'], $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    $stmt = $connection->prepare("UPDATE `server_plans` SET `descr` = ? WHERE `id` = ?");
    $stmt->bind_param("si", $text, $match[1]);
    $stmt->execute();
    $stmt->close();

    sendMessage("✅ توضیحات پلن با موفقیت تغییر کرد.");
    setUser();
    $keys = getPlanDetailsKeys($match[1]);
    if ($keys != null) sendMessage("🛠 ویرایش تنظیمات پلن", $keys, "HTML");
}

// هـ) ویرایش حجم پلن
if (preg_match('/^editAgentPlanVolume(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    setUser($data);
    delMessage();
    sendMessage("📦 لطفاً حجم جدید پلن را به <b>گیگابایت</b> وارد کنید (0 = نامحدود):", $cancelKey, "HTML");
    exit;
}
if (preg_match('/^editAgentPlanVolume(\d+)/', (string)$userInfo['step'], $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);

    if (!is_numeric($text) || intval($text) < 0) {
        sendMessage("⚠️ خطا: لطفاً مقدار را فقط به صورت عدد صحیح (0 یا بیشتر) وارد کنید!");
        exit;
    }

    $vol = intval($text);
    $stmt = $connection->prepare("UPDATE `server_plans` SET `volume` = ? WHERE `id` = ?");
    $stmt->bind_param("ii", $vol, $match[1]);
    $stmt->execute();
    $stmt->close();

    $volTxt = ($vol == 0) ? "نامحدود" : "{$vol} GB";
    sendMessage("✅ حجم پلن با موفقیت به <code>{$volTxt}</code> تغییر یافت.", null, "HTML");
    setUser();
    $keys = getPlanDetailsKeys($match[1]);
    if ($keys != null) sendMessage("🛠 ویرایش تنظیمات پلن", $keys, "HTML");
}

// -------------------------------------------------------------------------
// ۶. گزارش لیست اکانت‌های فروخته شده از این پلن
// -------------------------------------------------------------------------
if (preg_match('/^wizwizplanacclist(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $stmt = $connection->prepare("SELECT * FROM `orders_list` WHERE `status` = 1 AND `fileid` = ?");
    $stmt->bind_param("i", $match[1]);
    $stmt->execute();
    $res = $stmt->get_result();
    $stmt->close();

    if ($res->num_rows == 0) {
        alert('❌ هنوز هیچ اکانتی از این پلن فروخته نشده است و لیست خالی است.');
        exit;
    }

    // بستن پیام لودینگ منو جهت نمایش مستقیم گزارش
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);

    while ($order = $res->fetch_assoc()) {
        $suid = $order['userid'];
        $stmt = $connection->prepare("SELECT `name` FROM `users` WHERE `userid` = ?");
        $stmt->bind_param("i", $suid);
        $stmt->execute();
        $ures = $stmt->get_result()->fetch_assoc();
        $stmt->close();

        $formattedDate = jdate('Y-m-d H:i', $order['date']);
        $buyerName = htmlspecialchars($ures['name'] ?? "کاربر تلگرام");
        $remark = htmlspecialchars($order['remark']);

        $txt = "🚀 <b>خرید توسط:</b> $buyerName ($formattedDate)\n";
        $txt .= "📌 <b>نام اکانت (Remark):</b> <code>$remark</code>\n\n";
        // تشخیص فعال یا منقضی بودن
        $isActive = ($row['expire_date'] > time() || $row['expire_date'] == 0) ? true : false;
        $btnStyle = $isActive ? 'success' : 'danger';

        // اعمال روی دکمه همون سطر
        $keyboard[] = [['text' => $row['remark'], 'callback_data' => "orderDetails" . $row['id'], 'style' => $btnStyle]];

        $orderLink = json_decode($order['link'], true);
        if (is_array($orderLink) && ($botState['configLinkState'] ?? '') != "off") {
            $txt .= "🔗 <b>لینک‌های اتصال صادر شده:</b>\n";
            foreach ($orderLink as $link) {
                $txt .= "<code>" . htmlspecialchars($link) . "</code>\n";
            }
        }
        sendMessage($txt, null, "HTML");
    }
    exit;
}

// --- Start of Range 4674 to 4761 ---
if (preg_match('/^editServerNames(\d+)/', (string)$data) and ($from_id == $admin || $userInfo['isAdmin'] == true) && $text != $buttonValues['cancel']) {
    setUser($data);
    delMessage();
    sendMessage("🎯 serverNames رو به صورت زیر برام وارد کن:\n
`[
  \"yahoo.com\",
  \"www.yahoo.com\"
]`
    \n\nبرای حذف کردن متن /empty رو وارد کن", $cancelKey);
    exit;
}
if (preg_match('/^editServerNames(\d+)/', (string)$userInfo['step'], $match) && ($from_id == $admin || $userInfo['isAdmin'] == true) && $text != $buttonValues['cancel']) {
    if ($text == "/empty") {
        $stmt = $connection->prepare("UPDATE `server_plans` SET `serverNames`=NULL WHERE `id`=?");
        $stmt->bind_param("s", $match[1]);
    } else {
        $stmt = $connection->prepare("UPDATE `server_plans` SET `serverNames`=? WHERE `id`=?");
        $stmt->bind_param("si", $text, $match[1]);
    }
    $stmt->execute();
    $stmt->close();


    sendMessage("با موفقیت برات تغییر دادم ☺️☑️");
    setUser();

    $keys = getPlanDetailsKeys($match[1]);
    if ($keys == null) {
        alert("موردی یافت نشد");
        exit;
    } else
        sendMessage("ویرایش تنظیمات پلن", $keys, "HTML");
}
if (preg_match('/^editFlow(\d+)/', (string)$data, $match) and ($from_id == $admin || $userInfo['isAdmin'] == true) && $text != $buttonValues['cancel']) {
    setUser($data);
    delMessage();
    $keys = json_encode(['inline_keyboard' => [
        [['text' => "None", 'callback_data' => "editPFlow" . $match[1] . "_None"]],
        [['text' => "xtls-rprx-vision", 'callback_data' => "editPFlow" . $match[1] . "_xtls-rprx-vision"]],
    ]]);
    sendMessage("🎯 لطفا یکی از موارد زیر رو انتخاب کن", $keys);
    exit;
}
if (preg_match('/^editPFlow(\d+)_(.*)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true) && $text != $buttonValues['cancel']) {
    $stmt = $connection->prepare("UPDATE `server_plans` SET `flow`=? WHERE `id`=?");
    $stmt->bind_param("si", $match[2], $match[1]);
    $stmt->execute();
    $stmt->close();

    alert("با موفقیت برات تغییر دادم ☺️☑️");
    setUser();

    $keys = getPlanDetailsKeys($match[1]);
    editText($message_id, "ویرایش تنظیمات پلن", $keys, "HTML");
}
if (preg_match('/^wizwizplanrial(\d+)/', (string)$data) and ($from_id == $admin || $userInfo['isAdmin'] == true) && $text != $buttonValues['cancel']) {
    setUser($data);
    delMessage();
    sendMessage("🎯 شیطون قیمت و گرون کردی 😂 ، خب قیمت جدید و بزن ببینم :", $cancelKey);
    exit;
}
if (preg_match('/^wizwizplanrial(\d+)/', (string)$userInfo['step'], $match) && ($from_id == $admin || $userInfo['isAdmin'] == true) && $text != $buttonValues['cancel']) {
    if (is_numeric($text)) {
        $stmt = $connection->prepare("UPDATE `server_plans` SET `price`=? WHERE `id`=?");
        $stmt->bind_param("ii", $text, $match[1]);
        $stmt->execute();
        $stmt->close();

        sendMessage("با موفقیت برات تغییر دادم ☺️☑️");
        setUser();

        $keys = getPlanDetailsKeys($match[1]);
        if ($keys == null) {
            alert("موردی یافت نشد");
            exit;
        } else
            sendMessage("ویرایش تنظیمات پلن", $keys, "HTML");
    } else {
        sendMessage("بهت میگم قیمت وارد کن برداشتی یه چیز دیگه نوشتی 🫤 ( عدد وارد کن ) عجبا");
    }
}
// -------------------------------------------------------------------
// بخش لیست اشتراک‌ها و نمایندگی (ایموجی‌دار و استاندارد)
// -------------------------------------------------------------------

// --- Start of Range 4922 to 4969 ---
if (preg_match('/^changeCustomPort(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    delMessage();
    sendMessage("لطفا پورت مورد نظر خود را وارد کنید\nبرای حذف پورت دلخواه عدد 0 را وارد کنید", $cancelKey);
    setUser($data);
}
if (preg_match('/^changeCustomPort(\d+)/', (string)$userInfo['step'], $match) && ($from_id == $admin || $userInfo['isAdmin'] == true) && $text != $buttonValues['cancel']) {
    if (is_numeric($text)) {
        $stmt = $connection->prepare("UPDATE `server_plans` SET `custom_port`= ? WHERE `id` = ?");
        $stmt->bind_param("ii", $text, $match[1]);
        $stmt->execute();
        $stmt->close();
        sendMessage($mainValues['saved_successfuly'], $removeKeyboard);

        sendMessage("ویرایش تنظیمات پلن", getPlanDetailsKeys($match[1]));
        setUser();
    } else
        sendMessage($mainValues['send_only_number']);
}
if (preg_match('/^changeCustomSni(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    delMessage();
    sendMessage("لطفا sni مورد نظر خود را وارد کنید\nبرای حذف متن /empty را وارد کنید", $cancelKey);
    setUser($data);
}
if (preg_match('/^changeCustomSni(\d+)/', (string)$userInfo['step'], $match) && ($from_id == $admin || $userInfo['isAdmin'] == true) && $text != $buttonValues['cancel']) {
    if ($text == "/empty") {
        $stmt = $connection->prepare("UPDATE `server_plans` SET `custom_sni`= NULL WHERE `id` = ?");
        $stmt->bind_param("i", $match[1]);
    } else {
        $stmt = $connection->prepare("UPDATE `server_plans` SET `custom_sni`= ? WHERE `id` = ?");
        $stmt->bind_param("si", $text, $match[1]);
    }
    $stmt->execute();
    $stmt->close();
    sendMessage($mainValues['saved_successfuly'], $removeKeyboard);

    sendMessage("ویرایش تنظیمات پلن", getPlanDetailsKeys($match[1]));
    setUser();
}
if (preg_match('/^changeCustomPath(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $stmt = $connection->prepare("UPDATE `server_plans` SET `custom_path` = IF(`custom_path` = 1, 0, 1) WHERE `id` = ?");
    $stmt->bind_param("i", $match[1]);
    $stmt->execute();
    $stmt->close();

    editKeys(getPlanDetailsKeys($match[1]));
}

// --- Start of Range 5535 to 5591 ---
if ($data == "giftVolumeAndDay" && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $stmt = $connection->prepare("SELECT * FROM `server_info` WHERE `active` = 1 and `state` = 1");
    $stmt->execute();
    $respd = $stmt->get_result();
    $stmt->close();
    if ($respd->num_rows == 0) {
        alert('در حال حاضر هیچ سرور فعالی برای هدیه دادن وجود ندارد', true);
        exit;
    }
    $keyboard = [];
    while ($cat = $respd->fetch_assoc()) {
        $sid = $cat['id'];
        $name = $cat['title'];
        $keyboard[] = ['text' => "$name", 'callback_data' => "giftToServer{$sid}"];
    }
    $keyboard = array_chunk($keyboard, 2);
    $keyboard[] = [['text' => $buttonValues['back_button'], 'callback_data' => "managePanel"]];
    editText($message_id, ' 📍 لطفا برای هدیه دادن, یکی از سرورها را انتخاب کنید👇', json_encode([
        'inline_keyboard' => $keyboard
    ]));
}
if (preg_match('/^giftToServer(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    delMessage();
    $kb = json_encode(['inline_keyboard' => [[['text' => "❌ انصراف", 'callback_data' => "mainMenu", 'style' => 'danger', 'icon_custom_emoji_id' => '5215680783863261658']]]]);
    $res = sendMessage("لطفا مدت زمان هدیه را به روز وارد کنید\nبرای اضافه نشدن زمان 0 را وارد کنید", $kb);
    $prompt_id = $message_id + 1;
    if (is_string($res)) {
        $resDecoded = json_decode($res, true);
        if (isset($resDecoded['result']['message_id'])) $prompt_id = $resDecoded['result']['message_id'];
    } elseif (is_object($res)) {
        if (isset($res->result->message_id)) $prompt_id = $res->result->message_id;
    } elseif (is_array($res)) {
        if (isset($res['result']['message_id'])) $prompt_id = $res['result']['message_id'];
    }
    setUser('giftServerDay' . json_encode(['server_id' => $match[1], 'prompt_id' => $prompt_id], JSON_UNESCAPED_UNICODE));
    exit();
}
if (preg_match('/^giftServerDay(?<json>.*)/', (string)$userInfo['step'], $match) && ($from_id == $admin || $userInfo['isAdmin'] == true) && $text != $buttonValues['cancel']) {
    $d = json_decode($match['json'], true);
    $sid = $d['server_id'];
    $prompt_id = $d['prompt_id'];
    
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    
    if (is_numeric($text)) {
        if ($text >= 0) {
            $kb = json_encode(['inline_keyboard' => [[['text' => "❌ انصراف", 'callback_data' => "mainMenu", 'style' => 'danger', 'icon_custom_emoji_id' => '5215680783863261658']]]]);
            bot('editMessageText', [
                'chat_id' => $from_id,
                'message_id' => $prompt_id,
                'text' => "لطفا حجم هدیه را به مگابایت وارد کنید\nبرای اضافه نشدن حجم 0 را وارد کنید",
                'reply_markup' => $kb
            ]);
            setUser('giftServerVolume' . json_encode(['server_id' => $sid, 'days' => $text, 'prompt_id' => $prompt_id], JSON_UNESCAPED_UNICODE));
        } else {
            sendMessage("عددی بزرگتر و یا مساوی به 0 واردکنید");
        }
    } else {
        sendMessage($mainValues['send_only_number']);
    }
    exit();
}
if (preg_match('/^giftServerVolume(?<json>.*)/', (string)$userInfo['step'], $match) && ($from_id == $admin || $userInfo['isAdmin'] == true) && $text != $buttonValues['cancel']) {
    $d = json_decode($match['json'], true);
    $sid = $d['server_id'];
    $days = $d['days'];
    $prompt_id = $d['prompt_id'];
    
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $prompt_id]);
    
    if (is_numeric($text)) {
        if ($text >= 0) {
            $stmt = $connection->prepare("INSERT INTO `gift_list` (`server_id`, `volume`, `day`) VALUES (?, ?, ?)");
            $stmt->bind_param("iii", $sid, $text, $days);
            $stmt->execute();
            $stmt->close();

            sendMessage($mainValues['saved_successfuly'], $removeKeyboard);
            sendMessage($mainValues['reached_main_menu'], getAdminKeys());

            setUser();
        } else {
            sendMessage("عددی بزرگتر و یا مساوی به 0 واردکنید");
        }
    } else {
        sendMessage($mainValues['send_only_number']);
    }
}

// --- Start of Range 6102 to 6105 ---
if ($data == 'cantEditTrojan') {
    alert("پروتکل تروجان فقط نوع شبکه TCP را دارد");
    exit;
}

// --- Start of Range 6106 to 6303 ---
if (($data == 'categoriesSetting' || preg_match('/^nextCategoryPage(\d+)/', (string)$data, $match)) and ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    if (isset($match[1]))
        $keys = getCategoriesKeys($match[1]);
    else
        $keys = getCategoriesKeys();

    editText($message_id, "☑️ مدیریت دسته ها:", $keys);
}
if ($data == 'addNewCategory' and (($from_id == $admin || $userInfo['isAdmin'] == true))) {
    setUser($data);
    delMessage();
    $stmt = $connection->prepare("DELETE FROM `server_categories` WHERE `active`=0");
    $stmt->execute();
    $stmt->close();


    $sql = "INSERT INTO `server_categories` VALUES (NULL, 0, '', 0,2,0);";
    $stmt = $connection->prepare($sql);
    $stmt->execute();
    $stmt->close();


    $msg = '▪️یه اسم برای دسته بندی وارد کن:';
    sendMessage($msg, $cancelKey);
    exit;
}
if (preg_match('/^addNewCategory/', (string)$userInfo['step']) and $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $step = checkStep('server_categories');
    if ($step == 2 and $text != $buttonValues['cancel']) {

        $stmt = $connection->prepare("UPDATE `server_categories` SET `title`=?,`step`=4,`active`=1 WHERE `active`=0");
        $stmt->bind_param("s", $text);
        $stmt->execute();
        $stmt->close();


        $msg = 'یه دسته بندی جدید برات ثبت کردم 🙂☑️';
        sendMessage($msg, $removeKeyboard);
        sendMessage($mainValues['reached_main_menu'], getCategoriesKeys());
    }
}
if (preg_match('/^wizwizcategorydelete(\d+)_(\d+)/', (string)$data, $match) and ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $stmt = $connection->prepare("DELETE FROM `server_categories` WHERE `id`=?");
    $stmt->bind_param("i", $match[1]);
    $stmt->execute();
    $stmt->close();

    alert("دسته بندی رو برات حذفش کردم ☹️☑️");

    $stmt = $connection->prepare("SELECT * FROM `server_categories` WHERE `active`=1 AND `parent`=0");
    $stmt->execute();
    $cats = $stmt->get_result();
    $stmt->close();

    $keys = getCategoriesKeys($match[2]);
    editText($message_id, "☑️ مدیریت دسته ها:", $keys);
}
if (preg_match('/^wizwizcategoryedit/', (string)$data) and ($from_id == $admin || $userInfo['isAdmin'] == true) && $text != $buttonValues['cancel']) {
    setUser($data);
    delMessage();
    sendMessage("〽️ یه اسم جدید برا دسته بندی انتخاب کن:", $cancelKey);
    exit;
}
if (preg_match('/wizwizcategoryedit(\d+)_(\d+)/', (string)$userInfo['step'], $match) && ($from_id == $admin || $userInfo['isAdmin'] == true) && $text != $buttonValues['cancel']) {
    $stmt = $connection->prepare("UPDATE `server_categories` SET `title`=? WHERE `id`=?");
    $stmt->bind_param("si", $text, $match[1]);
    $stmt->execute();
    $stmt->close();

    sendMessage("با موفقیت برات تغییر دادم ☺️☑️");
    setUser();

    sendMessage("☑️ مدیریت دسته ها:", getCategoriesKeys($match[2]));
}
if (($data == 'serversSetting' || preg_match('/^nextServerPage(\d+)/', (string)$data, $match)) and ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    if (isset($match[1]))
        $keys = getServerListKeys($match[1]);
    else
        $keys = getServerListKeys();

    editText($message_id, "☑️ مدیریت سرور ها:", $keys);
}
if (preg_match('/^toggleServerState(\d+)_(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $stmt = $connection->prepare("UPDATE `server_info` SET `state` = IF(`state` = 0,1,0) WHERE `id`=?");
    $stmt->bind_param("i", $match[1]);
    $stmt->execute();
    $cats = $stmt->get_result();
    $stmt->close();

    alert("وضعیت سرور با موفقیت تغییر کرد");

    $keys = getServerListKeys($match[2]);
    editText($message_id, "☑️ مدیریت سرور ها:", $keys);
}
if (preg_match('/^showServerSettings(\d+)_(\d+)/', (string)$data, $match) and ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $keys = getServerConfigKeys($match[1], $match[2]);
    editText($message_id, "☑️ مدیریت سرور ها:", $keys);
}
if (preg_match('/^changesServerIp(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $stmt = $connection->prepare("SELECT * FROM `server_config` WHERE `id`=?");
    $stmt->bind_param("i", $match[1]);
    $stmt->execute();
    $serverIp = $stmt->get_result()->fetch_assoc()['ip'] ?? "اطلاعاتی یافت نشد";
    $stmt->close();

    delMessage();
    sendMessage("لیست آیپی های فعلی: \n$serverIp\nلطفا آیپی های جدید را در خط های جدا بفرستید\n\nبرای خالی کردن متن /empty را وارد کنید", $cancelKey, null, null, null);
    setUser($data);
    exit();
}
if (preg_match('/^changesServerIp(\d+)/', (string)$userInfo['step'], $match) && ($from_id == $admin || $userInfo['isAdmin'] == true) && $text != $buttonValues['cancel']) {
    $stmt = $connection->prepare("UPDATE `server_config` SET `ip` = ? WHERE `id`=?");
    if ($text == "/empty")
        $text = "";
    $stmt->bind_param("si", $text, $match[1]);
    $stmt->execute();
    $stmt->close();
    sendMessage($mainValues['saved_successfuly'], $removeKeyboard);
    setUser();

    $keys = getServerConfigKeys($match[1]);
    sendMessage("☑️ مدیریت سرور ها:", $keys);
    exit();
}
if (preg_match('/^changePortType(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $stmt = $connection->prepare("UPDATE `server_config` SET `port_type` = IF(`port_type` = 'auto', 'random', 'auto') WHERE `id`=?");
    $stmt->bind_param("i", $match[1]);
    $stmt->execute();
    $stmt->close();
    alert("نوعیت پورت سرور مورد نظر با موفقیت تغییر کرد");

    $keys = getServerConfigKeys($match[1]);
    editText($message_id, "☑️ مدیریت سرور ها:", $keys);

    exit();
}
if (preg_match('/^changeRealityState(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $stmt = $connection->prepare("UPDATE `server_config` SET `reality` = IF(`reality` = 'true', 'false', 'true') WHERE `id` = ?");
    $stmt->bind_param("i", $match[1]);
    $stmt->execute();
    $stmt->close();

    $keys = getServerConfigKeys($match[1]);
    editText($message_id, "☑️ مدیریت سرور ها:", $keys);

    exit();
}
if (preg_match('/^changeServerType(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    editText($message_id, "
    
🔰 نکته مهم: ( پنل x-ui خود را به آخرین نسخه آپدیت کنید ) 

❤️ اگر از پنل سنایی استفاده میکنید لطفا نوع پنل را ( سنایی ) انتخاب کنید
🧡 اگر از پنل علیرضا استفاده میکنید لطفا نوع پنل را ( علیرضا ) انتخاب کنید
💚 اگر از پنل نیدوکا استفاده میکنید لطفا نوع پنل را ( ساده ) انتخاب کنید 
💙 اگر از پنل چینی استفاده میکنید لطفا نوع پنل را ( ساده ) انتخاب کنید 
⁮⁮ ⁮⁮ ⁮⁮ ⁮⁮
📣 حتما نوع پنل را انتخاب کنید وگرنه براتون مشکل ساز میشه !
⁮⁮ ⁮⁮ ⁮⁮ ⁮⁮
", json_encode(['inline_keyboard' => [
        [['text' => "ساده", 'callback_data' => "chhangeServerTypenormal_" . $match[1]], ['text' => "سنایی", 'callback_data' => "chhangeServerTypesanaei_" . $match[1]]],
        [['text' => "علیرضا", 'callback_data' => "chhangeServerTypealireza_" . $match[1]]]
    ]]));
    exit();
}
if (preg_match('/^chhangeServerType(\w+)_(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    alert($mainValues['saved_successfuly']);
    $stmt = $connection->prepare("UPDATE `server_config` SET `type` = ? WHERE `id`=?");
    $stmt->bind_param("si", $match[1], $match[2]);
    $stmt->execute();
    $stmt->close();

    $keys = getServerConfigKeys($match[2]);
    editText($message_id, "☑️ مدیریت سرور ها:", $keys);
}

// یک تابع کوچک در همینجا تعریف میکنیم تا متن ثابت بالای پیام ها را بسازد
function wizwiz_getSummaryTxt($d)
{
    $t = "📝 <b>اطلاعات ثبت شده تا این مرحله:</b>\n\n";
    if (isset($d['title'])) $t .= "▪️ اسم سرور: <code>{$d['title']}</code>\n";
    if (isset($d['ucount'])) $t .= "▪️ ظرفیت: <code>{$d['ucount']}</code>\n";
    if (isset($d['remark'])) $t .= "▪️ ریمارک: <code>{$d['remark']}</code>\n";
    if (isset($d['flag'])) $t .= "▪️ پرچم: <code>{$d['flag']}</code>\n";
    if (isset($d['panel_url'])) $t .= "▪️ آدرس پنل: <code>{$d['panel_url']}</code>\n";
    if (isset($d['panel_ip']) && $d['panel_ip'] != "/empty") $t .= "▪️ آی‌پی/دامنه: <code>{$d['panel_ip']}</code>\n";
    if (isset($d['sni']) && $d['sni'] != "/empty") $t .= "▪️ SNI: <code>{$d['sni']}</code>\n";
    if (isset($d['header_type']) && $d['header_type'] != "/empty") $t .= "▪️ Header Type: <code>{$d['header_type']}</code>\n";
    if (isset($d['request_header']) && $d['request_header'] != "/empty") $t .= "▪️ Req Header: <code>{$d['request_header']}</code>\n";
    if (isset($d['response_header']) && $d['response_header'] != "/empty") $t .= "▪️ Res Header: <code>{$d['response_header']}</code>\n";
    if (isset($d['security']) && $d['security'] != "/empty") $t .= "▪️ Security: <code>{$d['security']}</code>\n";
    if (isset($d['tls_setting']) && $d['tls_setting'] != "/empty") $t .= "▪️ TLS Setting: <code>{$d['tls_setting']}</code>\n";
    if (isset($d['panel_user'])) $t .= "▪️ یوزرنیم: <code>{$d['panel_user']}</code>\n";
    return $t . "-------------------------\n";
}

// -------------------------------------------------------------------------
// سیستم دکمه بازگشت به مرحله قبل
// -------------------------------------------------------------------------

// --- Start of Range 6304 to 6866 ---
if (preg_match('/^backStep_(.*)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $targetStep = $match[1];
    preg_match('/^[a-zA-Z]+({.*})/', $userInfo['step'], $jsonMatch);
    $d = json_decode($jsonMatch[1], true) ?? [];
    $prompt_id = $d['prompt_id'];

    $kb = [];
    $msg = "";

    switch ($targetStep) {
        case 'addserverName':
            unset($d['title']);
            $msg = "مرحله اول:\n▪️یه اسم برا سرورت انتخاب کن:";
            $kb = [[['text' => "❌ انصراف", 'callback_data' => "mainMenu"]]];
            break;
        case 'addServerUCount':
            unset($d['ucount']);
            $msg = "مرحله دوم:\n▪️ظرفیت تعداد ساخت کانفیگ رو برای سرورت مشخص کن ( عدد باشه )";
            $kb = [[['text' => "🔙 بازگشت", 'callback_data' => "backStep_addserverName"]], [['text' => "❌ انصراف", 'callback_data' => "mainMenu"]]];
            break;
        case 'addServerRemark':
            unset($d['remark']);
            $msg = "مرحله سوم:\n▪️یه اسم ( ریمارک ) برا کانفیگ انتخاب کن:\n( به صورت انگیلیسی و بدون فاصله )";
            $kb = [[['text' => "🔙 بازگشت", 'callback_data' => "backStep_addServerUCount"]], [['text' => "❌ انصراف", 'callback_data' => "mainMenu"]]];
            break;
        case 'addServerFlag':
            unset($d['flag']);
            $msg = "مرحله چهارم:\n▪️لطفا یه ( ایموجی پرچم 🇮🇷 ) برا سرورت انتخاب کن:";
            $kb = [[['text' => "🔙 بازگشت", 'callback_data' => "backStep_addServerRemark"]], [['text' => "❌ انصراف", 'callback_data' => "mainMenu"]]];
            break;
        case 'addServerPanelUrl':
            unset($d['panel_url']);
            $msg = "مرحله پنجم:\n▪️لطفا آدرس پنل x-ui رو به صورت مثال زیر وارد کن:\n\n❕https://yourdomain.com:54321\n❗️http://125.12.12.36:54321";
            $kb = [[['text' => "🔙 بازگشت", 'callback_data' => "backStep_addServerFlag"]], [['text' => "❌ انصراف", 'callback_data' => "mainMenu"]]];
            break;
        case 'addServerIp':
            unset($d['panel_ip']);
            $msg = "🔅 لطفا ip یا دامنه تانل شده پنل را وارد کنید:\n🔻برای خالی گذاشتن متن /empty را وارد کنید";
            $kb = [[['text' => "🔙 بازگشت", 'callback_data' => "backStep_addServerPanelUrl"]], [['text' => "❌ انصراف", 'callback_data' => "mainMenu"]]];
            break;
        case 'addServerSni':
            unset($d['sni']);
            $msg = "🔅 لطفا sni پنل را وارد کنید\n🔻برای خالی گذاشتن متن /empty را وارد کنید";
            $kb = [[['text' => "🔙 بازگشت", 'callback_data' => "backStep_addServerIp"]], [['text' => "❌ انصراف", 'callback_data' => "mainMenu"]]];
            break;
        case 'addServerHeaderType':
            unset($d['header_type']);
            $msg = "🔅 اگر از header type استفاده میکنید لطفا http را تایپ کنید:\n🔻برای خالی گذاشتن متن /empty را وارد کنید";
            $kb = [[['text' => "🔙 بازگشت", 'callback_data' => "backStep_addServerSni"]], [['text' => "❌ انصراف", 'callback_data' => "mainMenu"]]];
            break;
        case 'addServerRequestHeader':
            unset($d['request_header']);
            $msg = "🔅اگر از هدر استفاده میکنید لطفا آدرس رو وارد کنید:\n🔻برای خالی گذاشتن متن /empty را وارد کنید";
            $kb = [[['text' => "🔙 بازگشت", 'callback_data' => "backStep_addServerHeaderType"]], [['text' => "❌ انصراف", 'callback_data' => "mainMenu"]]];
            break;
        case 'addServerResponseHeader':
            unset($d['response_header']);
            $msg = "🔅 لطفا response header پنل را وارد کنید\n🔻برای خالی گذاشتن متن /empty را وارد کنید";
            $kb = [[['text' => "🔙 بازگشت", 'callback_data' => "backStep_addServerRequestHeader"]], [['text' => "❌ انصراف", 'callback_data' => "mainMenu"]]];
            break;
        case 'addServerSecurity':
            unset($d['security']);
            $msg = "🔅 لطفا security پنل را وارد کنید\n🔻برای خالی گذاشتن متن /empty را وارد کنید";
            $kb = [[['text' => "🔙 بازگشت", 'callback_data' => "backStep_addServerResponseHeader"]], [['text' => "❌ انصراف", 'callback_data' => "mainMenu"]]];
            break;
        case 'addServerTlsSetting':
            unset($d['tls_setting']);
            $msg = "🔅 لطفا tls|xtls setting پنل را وارد کنید\n🔻برای خالی گذاشتن متن /empty را وارد کنید";
            $kb = [[['text' => "🔙 بازگشت", 'callback_data' => "backStep_addServerSecurity"]], [['text' => "❌ انصراف", 'callback_data' => "mainMenu"]]];
            break;
        case 'addServerPanelUser':
            unset($d['panel_user']);
            $msg = "مرحله ششم:\n▪️لطفا یوزر پنل را وارد کنید:";
            if ($userInfo['temp'] == "addNewMarzbanPanel") {
                $kb = [[['text' => "🔙 بازگشت", 'callback_data' => "backStep_addServerPanelUrl"]], [['text' => "❌ انصراف", 'callback_data' => "mainMenu"]]];
            } else {
                $kb = [[['text' => "🔙 بازگشت", 'callback_data' => "backStep_addServerTlsSetting"]], [['text' => "❌ انصراف", 'callback_data' => "mainMenu"]]];
            }
            break;
    }

    $finalMsg = wizwiz_getSummaryTxt($d) . $msg;
    bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $prompt_id, 'text' => $finalMsg, 'reply_markup' => json_encode(['inline_keyboard' => $kb]), 'parse_mode' => "HTML"]);
    setUser($targetStep . json_encode($d, JSON_UNESCAPED_UNICODE));
    exit();
}

// -------------------------------------------------------------------------
// شروع مراحل
// -------------------------------------------------------------------------
if (($data == "addNewMarzbanPanel" || $data == 'addNewServer') and ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    delMessage();
    setUser($data, 'temp');

    $msg = "مرحله اول:\n▪️یه اسم برا سرورت انتخاب کن:";
    $keyboard = json_encode(['inline_keyboard' => [[
        getBtn("cancel", "mainMenu")
    ]]]);

    $res = bot('sendMessage', [
        'chat_id' => $from_id,
        'text' => wizwiz_getSummaryTxt([]) . $msg,
        'reply_markup' => $keyboard,
        'parse_mode' => "HTML"
    ]);

    // ✨ حل باگ لوپ تلگرام: بررسی هوشمند نوع خروجی تابع bot (جلوگیری از خطای TypeError)
    $prompt_id = $message_id + 1;
    if (is_string($res)) {
        $resObj = json_decode($res, true);
        if (isset($resObj['result']['message_id'])) $prompt_id = $resObj['result']['message_id'];
    } elseif (is_object($res)) {
        if (isset($res->result->message_id)) $prompt_id = $res->result->message_id;
    } elseif (is_array($res)) {
        if (isset($res['result']['message_id'])) $prompt_id = $res['result']['message_id'];
    }

    $stepData = ['prompt_id' => $prompt_id];
    setUser('addserverName' . json_encode($stepData, JSON_UNESCAPED_UNICODE));
    exit();
}

if (preg_match('/^addserverName(.*)/', (string)$userInfo['step'], $match) and $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]); // پاک کردن پیام شما
    $data = json_decode($match[1], true);
    $data['title'] = $text;

    $msg = "مرحله دوم:\n▪️ظرفیت تعداد ساخت کانفیگ رو برای سرورت مشخص کن ( عدد باشه )";
    $keyboard = json_encode(['inline_keyboard' => [[getBtn("back", "backStep_addserverName")], [getBtn("cancel", "mainMenu")]]]);

    bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $data['prompt_id'], 'text' => wizwiz_getSummaryTxt($data) . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
    setUser('addServerUCount' . json_encode($data, JSON_UNESCAPED_UNICODE));
    exit();
}

if (preg_match('/^addServerUCount(.*)/', (string)$userInfo['step'], $match) and $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    $data = json_decode($match[1], true);
    $data['ucount'] = $text;

    $msg = "مرحله سوم:\n▪️یه اسم ( ریمارک ) برا کانفیگ انتخاب کن:\n( به صورت انگیلیسی و بدون فاصله )";
    $keyboard = json_encode(['inline_keyboard' => [[getBtn("back", "backStep_addServerUCount")], [getBtn("cancel", "mainMenu")]]]);

    bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $data['prompt_id'], 'text' => wizwiz_getSummaryTxt($data) . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
    setUser('addServerRemark' . json_encode($data, JSON_UNESCAPED_UNICODE));
    exit();
}

if (preg_match('/^addServerRemark(.*)/', (string)$userInfo['step'], $match) and $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    $data = json_decode($match[1], true);
    $data['remark'] = $text;

    $msg = "مرحله چهارم:\n▪️لطفا یه ( ایموجی پرچم 🇮🇷 ) برا سرورت انتخاب کن:";
    $keyboard = json_encode(['inline_keyboard' => [[getBtn("back", "backStep_addServerRemark")], [getBtn("cancel", "mainMenu")]]]);

    bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $data['prompt_id'], 'text' => wizwiz_getSummaryTxt($data) . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
    setUser('addServerFlag' . json_encode($data, JSON_UNESCAPED_UNICODE));
    exit();
}

if (preg_match('/^addServerFlag(.*)/', (string)$userInfo['step'], $match) and $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    $data = json_decode($match[1], true);
    $data['flag'] = $text;

    $msg = "مرحله پنجم:\n▪️لطفا آدرس پنل x-ui رو به صورت مثال زیر وارد کن:\n\n❕https://yourdomain.com:54321\n❗️http://125.12.12.36:54321";
    $keyboard = json_encode(['inline_keyboard' => [[getBtn("back", "backStep_addServerFlag")], [getBtn("cancel", "mainMenu")]]]);

    bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $data['prompt_id'], 'text' => wizwiz_getSummaryTxt($data) . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
    setUser('addServerPanelUrl' . json_encode($data, JSON_UNESCAPED_UNICODE));
    exit();
}

if (preg_match('/^addServerPanelUrl(.*)/', (string)$userInfo['step'], $match) and $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    $data = json_decode($match[1], true);
    $data['panel_url'] = $text;

    if ($userInfo['temp'] == "addNewMarzbanPanel") {
        $data['panel_ip'] = "/empty";
        $data['sni'] = "/empty";
        $data['header_type'] = "/empty";
        $data['response_header'] = "/empty";
        $data['request_header'] = "/empty";
        $data['security'] = "/empty";
        $data['tls_setting'] = "/empty";

        $msg = "مرحله ششم:\n▪️لطفا یوزر پنل را وارد کنید:";
        $keyboard = json_encode(['inline_keyboard' => [[getBtn("back", "backStep_addServerPanelUrl")], [getBtn("cancel", "mainMenu")]]]);

        bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $data['prompt_id'], 'text' => wizwiz_getSummaryTxt($data) . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
        setUser('addServerPanelUser' . json_encode($data, JSON_UNESCAPED_UNICODE));
        exit();
    } else {
        $msg = "🔅 لطفا ip یا دامنه تانل شده پنل را وارد کنید:\n🔻برای خالی گذاشتن متن /empty را وارد کنید";
        $keyboard = json_encode(['inline_keyboard' => [[getBtn("back", "backStep_addServerPanelUrl")], [getBtn("cancel", "mainMenu")]]]);

        bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $data['prompt_id'], 'text' => wizwiz_getSummaryTxt($data) . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
        setUser('addServerIp' . json_encode($data, JSON_UNESCAPED_UNICODE));
        exit();
    }
}

if (preg_match('/^addServerIp(.*)/', (string)$userInfo['step'], $match) and $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    $data = json_decode($match[1], true);
    $data['panel_ip'] = $text;

    $msg = "🔅 لطفا sni پنل را وارد کنید\n🔻برای خالی گذاشتن متن /empty را وارد کنید";
    $keyboard = json_encode(['inline_keyboard' => [[getBtn("back", "backStep_addServerIp")], [getBtn("cancel", "mainMenu")]]]);

    bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $data['prompt_id'], 'text' => wizwiz_getSummaryTxt($data) . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
    setUser('addServerSni' . json_encode($data, JSON_UNESCAPED_UNICODE));
    exit();
}

if (preg_match('/^addServerSni(.*)/', (string)$userInfo['step'], $match) and $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    $data = json_decode($match[1], true);
    $data['sni'] = $text;

    $msg = "🔅 اگر از header type استفاده میکنید لطفا http را تایپ کنید:\n🔻برای خالی گذاشتن متن /empty را وارد کنید";
    $keyboard = json_encode(['inline_keyboard' => [[getBtn("back", "backStep_addServerSni")], [getBtn("cancel", "mainMenu")]]]);

    bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $data['prompt_id'], 'text' => wizwiz_getSummaryTxt($data) . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
    setUser('addServerHeaderType' . json_encode($data, JSON_UNESCAPED_UNICODE));
    exit();
}

if (preg_match('/^addServerHeaderType(.*)/', (string)$userInfo['step'], $match) and $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    $data = json_decode($match[1], true);
    $data['header_type'] = $text;

    $msg = "🔅اگر از هدر استفاده میکنید لطفا آدرس رو وارد کنید:\n🔻برای خالی گذاشتن متن /empty را وارد کنید";
    $keyboard = json_encode(['inline_keyboard' => [[getBtn("back", "backStep_addServerHeaderType")], [getBtn("cancel", "mainMenu")]]]);

    bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $data['prompt_id'], 'text' => wizwiz_getSummaryTxt($data) . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
    setUser('addServerRequestHeader' . json_encode($data, JSON_UNESCAPED_UNICODE));
    exit();
}

if (preg_match('/^addServerRequestHeader(.*)/', (string)$userInfo['step'], $match) and $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    $data = json_decode($match[1], true);
    $data['request_header'] = $text;

    $msg = "🔅 لطفا response header پنل را وارد کنید\n🔻برای خالی گذاشتن متن /empty را وارد کنید";
    $keyboard = json_encode(['inline_keyboard' => [[getBtn("back", "backStep_addServerRequestHeader")], [getBtn("cancel", "mainMenu")]]]);

    bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $data['prompt_id'], 'text' => wizwiz_getSummaryTxt($data) . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
    setUser('addServerResponseHeader' . json_encode($data, JSON_UNESCAPED_UNICODE));
    exit();
}

if (preg_match('/^addServerResponseHeader(.*)/', (string)$userInfo['step'], $match) and $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    $data = json_decode($match[1], true);
    $data['response_header'] = $text;

    $msg = "🔅 لطفا security پنل را وارد کنید\n🔻برای خالی گذاشتن متن /empty را وارد کنید";
    $keyboard = json_encode(['inline_keyboard' => [[getBtn("back", "backStep_addServerResponseHeader")], [getBtn("cancel", "mainMenu")]]]);

    bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $data['prompt_id'], 'text' => wizwiz_getSummaryTxt($data) . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
    setUser('addServerSecurity' . json_encode($data, JSON_UNESCAPED_UNICODE));
    exit();
}

if (preg_match('/^addServerSecurity(.*)/', (string)$userInfo['step'], $match) and $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    $data = json_decode($match[1], true);
    $data['security'] = $text;

    $msg = "🔅 لطفا tls|xtls setting پنل را وارد کنید\n🔻برای خالی گذاشتن متن /empty را وارد کنید";
    $keyboard = json_encode(['inline_keyboard' => [[getBtn("back", "backStep_addServerSecurity")], [getBtn("cancel", "mainMenu")]]]);

    bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $data['prompt_id'], 'text' => wizwiz_getSummaryTxt($data) . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
    setUser('addServerTlsSetting' . json_encode($data, JSON_UNESCAPED_UNICODE));
    exit();
}

if (preg_match('/^addServerTlsSetting(.*)/', (string)$userInfo['step'], $match) and $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    $data = json_decode($match[1], true);
    $data['tls_setting'] = $text;

    $msg = "مرحله ششم:\n▪️لطفا یوزر پنل را وارد کنید:";
    $keyboard = json_encode(['inline_keyboard' => [[getBtn("back", "backStep_addServerTlsSetting")], [getBtn("cancel", "mainMenu")]]]);

    bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $data['prompt_id'], 'text' => wizwiz_getSummaryTxt($data) . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
    setUser('addServerPanelUser' . json_encode($data, JSON_UNESCAPED_UNICODE));
    exit();
}

if (preg_match('/^addServerPanelUser(.*)/', (string)$userInfo['step'], $match) and $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    $data = json_decode($match[1], true);
    $data['panel_user'] = $text;

    $msg = "مرحله هفتم:\n▪️لطفا پسورد پنل را وارد کنید:";
    $keyboard = json_encode(['inline_keyboard' => [[getBtn("back", "backStep_addServerPanelUser")], [getBtn("cancel", "mainMenu")]]]);

    bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $data['prompt_id'], 'text' => wizwiz_getSummaryTxt($data) . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
    setUser('addServerPanePassword' . json_encode($data, JSON_UNESCAPED_UNICODE));
    exit();
}

// -------------------------------------------------------------------------
// مرحله آخر: بررسی اتصال به پنل و ثبت در دیتابیس (کاملا منطبق بر API Docs نسخه 3.1.0)
// -------------------------------------------------------------------------
if (preg_match('/^addServerPanePassword(.*)/', (string)$userInfo['step'], $match) and $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $message_id]);
    $data = json_decode($match[1], true);

    bot('editMessageText', [
        'chat_id' => $from_id,
        'message_id' => $data['prompt_id'],
        'text' => wizwiz_getSummaryTxt($data) . "\n⏳ <b>در حال اتصال به API رسمی پنل و اعتبارسنجی توکن...</b>",
        'parse_mode' => "HTML"
    ]);

    $title = $data['title'];
    $ucount = $data['ucount'];
    $remark = $data['remark'];
    $flag = $data['flag'];

    // حذف اسلش اضافه از انتهای آدرس پنل در صورت وجود
    $panel_url = rtrim($data['panel_url'], '/');
    $ip = $data['panel_ip'] != "/empty" ? $data['panel_ip'] : "";
    $sni = $data['sni'] != "/empty" ? $data['sni'] : "";
    $header_type = $data['header_type'] != "/empty" ? $data['header_type'] : "none";
    $request_header = $data['request_header'] != "/empty" ? $data['request_header'] : "";
    $response_header = $data['response_header'] != "/empty" ? $data['response_header'] : "";
    $security = $data['security'] != "/empty" ? $data['security'] : "none";
    $tlsSettings = $data['tls_setting'] != "/empty" ? $data['tls_setting'] : "";
    $serverName = $data['panel_user'];
    $serverPass = trim($text); // توکن ساخته شده در بخش API Tokens پنل

    $loginResponse = ['success' => false, 'msg' => 'خطای نامشخص'];

    if ($userInfo['temp'] == "addNewMarzbanPanel") {
        // بخش ورود و توکن مربوط به پنل مرزبان (بدون تغییر)
        $loginUrl = $panel_url . '/api/admin/token';
        $postFields = array('username' => $serverName, 'password' => $serverPass);

        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $loginUrl);
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
        curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($postFields));
        curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0');
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded', 'accept: application/json'));

        $raw_response = curl_exec($curl);
        $curl_error = curl_error($curl);
        curl_close($curl);

        if ($raw_response === false) {
            $loginResponse['msg'] = "ارتباط مسدود شد: " . $curl_error;
        } else {
            $response = json_decode($raw_response, true);
            if (isset($response['access_token'])) {
                $loginResponse['success'] = true;
            } else {
                $loginResponse['msg'] = "یوزر یا پسورد اشتباه است.";
            }
        }
    } else {
        // ✨ ارتباط با دایرکتوری جدید بر اساس مستندات رسمی ارسال شده (v3.1.0)
        // آدرس دقیق بر اساس منبع مستندات: /panel/api/inbounds/list
        $apiUrl = $panel_url . '/panel/api/inbounds/list';

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $apiUrl);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
        curl_setopt($ch, CURLOPT_TIMEOUT, 15);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0');
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

        // 🔴 ارسال به صورت قالب‌بندی استاندارد Bearer بر اساس راهنمای رسمی مستندات
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Accept: application/json',
            'Authorization: Bearer ' . $serverPass
        ));

        $raw_response = curl_exec($ch);
        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $curl_error = curl_error($ch);
        curl_close($ch);

        if ($raw_response === false) {
            $loginResponse['msg'] = "ارتباط مستقیم با سرور مسدود است! جزئیات: " . $curl_error;
        } else {
            $resDecoded = json_decode($raw_response, true);

            // اگر کد پاسخ 200 آمد یا بدنه جیسون success بود یعنی توکن کاملا تایید شده است
            if ($http_code == 200 || (is_array($resDecoded) && isset($resDecoded['success']) && $resDecoded['success'] == true)) {
                $loginResponse['success'] = true;
            } else {
                $loginResponse['msg'] = "پاسخ سرور رد شد (کد وضعیت: $http_code). مطمئن شوید توکن فعال (Enabled) باشد.";
            }
        }
    }

    if (!isset($loginResponse['success']) || !$loginResponse['success']) {
        $errMsg = isset($loginResponse['msg']) ? $loginResponse['msg'] : "خطای ناشناخته";

        $msg = "\n⚠️ ارتباط برقرار نشد!\nدلیل: `$errMsg`\n\n🔻 لطفا API Token معتبر را از بخش Settings -> apiTokens مجدداً وارد کنید:";
        $keyboard = json_encode(['inline_keyboard' => [[['text' => "🔙 بازگشت", 'callback_data' => "backStep_addServerPanelUser"]], [['text' => "❌ انصراف", 'callback_data' => "mainMenu"]]]]);
        bot('editMessageText', ['chat_id' => $from_id, 'message_id' => $data['prompt_id'], 'text' => wizwiz_getSummaryTxt($data) . $msg, 'reply_markup' => $keyboard, 'parse_mode' => "HTML"]);
        setUser('addServerPanePassword' . json_encode($data, JSON_UNESCAPED_UNICODE));
        exit();
    }

    // ثبت سرور در دیتابیس ربات پس از احراز هویت موفقیت‌آمیز
    $stmt = $connection->prepare("INSERT INTO `server_info` (`title`, `ucount`, `remark`, `flag`, `active`) VALUES (?,?,?,?,1)");
    $stmt->bind_param("siss", $title, $ucount, $remark, $flag);
    $stmt->execute();
    $rowId = $stmt->insert_id;
    $stmt->close();

    $stmt = $connection->prepare("INSERT INTO `server_config` (`id`, `panel_url`, `ip`, `sni`, `header_type`, `request_header`, `response_header`, `security`, `tlsSettings`, `username`, `password`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
    $stmt->bind_param("issssssssss", $rowId, $panel_url, $ip, $sni, $header_type, $request_header, $response_header, $security, $tlsSettings, $serverName, $serverPass);
    $stmt->execute();
    $rowId = $stmt->insert_id;
    $stmt->close();

    // اتمام مراحل؛ پاک کردن ساختار موقت و ارسال پیام تبریک نهایی
    bot('deleteMessage', ['chat_id' => $from_id, 'message_id' => $data['prompt_id']]);
    sendMessage(" تبریک ; سرورت رو ثبت کردی 🥹", $removeKeyboard);

    if ($userInfo['temp'] == "addNewMarzbanPanel") {
        $stmt = $connection->prepare("UPDATE `server_config` SET `type` = 'marzban' WHERE `id`=?");
        $stmt->bind_param("i", $rowId);
        $stmt->execute();
        $stmt->close();

        $keys = getServerListKeys();
        sendMessage("☑️ مدیریت سرور ها", $keys);
    } else {
        sendMessage("🔰 نکته مهم: نوع پنل را انتخاب کنید:", json_encode(['inline_keyboard' => [
            [['text' => "ساده", 'callback_data' => "chhangeServerTypenormal_" . $rowId], ['text' => "سنایی", 'callback_data' => "chhangeServerTypesanaei_" . $rowId]],
            [['text' => "علیرضا", 'callback_data' => "chhangeServerTypealireza_" . $rowId]]
        ]]));
    }
    setUser();
    exit();
}

// -------------------------------------------------------------------
// 1. تغییر اطلاعات ورود به پنل (آدرس، یوزر، پسورد)
// -------------------------------------------------------------------
if (preg_match('/^changesServerLoginInfo(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    delMessage();
    setUser($data);
    sendMessage("▪️لطفا آدرس پنل را وارد کنید:", $cancelKey);
}

if (preg_match('/^changesServerLoginInfo(\d+)/', (string)$userInfo['step'], $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $data = array();
    $data['rowId'] = $match[1];
    $data['panel_url'] = $text;
    setUser('editServerPaneUser' . json_encode($data, JSON_UNESCAPED_UNICODE));
    sendMessage("▪️لطفا یوزر پنل را وارد کنید:", $cancelKey);
    exit();
}

if (preg_match('/^editServerPaneUser(.*)/', (string)$userInfo['step'], $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $data = json_decode($match[1], true);
    $data['panel_user'] = $text;
    setUser('editServerPanePassword' . json_encode($data, JSON_UNESCAPED_UNICODE));
    sendMessage("▪️لطفا پسورد پنل را وارد کنید:");
    exit();
}

if (preg_match('/^editServerPanePassword(.*)/', (string)$userInfo['step'], $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    sendMessage("⏳ در حال ورود به اکانت ...");
    $data = json_decode($match[1], true);

    $rowId = $data['rowId'];
    $panel_url = rtrim($data['panel_url'], '/');
    $serverName = $data['panel_user'];
    $serverPass = $text;

    $stmt = $connection->prepare("SELECT * FROM `server_config` WHERE `id` = ?");
    $stmt->bind_param('i', $rowId);
    $stmt->execute();
    $serverInfo = $stmt->get_result()->fetch_assoc();
    $stmt->close();

    $serverType = $serverInfo['type'];
    $loginResponse = ['success' => false, 'msg' => 'خطای نامشخص'];

    if ($serverType == "marzban") {
        $loginUrl = $panel_url . '/api/admin/token';
        $postFields = array('username' => $serverName, 'password' => $serverPass);

        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $loginUrl);
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5);
        curl_setopt($curl, CURLOPT_TIMEOUT, 5);
        curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($postFields));
        curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded', 'accept: application/json'));

        $raw_response = curl_exec($curl);
        $curl_error = curl_error($curl);
        curl_close($curl);

        if ($raw_response === false) {
            $loginResponse['msg'] = "خطای ارتباط: " . $curl_error;
        } else {
            $response = json_decode($raw_response, true);
            if (isset($response['access_token'])) {
                $loginResponse['success'] = true;
            } else {
                $loginResponse['msg'] = "اطلاعات ورود اشتباه است.";
            }
        }
    } else {
        $loginUrl = $panel_url . '/login';
        $postFields = array("username" => $serverName, "password" => $serverPass);

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $loginUrl);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
        curl_setopt($ch, CURLOPT_TIMEOUT, 15);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postFields));

        $raw_response = curl_exec($ch);
        $curl_error = curl_error($ch);
        curl_close($ch);

        if ($raw_response === false) {
            $loginResponse['msg'] = "خطای ارتباط (احتمالاً پورت بسته است): " . $curl_error;
        } else {
            $decoded = json_decode($raw_response, true);
            if (is_array($decoded)) {
                $loginResponse = $decoded;
            } else {
                $loginResponse['msg'] = "پاسخ نامعتبر از سرور.";
            }
        }
    }

    if (!isset($loginResponse['success']) || !$loginResponse['success']) {
        $errMsg = isset($loginResponse['msg']) ? $loginResponse['msg'] : "ناشناخته";
        sendMessage("⚠️ اطلاعات اشتباه است یا ربات نتوانست وصل شود!\nدلیل: `$errMsg`", null, "MARKDOWN");
    } else {
        $stmt = $connection->prepare("UPDATE `server_config` SET `panel_url` = ?, `username` = ?, `password` = ? WHERE `id` = ?");
        $stmt->bind_param("sssi", $panel_url, $serverName, $serverPass, $rowId);
        $stmt->execute();
        $stmt->close();

        sendMessage("اطلاعات ورود سرور با موفقیت عوض شد", $removeKeyboard);
    }

    $keys = getServerConfigKeys($rowId);
    sendMessage('☑️ مدیریت سرور ها:', $keys);
    setUser();
}
// -------------------------------------------------------------------
// 2. حذف سرور
// -------------------------------------------------------------------

// --- Start of Range 6867 to 7052 ---
if (preg_match('/^wizwizdeleteserver(\d+)/', (string)$data, $match) && ($from_id == $admin || ($userInfo['isAdmin'] == true && $permissions['servers']))) {
    editText($message_id, "از حذف سرور مطمئنی؟", json_encode(['inline_keyboard' => [
        [getBtn("yesDeleteServer", "yesDeleteServer" . $match[1]), getBtn("noDeleteServer", "showServerSettings" . $match[1] . "_0")]
    ]]));
}

if (preg_match('/^yesDeleteServer(\d+)/', (string)$data, $match) && ($from_id == $admin || ($userInfo['isAdmin'] == true && $permissions['servers']))) {
    // حذف از جدول اطلاعات سرور
    $stmt = $connection->prepare("DELETE FROM `server_info` WHERE `id`=?");
    $stmt->bind_param("i", $match[1]);
    $stmt->execute();
    $stmt->close();

    // حذف از جدول کانفیگ سرور
    $stmt = $connection->prepare("DELETE FROM `server_config` WHERE `id`=?");
    $stmt->bind_param("i", $match[1]);
    $stmt->execute();
    $stmt->close();

    alert("🙂 سرور با موفقیت حذف شد.");

    $keys = getServerListKeys();
    if ($keys == null)
        editText($message_id, "موردی یافت نشد");
    else
        editText($message_id, "☑️ مدیریت سرور ها:", $keys);
}

// -------------------------------------------------------------------
// 3. درخواست ویرایش اطلاعات پایه سرور (Name, Max, Remark, Flag)
// -------------------------------------------------------------------
if (preg_match('/^editServer(\D+)(\d+)/', (string)$data, $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    switch ($match[1]) {
        case "Name":
            $txt = "اسم";
            break;
        case "Max":
            $txt = "ظرفیت";
            break;
        case "Remark":
            $txt = "ریمارک";
            break;
        case "Flag":
            $txt = "پرچم";
            break;
        default:
            return;
    }

    delMessage();
    sendMessage("🔘|لطفا " . $txt . " جدید را وارد کنید\nبرای خالی کردن مقدار /empty را ارسال کنید", $cancelKey);
    setUser($data);
    exit();
}

// -------------------------------------------------------------------
// 4. ذخیره ویرایش اطلاعات پایه سرور
// -------------------------------------------------------------------
if (preg_match('/^editServer(\D+)(\d+)/', (string)$userInfo['step'], $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $sql = "";
    switch ($match[1]) {
        case "Name":
            $sql = "UPDATE `server_info` SET `title`";
            break;
        case "Flag":
            $sql = "UPDATE `server_info` SET `flag`";
            break;
        case "Remark":
            $sql = "UPDATE `server_info` SET `remark`";
            break;
        case "Max":
            $sql = "UPDATE `server_info` SET `ucount`";
            break;
    }

    if ($sql != "") {
        if ($text == "/empty") {
            $stmt = $connection->prepare("$sql = NULL WHERE `id`=?");
            $stmt->bind_param("i", $match[2]);
        } else {
            $stmt = $connection->prepare("$sql = ? WHERE `id`=?");
            $stmt->bind_param("si", $text, $match[2]);
        }
        $stmt->execute();
        $stmt->close();

        sendMessage($mainValues['saved_successfuly'], $removeKeyboard);
        setUser();

        // دریافت نام سرور برای جلوگیری از ارور
        $stmt = $connection->prepare("SELECT `title` FROM `server_info` WHERE `id`=?");
        $stmt->bind_param("i", $match[2]);
        $stmt->execute();
        $res = $stmt->get_result()->fetch_assoc();
        $stmt->close();
        $cname = $res['title'] ?? "ناشناس";

        $keys = getServerConfigKeys($match[2]);
        sendMessage("مدیریت سرور $cname", $keys);
    }
    exit();
}

// -------------------------------------------------------------------
// 5. درخواست ویرایش کانفیگ سرور (sni, header, etc)
// -------------------------------------------------------------------
if (preg_match('/^editsServer(\D+)(\d+)/', (string)$data, $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $txt = str_replace("_", " ", $match[1]);
    delMessage();
    sendMessage("🔘|لطفا " . $txt . " جدید را وارد کنید\nبرای خالی کردن متن /empty را وارد کنید", $cancelKey);
    setUser($data);
    exit();
}

// -------------------------------------------------------------------
// 6. ذخیره ویرایش کانفیگ سرور
// -------------------------------------------------------------------
if (preg_match('/^editsServer(\D+)(\d+)/', (string)$userInfo['step'], $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {

    // اعتبارسنجی مقادیر خاص
    if ($text != "/empty") {
        if ($match[1] == "header_type" && $text != "http" && $text != "none") {
            sendMessage("برای نوع header type فقط none و یا http مجاز است");
            exit();
        }
        if ($match[1] == "security" && $text != "tls" && $text != "none" && $text != "xtls" && $text != "reality") {
            sendMessage("برای نوع security مقادیر مجاز: tls, xtls, reality, none");
            exit();
        }
    }

    $column = "";
    switch ($match[1]) {
        case "sni":
            $column = "sni";
            break;
        case "header_type":
            $column = "header_type";
            break;
        case "request_header":
            $column = "request_header";
            break;
        case "response_header":
            $column = "response_header";
            break;
        case "security":
            $column = "security";
            break;
        case "tlsSettings":
            $column = "tlsSettings";
            break;
    }

    if ($column != "") {
        if ($text == "/empty") {
            $val = "";
            if ($column == "header_type" || $column == "security")
                $val = "none";

            $stmt = $connection->prepare("UPDATE `server_config` SET `$column` = ? WHERE `id`=?");
            $stmt->bind_param("si", $val, $match[2]);
        } else {
            $stmt = $connection->prepare("UPDATE `server_config` SET `$column` = ? WHERE `id`=?");
            $stmt->bind_param("si", $text, $match[2]);
        }
        $stmt->execute();
        $stmt->close();

        sendMessage($mainValues['saved_successfuly'], $removeKeyboard);
        setUser();

        // دریافت نام سرور
        $stmt = $connection->prepare("SELECT `title` FROM `server_info` WHERE `id`=?");
        $stmt->bind_param("i", $match[2]);
        $stmt->execute();
        $res = $stmt->get_result()->fetch_assoc();
        $stmt->close();
        $cname = $res['title'] ?? "ناشناس";

        $keys = getServerConfigKeys($match[2]);
        sendMessage("مدیریت سرور $cname", $keys);
    }
    exit();
}

// --- Start of Range 7053 to 7140 ---
if ($data == "discount_codes" && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    editText($message_id, "مدیریت کد های تخفیف", getDiscountCodeKeys());
}
if ($data == "addDiscountCode" && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    delMessage();
    sendMessage("🔘|لطفا مقدار تخفیف را وارد کنید\nبرای درصد علامت % را در کنار عدد وارد کنید در غیر آن مقدار تخفیف به تومان محاسبه میشود", $cancelKey);
    setUser($data);
}
if ($userInfo['step'] == "addDiscountCode" && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $dInfo = array();
    $dInfo['type'] = 'amount';
    if (strstr($text, "%"))
        $dInfo['type'] = 'percent';
    $text = trim(str_replace("%", "", $text));
    if (is_numeric($text)) {
        $dInfo['amount'] = $text;
        setUser("addDiscountDate" . json_encode($dInfo, JSON_UNESCAPED_UNICODE));
        sendMessage("🔘|لطفا مدت زمان این تخفیف را به روز وارد کنید\nبرای نامحدود بودن 0 وارد کنید");
    } else
        sendMessage("🔘|لطفا فقط عدد و یا درصد بفرستید");
}
if (preg_match('/^addDiscountDate(.*)/', (string)$userInfo['step'], $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    if (is_numeric($text)) {
        $dInfo = json_decode($match[1], true);
        $dInfo['date'] = $text != 0 ? time() + ($text * 24 * 60 * 60) : 0;

        setUser("addDiscountCount" . json_encode($dInfo, JSON_UNESCAPED_UNICODE));
        sendMessage("🔘|لطفا تعداد استفاده این تخفیف را وارد کنید\nبرای نامحدود بودن 0 وارد کنید");
    } else
        sendMessage("🔘|لطفا فقط عدد بفرستید");
}
if (preg_match('/^addDiscountCount(.*)/', (string)$userInfo['step'], $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    if (is_numeric($text)) {
        $dInfo = json_decode($match[1], true);
        $dInfo['count'] = $text > 0 ? $text : -1;

        setUser('addDiscountCanUse' . json_encode($dInfo, JSON_UNESCAPED_UNICODE));
        sendMessage("لطفا تعداد استفاده هر یوزر را وارد کنید");
    } else
        sendMessage("🔘|لطفا فقط عدد بفرستید");
}
if (preg_match('/^addDiscountCanUse(.*)/', (string)$userInfo['step'], $match) && $text != $buttonValues['cancel'] && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    if (is_numeric($text)) {
        $dInfo = json_decode($match[1], true);
        $dInfo['can_use'] = $text > 0 ? $text : -1;

        $hashId = RandomString();

        $stmt = $connection->prepare("INSERT INTO `discounts` (`hash_id`, `type`, `amount`, `expire_date`, `expire_count`, `can_use`)
                                        VALUES (?,?,?,?,?,?)");
        $stmt->bind_param("ssiiii", $hashId, $dInfo['type'], $dInfo['amount'], $dInfo['date'], $dInfo['count'], $dInfo['can_use']);
        $stmt->execute();
        $stmt->close();
        sendMessage("کد تخفیف جدید (<code>$hashId</code>) با موفقیت ساخته شد", $removeKeyboard, "HTML");
        setUser();
        sendMessage("مدیریت کد های تخفیف", getDiscountCodeKeys());
    } else
        sendMessage("🔘|لطفا فقط عدد بفرستید");
}
if (preg_match('/^delDiscount(\d+)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    $stmt = $connection->prepare("DELETE FROM `discounts` WHERE `id` = ?");
    $stmt->bind_param("i", $match[1]);
    $stmt->execute();
    $stmt->close();

    alert("کد تخفیف مورد نظر با موفقیت حذف شد");
    editText($message_id, "مدیریت کد های تخفیف", getDiscountCodeKeys());
}
if (preg_match('/^copyHash(.*)/', (string)$data, $match) && ($from_id == $admin || $userInfo['isAdmin'] == true)) {
    sendMessage("<code>" . $match[1] . "</code>", null, "HTML");
}
if ($data == "managePanel" and (($from_id == $admin || $userInfo['isAdmin'] == true))) {

    setUser();
    $msg = "
👤 عزیزم به بخش مدیریت خوشومدی 
🤌 هرچی نیاز داشتی میتونی اینجا طبق نیازهات اضافه و تغییر بدی ، عزیزم $first_name جان اگه از فروش ربات درآمد داری از من حمایت کن تا پروژه همیشه آپدیت بمونه !

🆔 @NetfreedomVPN

🚪 /start
";
    editText($message_id, $msg, getAdminKeys());
}
