<?php
/**
 * Auto-extracted module from the old large bot.php.
 * Loaded by bot.php in the original execution order.
 */

$__textSettingsService = dirname(__DIR__) . '/Services/TextSettingsService.php';
if (is_file($__textSettingsService)) { require_once $__textSettingsService; }
function bot_compact_menu_text($msg){
    $msg = trim((string)$msg);
    $msg = str_replace(["\xE2\x80\x8C", "\xE2\x80\x8D"], '', $msg);
    $msg = preg_replace('/[\s\x{200c}\x{200d}\x{0640}]+/u', '', $msg);
    $msg = preg_replace('/[^\p{L}\p{N}]+/u', '', $msg);
    return $msg ?: '';
}
function bot_is_menu_back_text($msg){
    $msg = trim((string)$msg);
    $msg = preg_replace('/\s+/u', ' ', $msg);
    if(in_array($msg, [
        '🔙بازگشت به منو', '🔙 بازگشت به منو', 'بازگشت به منو',
        '🔙بازگشت', '🔙 بازگشت', '➡️ بازگشت', '↩️ بازگشت', '⬅️ بازگشت', '🔙 برگشت', 'برگشت', 'بازگشت',
        '🏠 منوی اصلی', '🏠منوی اصلی'
    ], true)) return true;
    return in_array(bot_compact_menu_text($msg), ['بازگشت','برگشت','بازگشتبهمنو','برگشتبهمنو','منویاصلی'], true);
}
function bot_is_admin_menu_back_text($msg){
    $msg = trim((string)$msg);
    $msg = preg_replace('/\s+/u', ' ', $msg);
    if(in_array($msg, [
        '🔙بازگشت به منوی ادمین', '🔙 بازگشت به منوی ادمین', '↩️ بازگشت به منوی ادمین', '⬅️ بازگشت به منوی ادمین',
        '👤 پنل مدیریت 👤', '👤 پنل مدیریت', 'پنل مدیریت',
        'بازگشت به منوی ادمین', 'برگشت به منوی ادمین'
    ], true)) return true;
    return in_array(bot_compact_menu_text($msg), ['بازگشتبهمنویادمین','برگشتبهمنویادمین','پنلمدیریت'], true);
}
function bot_admin_menu_recently_sent($userID, $message){
    $dir = __DIR__ . '/cache';
    if(!is_dir($dir)) @mkdir($dir, 0755, true);
    $file = $dir . '/admin_menu_last_' . preg_replace('/[^0-9A-Za-z_\-]/', '_', (string)$userID) . '.json';
    $now = microtime(true);
    $last = [];
    if(is_file($file)){
        $raw = @file_get_contents($file);
        $tmp = json_decode((string)$raw, true);
        if(is_array($tmp)) $last = $tmp;
    }
    if(isset($last['time'], $last['message']) && (string)$last['message'] === (string)$message && ($now - (float)$last['time']) < 2.5){
        return true;
    }
    @file_put_contents($file, json_encode(['time'=>$now, 'message'=>(string)$message], JSON_UNESCAPED_UNICODE));
    return false;
}
function bot_web_panel_url(){
    $base = '';
    if(defined('BOT_PUBLIC_BASE_URL')){
        $base = rtrim((string)BOT_PUBLIC_BASE_URL, '/');
    }
    if($base === '' && !empty($_SERVER['HTTP_HOST'])){
        $https = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off');
        $scheme = $https ? 'https' : 'http';
        $dir = isset($_SERVER['SCRIPT_NAME']) ? rtrim(str_replace('\\','/', dirname((string)$_SERVER['SCRIPT_NAME'])), '/') : '';
        if($dir === '/') $dir = '';
        $base = $scheme . '://' . $_SERVER['HTTP_HOST'] . $dir;
    }
    if($base === '') return '';
    return $base . '/admin/login.php';
}
function bot_is_web_panel_button_text($msg){
    $msg = trim((string)$msg);
    if(in_array($msg, ['🌐 پنل وب', '🌐پنل وب', 'پنل وب', 'ورود به پنل وب', '🌐 ورود به پنل وب'], true)) return true;
    return bot_compact_menu_text($msg) === 'پنلوب' || bot_compact_menu_text($msg) === 'ورودبهپنلوب';
}

function bot_web_panel_page_url($page = 'login.php'){
    $login = bot_web_panel_url();
    if($login === '') return '';
    $base = preg_replace('~/admin/login\.php$~', '/admin', $login);
    $page = trim((string)$page);
    $safe = [
        'index.php','search.php','users.php','orders.php','tickets.php','gift-codes.php','keyboards.php','channels.php',
        'settings.php','texts.php','broadcast.php','backups.php','health.php','logs.php','admins.php','login.php'
    ];
    if(!in_array($page, $safe, true)) $page = 'index.php';
    return rtrim($base, '/') . '/' . $page;
}

function bot_admin_web_shortcut_sections(){
    return [
        'keyboards' => ['title'=>'🎛 کیبورد، رنگ و چینش دکمه‌ها', 'page'=>'keyboards.php', 'aliases'=>[
            '🔕خاموش و روشن🔔','خاموش و روشن','تنظیم جای دکمه‌ها','تغییر نام دکمه‌ها','رنگ دکمه‌ها','🧩 چینش و خاموش/روشن منوی کاربران'
        ]],
        'texts' => ['title'=>'📇 تنظیم متن‌ها و پیام‌های ربات', 'page'=>'texts.php', 'aliases'=>[
            '📇 تنظیم متن','تنظیم متن','متن شروع','متن فروشگاه','متن حساب کاربری','متن زیرمجموعه‌گیری'
        ]],
        'channels' => ['title'=>'📣 کانال‌ها و مسدودسازی چنل', 'page'=>'channels.php', 'aliases'=>[
            '🆔 تنظیم کانال','تنظیم کانال','🏠دریافت از کانال خود','⏱فاصله دریافت مجدد','🚫مسدودسازی چنل','مسدودسازی چنل'
        ]],
        'shop' => ['title'=>'🛍 فروشگاه، پرداخت و پشتیبانی', 'page'=>'settings.php', 'aliases'=>[
            '🆔 تنظیم آیدی پشتیبانی','تنظیم آیدی پشتیبانی'
        ]],
        'gifts' => ['title'=>'🎁 کد هدیه، الماس روزانه و پاداش‌ها', 'page'=>'gift-codes.php', 'aliases'=>[
            '🎉 کد هدیه','کد هدیه','🎁 الماس روزانه','الماس روزانه','هدیه استارت','پاداش جمع‌آوری الماس','👥 رفرال‌گیری'
        ]],
        'security' => ['title'=>'🛡 امنیت، ضداسپم و تخلف تبلیغ', 'page'=>'settings.php', 'aliases'=>[
            '🚫 تنظیم تخلف تبلیغ','تنظیم تخلف تبلیغ','🛡 سیستم ضد اسپم','سیستم ضد اسپم','✂️تنظیمات لغو سفارش','تنظیمات لغو سفارش','🚀 امکانات پیشرفته'
        ]],
        'admins' => ['title'=>'👤 مدیریت ادمین‌ها و دسترسی‌ها', 'page'=>'admins.php', 'aliases'=>[
            '👤ادمین ها','ادمین ها','مدیریت ادمین‌ها'
        ]],
    ];
}

function bot_admin_web_shortcut_map($msg){
    $msg = trim((string)$msg);
    $compact = function_exists('bot_compact_menu_text') ? bot_compact_menu_text($msg) : preg_replace('/\s+/u','', $msg);
    if(in_array($msg, ['⚙️ تنظیمات وب','تنظیمات وب','🧰 ابزارهای سریع','ابزارهای سریع'], true)) return ['mode'=>$msg === '🧰 ابزارهای سریع' || $msg === 'ابزارهای سریع' ? 'quick' : 'all'];
    $direct = [
        '👤 جستجوی کاربر' => ['title'=>'👤 جستجوی سریع کاربر', 'page'=>'search.php'],
        'جستجوی کاربر' => ['title'=>'👤 جستجوی سریع کاربر', 'page'=>'search.php'],
        '📦 سفارش‌ها' => ['title'=>'📦 مدیریت سفارش‌ها', 'page'=>'orders.php'],
        'سفارش‌ها' => ['title'=>'📦 مدیریت سفارش‌ها', 'page'=>'orders.php'],
    ];
    foreach($direct as $alias=>$row){
        if($msg === $alias || $compact === (function_exists('bot_compact_menu_text') ? bot_compact_menu_text($alias) : preg_replace('/\s+/u','',$alias))){
            return ['mode'=>'section', 'key'=>'direct', 'row'=>$row];
        }
    }
    foreach(bot_admin_web_shortcut_sections() as $key=>$row){
        foreach((array)($row['aliases'] ?? []) as $alias){
            if($msg === $alias || $compact === (function_exists('bot_compact_menu_text') ? bot_compact_menu_text($alias) : preg_replace('/\s+/u','',$alias))){
                return ['mode'=>'section', 'key'=>$key, 'row'=>$row];
            }
        }
    }
    return null;
}

function bot_admin_web_shortcut_router($msg){
    global $chatID, $msg_id, $Button_back_panel;
    $hit = bot_admin_web_shortcut_map($msg);
    if(!is_array($hit)) return false;
    if(($hit['mode'] ?? '') === 'quick'){
        $rows = [
            [['text'=>'👤 جستجوی کاربر در وب', 'url'=>bot_web_panel_page_url('search.php')]],
            [['text'=>'📦 سفارش‌ها', 'url'=>bot_web_panel_page_url('orders.php')], ['text'=>'📢 ارسال همگانی', 'url'=>bot_web_panel_page_url('broadcast.php')]],
            [['text'=>'🛡 سلامت سیستم', 'url'=>bot_web_panel_page_url('health.php')], ['text'=>'👤 ادمین‌ها', 'url'=>bot_web_panel_page_url('admins.php')]],
        ];
        bot('sendMessage', [
            'chat_id'=>$chatID,
            'text'=>"🧰 <b>ابزارهای سریع</b>

برای تنظیمات سنگین از پنل وب استفاده کن تا منوی ربات خلوت و بدون خطای دکمه تکراری بماند.",
            'parse_mode'=>'HTML',
            'reply_to_message_id'=>$msg_id,
            'reply_markup'=>json_encode(['inline_keyboard'=>$rows], JSON_UNESCAPED_UNICODE)
        ]);
        return true;
    }
    $sections = bot_admin_web_shortcut_sections();
    if(($hit['mode'] ?? '') === 'section'){
        $row = $hit['row'];
        $url = bot_web_panel_page_url($row['page'] ?? 'index.php');
        bot('sendMessage', [
            'chat_id'=>$chatID,
            'text'=>"🌐 <b>این بخش به پنل وب منتقل شده است.</b>

".htmlspecialchars($row['title'], ENT_QUOTES, 'UTF-8')."

برای جلوگیری از شلوغی پنل ربات و باگ تکراری‌شدن دکمه‌ها، تنظیمات این بخش از وب‌پنل انجام می‌شود.",
            'parse_mode'=>'HTML',
            'reply_to_message_id'=>$msg_id,
            'reply_markup'=>json_encode(['inline_keyboard'=>[
                [['text'=>'🌐 باز کردن همین بخش در پنل وب', 'url'=>$url]],
                [['text'=>'🏠 داشبورد پنل وب', 'url'=>bot_web_panel_page_url('index.php')]],
            ]], JSON_UNESCAPED_UNICODE)
        ]);
        return true;
    }
    $rows = [];
    foreach($sections as $row){
        $rows[] = [[ 'text'=>$row['title'], 'url'=>bot_web_panel_page_url($row['page'] ?? 'index.php') ]];
    }
    $rows[] = [[ 'text'=>'🏠 داشبورد پنل وب', 'url'=>bot_web_panel_page_url('index.php') ]];
    bot('sendMessage', [
        'chat_id'=>$chatID,
        'text'=>"⚙️ <b>تنظیمات وب</b>

تنظیمات سنگین از پنل ربات جمع شده و از اینجا مستقیم به صفحه مربوط در پنل وب می‌روی.",
        'parse_mode'=>'HTML',
        'reply_to_message_id'=>$msg_id,
        'reply_markup'=>json_encode(['inline_keyboard'=>$rows], JSON_UNESCAPED_UNICODE)
    ]);
    return true;
}
function bot_show_admin_main_menu($chatID, &$user, $userID, $message = '👤 پنل مدیریت'){
    global $Button_Panel;
    $user['step'] = 'none';
    unset($user['pending_member_order']);
    saveJson("melat/$userID.json", $user);
    if(bot_admin_menu_recently_sent($userID, $message)) return;
    bot('sendMessage', [
        'chat_id'=>$chatID,
        'text'=>$message,
        'parse_mode'=>'HTML',
        'reply_markup'=>$Button_Panel
    ]);
}
function bot_show_user_main_menu($chatID, &$user, $userID){
    global $Button_Home;
    $user['step'] = 'none';
    unset($user['pending_member_order'], $user['admin_viewing_user_menu']);
    saveJson("melat/$userID.json", $user);
    $keyboard = function_exists('bot_home_build_reply_keyboard') ? bot_home_build_reply_keyboard(false) : $Button_Home;
    bot('sendMessage', [
        'chat_id'=>$chatID,
        'text'=>'🏠 منوی اصلی',
        'parse_mode'=>'HTML',
        'reply_markup'=>$keyboard
    ]);
}

function bot_show_user_main_menu_for_admin($chatID, &$user, $userID){
    $user['step'] = 'none';
    unset($user['pending_member_order']);
    $user['admin_viewing_user_menu'] = 1;
    saveJson("melat/$userID.json", $user);
    $keyboard = function_exists('bot_home_build_reply_keyboard') ? bot_home_build_reply_keyboard(false) : (isset($GLOBALS['Button_Home']) ? $GLOBALS['Button_Home'] : null);
    bot('sendMessage', [
        'chat_id'=>$chatID,
        'text'=>'👥 پنل کاربران عادی نمایش داده شد. برای برگشت به مدیریت، /start را بزنید یا «👤 پنل مدیریت 👤» را ارسال کنید.',
        'parse_mode'=>'HTML',
        'reply_markup'=>$keyboard
    ]);
}
function bot_is_admin_user_menu_text($msg){
    $msg = trim((string)$msg);
    return in_array($msg, ['👥 مشاهده پنل کاربران عادی', '👥 پنل کاربران عادی', '👥 منوی کاربر', '👤 منوی کاربر', '👥 ورود به منوی کاربر', '👤 ورود به منوی کاربر'], true);
}

function bot_shop_main_inline_keyboard(){
    global $money, $icmoney;
    return json_encode(['inline_keyboard'=>[
        [["text"=>"💎 خرید بسته‌های $money", 'callback_data' => "shop-coin"]],
        [["text"=>"♻️ خرید و تمدید پنل", 'callback_data' => "shop-panel"]],
        [["text"=>"📋 راهنمای پرداخت", 'callback_data' => "shop-help"]],
    ]], JSON_UNESCAPED_UNICODE);
}
function bot_shop_home_text(){
    global $money, $icmoney;
    return "🛍 **فروشگاه ربات**

".
           "از این بخش می‌توانید بسته‌های $money یا پنل ویژه تهیه کنید.

".
           "✅ پرداخت امن زیبال
".
           "✅ شارژ خودکار بعد از پرداخت موفق
".
           "✅ ثبت کد پیگیری تراکنش

".
           "یکی از گزینه‌های زیر را انتخاب کنید:";
}
function bot_shop_pay_keyboard($paymentUrl, $backCallback='shop-back'){
    return json_encode(['inline_keyboard'=>[
        [["text"=>"💳 ورود به درگاه امن زیبال", 'url'=>$paymentUrl]],
        [["text"=>"🔙 برگشت به فروشگاه", 'callback_data'=>$backCallback]],
    ]], JSON_UNESCAPED_UNICODE);
}
function bot_shop_coin_list_text(){
    global $money;
    $items = function_exists('bot_shop_valid_coin_items') ? bot_shop_valid_coin_items() : [];
    $text = "💎 **خرید بسته‌های $money**

";
    if(!$items) return $text."فعلاً بسته فعالی توسط مدیریت تنظیم نشده است.";
    $text .= "بسته موردنظر را انتخاب کنید:

";
    foreach($items as $it){
        $text .= "▫️ **".htmlspecialchars((string)$it['label'], ENT_QUOTES, 'UTF-8')."**
";
        $text .= "   مقدار: **".(int)$it['coins']." $money** | مبلغ: **".number_format((int)$it['amount'])." ریال**
";
    }
    return $text;
}
function bot_shop_panel_list_text(){
    $items = function_exists('bot_shop_valid_panel_items') ? bot_shop_valid_panel_items() : [];
    $text = "♻️ **خرید و تمدید پنل**

";
    if(!$items) return $text."فعلاً پلن فعالی توسط مدیریت تنظیم نشده است.";
    $text .= "پلن موردنظر را انتخاب کنید:

";
    foreach($items as $it){
        $text .= "▫️ **".htmlspecialchars((string)$it['label'], ENT_QUOTES, 'UTF-8')."**
";
        $text .= "   نوع: **".htmlspecialchars((string)$it['type'], ENT_QUOTES, 'UTF-8')."** | مدت: **".(int)$it['days']." روز** | مبلغ: **".number_format((int)$it['amount'])." ریال**
";
    }
    return $text;
}
function bot_normalize_iran_mobile($input){
    $s = trim((string)$input);
    $fa = ['۰','۱','۲','۳','۴','۵','۶','۷','۸','۹','٠','١','٢','٣','٤','٥','٦','٧','٨','٩'];
    $en = ['0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9'];
    $s = str_replace($fa, $en, $s);
    $s = preg_replace('/[^0-9+]/', '', $s);
    if(strpos($s, '+98') === 0) $s = '98'.substr($s, 3);
    if(strpos($s, '0098') === 0) $s = '98'.substr($s, 4);
    if(preg_match('/^09\d{9}$/', $s)) return '98'.substr($s, 1);
    if(preg_match('/^9\d{9}$/', $s)) return '98'.$s;
    if(preg_match('/^989\d{9}$/', $s)) return $s;
    return '';
}
function bot_shop_phone_request_keyboard($back){
    return json_encode([
        'resize_keyboard'=>true,
        'keyboard' => [[['text'=>"⏳تایید شماره⏳",'request_contact'=>true], ['text'=>(string)$back]]],
    ], JSON_UNESCAPED_UNICODE);
}

function bot_show_member_order_admin_panel($chatID, $messageId = null){
    global $money;
    $text = "💢 به بخش تنظیمات آیتم های سفارش ممبر خوش آمدید

".
            "از این بخش آیتم‌های سفارش را دانه‌دانه تنظیم کنید. فقط آیتم‌هایی که نام، تعداد عضو و هزینه‌شان کامل باشد به کاربران نمایش داده می‌شود.

".
            "برای هر آیتم سه مقدار لازم است:
".
            "1) نام آیتم
2) تعداد عضو
3) هزینه با واحد $money";
    $payload = [
        'chat_id'=>$chatID,
        'text'=>$text,
        'parse_mode'=>'HTML',
        'reply_markup'=>bot_member_order_admin_keyboard()
    ];
    if($messageId){
        $payload['message_id'] = $messageId;
        bot('editMessageText', $payload);
    } else {
        bot('sendMessage', $payload);
    }
}
function bot_member_order_next_id(){
    if(function_exists('bot_sql_pdo')){
        $pdo = bot_sql_pdo();
        if($pdo){
            try{
                $max = (int)$pdo->query("SELECT COALESCE(MAX(CAST(order_id AS UNSIGNED)),0) FROM bot_orders WHERE order_id REGEXP '^[0-9]+$'")->fetchColumn();
                return (string)($max + 1);
            }catch(Throwable $e){ error_log('BOT next order id SQL failed: '.$e->getMessage()); }
        }
    }
    $scan = bot_data_scandir('ads');
    $max = 0;
    foreach($scan as $value){
        if(preg_match('/^(\d+)\.json$/', (string)$value, $m)) $max = max($max, (int)$m[1]);
    }
    return (string)($max + 1);
}
function bot_member_order_post_keyboard($orderId, $memberCount){
    global $keyboard_ch, $dokc0, $dokc1, $dokc2, $dokc3, $dokc4, $boter_id, $icmoney, $money;

    // Channel post buttons must always include the reward callback.
    // Some previous layout patches could hide/overwrite the reward button from order posts.
    foreach(['dokc0','dokc1','dokc2','dokc3','dokc4'] as $k){
        $$k = bot_data_get_text("lib/Button/{$k}.txt", isset($$k) ? $$k : '');
    }

    $vars = ['MONEY'=>($money ?: 'الماس'), 'MONY'=>($money ?: 'الماس'), 'ICMONEY'=>($icmoney ?: '💎'), 'IC'=>($icmoney ?: '💎'), 'MEMBERS'=>$memberCount, 'OZV'=>$memberCount, 'ORDER_ID'=>$orderId];
    $cleanLabel = function($value, $fallback) use ($vars, $memberCount){
        $value = trim((string)$value);
        if($value === '' || in_array($value, ['0','off','خاموش','غیرفعال','تنظیم نشده'], true)) $value = (string)$fallback;
        $value = str_replace(['/ozv/','{ozv}','{OZV}','OZV'], (string)$memberCount, $value);
        if(function_exists('bot_clean_legacy_display_text')) $value = bot_clean_legacy_display_text($value, $vars);
        elseif(function_exists('bot_text_settings_apply_vars')) $value = bot_text_settings_apply_vars($value, $vars);
        $value = preg_replace('/\s{2,}/u', ' ', (string)$value);
        return trim((string)$value);
    };

    $dokc0 = $cleanLabel($dokc0, "👥 سفارش {$memberCount} ممبر");
    $dokc1 = $cleanLabel($dokc1, '📢 عضویت در کانال/گروه');
    $dokc2 = $cleanLabel($dokc2, "💎 دریافت ".($money ?: 'الماس')." 💎");
    $dokc3 = $cleanLabel($dokc3, '🚫 گزارش تخلف');
    $dokc4 = $cleanLabel($dokc4, '🤖 ورود به ربات');

    // Never allow old placeholder text or an empty/disabled reward button on channel order posts.
    if(trim((string)$dokc2) === '' || preg_match('/\b(MONEY|MONY|ICMONEY|ICON|IC)\b/iu', (string)$dokc2)){
        $dokc2 = "💎 دریافت ".($money ?: 'الماس')." 💎";
    }

    $channelUrl = $GLOBALS['__pending_order_channel_url'] ?? 'https://t.me/';
    $botUser = trim((string)$boter_id, '@/ ');
    $botUrl = $botUser !== '' ? ('https://t.me/' . $botUser) : 'https://t.me/';
    $layout = (int)$keyboard_ch;

    $styleBtn = function($token, array $button){
        return function_exists('bot_channel_button_apply_style') ? bot_channel_button_apply_style($token, $button) : $button;
    };

    // All channel-post buttons are built first, then the admin-defined layout
    // decides row/order. This keeps getcoin/report callbacks safe while allowing
    // the web panel to reorder channel buttons.
    $buttonByToken = [
        'DOKC0' => $styleBtn('DOKC0', ["text"=>$dokc0, 'callback_data'=>'order-noop']),
        'DOKC1' => $styleBtn('DOKC1', ["text"=>$dokc1, 'url'=>$channelUrl]),
        'DOKC2' => $styleBtn('DOKC2', ["text"=>$dokc2, 'callback_data'=>"getcoin-$orderId"]),
        'DOKC3' => $styleBtn('DOKC3', ["text"=>$dokc3, 'callback_data'=>"goz-$orderId"]),
        'DOKC4' => $styleBtn('DOKC4', ["text"=>$dokc4, 'url'=>$botUrl]),
    ];
    if(function_exists('bot_channel_button_build_rows')){
        $rows = bot_channel_button_build_rows($buttonByToken, $layout);
    } else {
        $rows = [
            [$buttonByToken['DOKC0']],
            [$buttonByToken['DOKC1']],
            [$buttonByToken['DOKC2'], $buttonByToken['DOKC3']],
            [$buttonByToken['DOKC4']],
        ];
    }
    return json_encode(['inline_keyboard'=>$rows], JSON_UNESCAPED_UNICODE);
}

function bale_resolve_order_id_from_callback($rawId){
    $rawId = preg_replace('/[^A-Za-z0-9_\-]/', '', (string)$rawId);
    if($rawId === '') return '';
    if(function_exists('bot_data_file_exists') && bot_data_file_exists("ads/$rawId.json")) return $rawId;
    // Compatibility: older/repaired posts may have used postid/message_id instead of the real order code.
    $scan = function_exists('bot_data_scandir') ? bot_data_scandir('ads') : (is_dir('ads') ? scandir('ads') : []);
    foreach((array)$scan as $file){
        if(!preg_match('/^([A-Za-z0-9_\-]+)\.json$/', (string)$file, $m)) continue;
        $oid = $m[1];
        $order = function_exists('bot_data_get_json') ? bot_data_get_json("ads/$oid.json") : [];
        if(!is_array($order) || !$order) continue;
        $postIds = [
            (string)($order['postid'] ?? ''),
            (string)($order['post_message_id'] ?? ''),
            (string)($order['message_id'] ?? ''),
            (string)($order['id'] ?? ''),
            (string)($order['code'] ?? ''),
        ];
        if(in_array((string)$rawId, $postIds, true)) return $oid;
    }
    return $rawId;
}

function bot_finalize_pending_member_order($chatID, $userID, &$user, $messageIdToEdit = null){
    global $tokens_bot, $chads, $data_ads, $time45, $money, $Button_Home;
    $pending = isset($user['pending_member_order']) && is_array($user['pending_member_order']) ? $user['pending_member_order'] : [];
    if(empty($pending)){
        bot('sendMessage', ['chat_id'=>$chatID, 'text'=>'❌ سفارش در انتظار تأیید پیدا نشد. لطفاً دوباره ثبت سفارش را شروع کنید.', 'reply_markup'=>$Button_Home]);
        $user['step'] = 'none'; unset($user['pending_member_order']); saveJson("melat/$userID.json", $user); return false;
    }
    $memberCount = (int)($pending['members'] ?? 0); $cost = (int)($pending['points'] ?? 0); $currentPoints = (int)($user['Points'] ?? 0);
    if(function_exists('bot_adv_user_level_get')){
        $levelInfo = bot_adv_user_level_get($userID);
        $levelKey = (string)($levelInfo['level_key'] ?? 'normal');
        $dailyLimit = (int)($levelInfo['daily_order_limit'] ?? 0);
        if($levelKey === 'blocked'){
            bot('sendMessage', ['chat_id'=>$chatID, 'text'=>'❌ حساب شما برای ثبت سفارش محدود شده است. با پشتیبانی تماس بگیرید.', 'reply_markup'=>$Button_Home]);
            $user['step'] = 'none'; unset($user['pending_member_order']); saveJson("melat/$userID.json", $user); return false;
        }
        if($dailyLimit > 0 && function_exists('bot_sql_pdo') && ($pdoLimit = bot_sql_pdo())){
            try{
                $stLimit = $pdoLimit->prepare('SELECT COUNT(*) FROM bot_orders WHERE owner_id=? AND created_at >= CURDATE()');
                $stLimit->execute([(string)$userID]);
                $todayCount = (int)$stLimit->fetchColumn();
                if($todayCount >= $dailyLimit){
                    bot('sendMessage', ['chat_id'=>$chatID, 'text'=>"❌ سقف ثبت سفارش امروز شما تکمیل شده است.\nسطح حساب: {$levelKey}\nسقف امروز: {$dailyLimit} سفارش", 'reply_markup'=>$Button_Home]);
                    $user['step'] = 'none'; unset($user['pending_member_order']); saveJson("melat/$userID.json", $user); return false;
                }
            }catch(Throwable $e){}
        }
    }
    if($memberCount <= 0 || $cost <= 0){
        bot('sendMessage', ['chat_id'=>$chatID, 'text'=>'❌ اطلاعات سفارش ناقص است. لطفاً دوباره از بخش ثبت سفارش شروع کنید.', 'reply_markup'=>$Button_Home]);
        $user['step'] = 'none'; unset($user['pending_member_order']); saveJson("melat/$userID.json", $user); return false;
    }
    if($currentPoints < $cost){
        if(function_exists('bot_text_settings_get')){
            $txt = bot_text_settings_get('no_balance');
            $vars = ['COST'=>$cost, 'BALANCE'=>$currentPoints, 'MONEY'=>$money];
            $txt = function_exists('bot_text_settings_apply_vars') ? bot_text_settings_apply_vars($txt, $vars) : str_replace(['COST','BALANCE','MONEY'], [$cost, $currentPoints, $money], $txt);
        }else{
            $txt = "❌ موجودی کافی نیست.

هزینه سفارش: $cost $money
موجودی شما: $currentPoints $money";
        }
        bot('sendMessage', ['chat_id'=>$chatID, 'text'=>$txt, 'parse_mode'=>'HTML', 'reply_markup'=>$Button_Home]); return false;
    }
    $channelRef = normalize_bale_channel_username($pending['channel_ref'] ?? '');
    if(function_exists('bale_channel_is_blocked') && bale_channel_is_blocked($channelRef)){
        bot('sendMessage', ['chat_id'=>$chatID, 'text'=>"❌ این چنل توسط مدیریت مسدود شده و امکان ثبت سفارش برای آن وجود ندارد.

".bale_channel_display_name($channelRef), 'reply_markup'=>$Button_Home]);
        $user['step'] = 'none'; unset($user['pending_member_order']); saveJson("melat/$userID.json", $user); return false;
    }
    $botStatusForOrder = bale_bot_channel_status($channelRef);
    if(empty($botStatusForOrder['admin'])){
        bot('sendMessage', ['chat_id'=>$chatID, 'text'=>"❌ ربات ادمین کانال/گروه نیست یا دسترسی بررسی عضویت قطع شده است.\n\nهدف سفارش: ".bale_channel_display_name($channelRef)."\n\nلطفاً ربات را داخل همان کانال/گروه ادمین کنید و دوباره تلاش کنید.", 'reply_markup'=>$Button_Home]); return false;
    }
    $descch1 = trim((string)($pending['title'] ?? '')) ?: 'فاقد عنوان️';
    $descch2 = normalize_bale_channel_username($pending['username'] ?? $channelRef);
    $descch3 = (string)($pending['channel_id'] ?? '');
    $descch4 = trim((string)($pending['description'] ?? '')) ?: 'فاقد توضیحات';
    $targetType = (string)($pending['chat_type'] ?? 'channel');
    $targetLabel = function_exists('bale_chat_type_label') ? bale_chat_type_label($targetType) : 'کانال/گروه';
    if($descch3 !== '') bale_save_channel_map_entry($descch2, $descch3, $descch1);
    $orderId = bot_member_order_next_id();
    $joinRef = $descch2 !== '' ? $descch2 : ($descch3 !== '' ? $descch3 : $channelRef);
    $joinUrl = function_exists('bale_public_or_invite_url_for_chat') ? bale_public_or_invite_url_for_chat($joinRef, 'order-'.$orderId) : ($descch2 !== '' && !is_bale_numeric_chat_id($descch2) ? "https://t.me/$descch2" : '');
    if($joinUrl === ''){
        bot('sendMessage', ['chat_id'=>$chatID, 'text'=>"❌ لینک عضویت برای این {$targetLabel} ساخته نشد.\n\nاگر {$targetLabel} خصوصی است، ربات باید ادمین باشد و دسترسی افزودن/دعوت کاربران داشته باشد؛ سپس دوباره سفارش را ثبت کنید.", 'reply_markup'=>$Button_Home]);
        return false;
    }
    $GLOBALS['__pending_order_channel_url'] = $joinUrl;
    $Button_ch1 = bot_member_order_post_keyboard($orderId, $memberCount); unset($GLOBALS['__pending_order_channel_url']);
    $postText = "‼️نام {$targetLabel} : $descch1\n\n📝توضیحات {$targetLabel}: $descch4\n\n🆔" . ($descch2 !== '' && !is_bale_numeric_chat_id($descch2) ? "@$descch2" : bale_channel_display_name($joinRef));
    $adsChatApi = function_exists('bot_telegram_chat_ref_for_api') ? bot_telegram_chat_ref_for_api($chads) : (preg_match('/^-?\d+$/', trim((string)$chads)) ? trim((string)$chads) : '@'.trim((string)$chads, '@/ '));
    $post_id = null;
    if(($data_ads['noeeads'] ?? 'متنی') === 'عکس دار' && !empty($pending['photo_file_id']) && function_exists('curl_init')){
        $file = bot('getfile', ['file_id'=>$pending['photo_file_id']]);
        if(isset($file->result->file_path)){
            $photoPath = 'photos/order_'.$orderId.'.jpg'; $pic = @file_get_contents("https://api.telegram.org/file/bot$tokens_bot/".$file->result->file_path);
            if($pic !== false){ @file_put_contents($photoPath, $pic); $res = bot('SendPhoto', ['chat_id'=>$adsChatApi, 'photo'=>new CURLFile($photoPath), 'caption'=>$postText, 'parse_mode'=>'html', 'reply_markup'=>$Button_ch1]); @unlink($photoPath); if(isset($res->result->message_id)) $post_id = $res->result->message_id; }
        }
    }
    if(!$post_id){ $res = bot('sendMessage', ['chat_id'=>$adsChatApi, 'text'=>$postText, 'parse_mode'=>'html', 'reply_markup'=>$Button_ch1]); $post_id = $res->result->message_id ?? 0; }
    if(!$post_id){ bot('sendMessage', ['chat_id'=>$chatID, 'text'=>'❌ ارسال پست سفارش در کانال تبلیغات انجام نشد. تنظیمات کانال تبلیغات و ادمین بودن ربات را بررسی کنید.', 'reply_markup'=>$Button_Home]); return false; }
    $order = [];
    $order['admin'] = $userID; $order['owner_id'] = (string)$userID; $order['Points'] = (string)$cost; $order['postid'] = $post_id; $order['post_message_id'] = (string)$post_id; $order['post_chat_id'] = $adsChatApi; $order['channel'] = $descch2 ?: ($descch3 ?: $channelRef); $order['channel_id'] = $descch3; $order['chat_type'] = $targetType; $order['join_url'] = $joinUrl; $order['tedad'] = '0'; $order['stamp'] = $time45; $order['created_ts'] = $time45; $order['left'] = [''];
    $order['time-cancell'] = "$time45"; $order['time'] = jdate('H:i'); $order['date'] = jdate('d') . ' ' . jdate('F') . ' ۱۴' . jdate('y'); $order['time-sabt'] = '0'; $order['Report'] = []; $order['members'] = [];
    $order['claim_started'] = []; $order['pre_members'] = []; $order['pre_members_log'] = []; $order['reward_mode'] = 'direct_once_per_channel'; $order['member'] = (string)$memberCount; $order['stats'] = 'در حال اجرا ♻️';
    bot_data_put_json("ads/$orderId.json", $order);
    if(function_exists('bot_cache_invalidate_for_path')) bot_cache_invalidate_for_path("ads/$orderId.json");
    $user['step'] = 'none'; unset($user['pending_member_order']); $user['Points'] = $currentPoints - $cost; $user['sefaresh'] = (int)($user['sefaresh'] ?? 0) + 1; if(!isset($user['ads-id']) || !is_array($user['ads-id'])) $user['ads-id'] = []; $user['ads-id'][] = "$orderId"; saveJson("melat/$userID.json", $user);
    if($messageIdToEdit) bot('editMessageText', ['chat_id'=>$chatID, 'message_id'=>$messageIdToEdit, 'text'=>$postText, 'parse_mode'=>'html']);
    bot('sendMessage', ['chat_id'=>$chatID, 'text'=>"✅ سفارش شما با موفقیت ثبت شد\n\n🔍 کد پیگیری سفارش شما $orderId می‌باشد\n\n👥 سفارش شما در قسمت پیگیری سفارشات قابل پیگیری است.", 'reply_markup'=>json_encode(['inline_keyboard'=>[[['text'=>'📇 مشاهده سفارش','callback_data'=>"vieworder-$orderId"]]]], JSON_UNESCAPED_UNICODE)]);
    return true;
}
