<?php

if(!function_exists('bot_payment_event_log_append')){
    function bot_payment_event_log_append(array $event){
        $root = defined('BOT_ROOT_DIR') ? rtrim((string)BOT_ROOT_DIR, '/') : rtrim(dirname(__DIR__, 2), '/');
        $dir = $root . '/cache';
        if(!is_dir($dir)) @mkdir($dir, 0775, true);
        $path = $dir . '/payment_report_events.json';
        $all = [];
        if(is_file($path)){
            $j = json_decode((string)@file_get_contents($path), true);
            if(is_array($j)) $all = isset($j['events']) && is_array($j['events']) ? $j['events'] : $j;
        }
        $event['logged_at'] = $event['logged_at'] ?? time();
        $event['status'] = $event['status'] ?? 'paid';
        $id = (string)($event['id'] ?? $event['receipt_id'] ?? $event['authority'] ?? $event['factor'] ?? ('event_'.time().'_'.count($all)));
        $key = (string)($event['source'] ?? 'payment').':'.$id.':'.($event['user_id'] ?? '').':'.($event['amount'] ?? '').':'.($event['reward_amount'] ?? '');
        $event['event_key'] = $key;
        foreach($all as $old){ if(is_array($old) && (string)($old['event_key'] ?? '') === $key) return true; }
        $all[] = $event;
        if(count($all) > 5000) $all = array_slice($all, -5000);
        $tmp = $path.'.tmp';
        @file_put_contents($tmp, json_encode(['events'=>$all], JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT), LOCK_EX);
        @rename($tmp, $path);
        return true;
    }
}

/**
 * Simple diamond shop service.
 * Supports configurable packages, card-to-card receipts, Zibal, and support-based purchases.
 */

function bot_simple_html($v){ return htmlspecialchars((string)$v, ENT_QUOTES, 'UTF-8'); }
function bot_simple_fa_num($value){
    $fa = ['۰','۱','۲','۳','۴','۵','۶','۷','۸','۹','٠','١','٢','٣','٤','٥','٦','٧','٨','٩'];
    $en = ['0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9'];
    return str_replace($fa, $en, (string)$value);
}
function bot_simple_clean_int($value){
    $s = preg_replace('/[^0-9]/', '', bot_simple_fa_num($value));
    return (int)$s;
}
function bot_simple_format_money($amount){ return number_format((int)$amount).' ریال'; }
function bot_simple_shop_read($path, $default=''){
    if(function_exists('bot_data_get_text')) return (string)bot_data_get_text($path, $default);
    return is_file($path) ? (string)file_get_contents($path) : (string)$default;
}
function bot_simple_shop_write($path, $value){
    if(function_exists('Save')) { Save($path, (string)$value); return true; }
    if(function_exists('bot_data_put_raw')) return bot_data_put_raw($path, (string)$value);
    $dir = dirname($path); if(!is_dir($dir)) @mkdir($dir, 0755, true);
    return file_put_contents($path, (string)$value) !== false;
}
function bot_simple_shop_get_json($path, $default=[]){
    if(function_exists('bot_data_get_json')){
        $v = bot_data_get_json($path, $default);
        return is_array($v) ? $v : $default;
    }
    if(!is_file($path)) return $default;
    $v = json_decode((string)file_get_contents($path), true);
    return is_array($v) ? $v : $default;
}
function bot_simple_shop_put_json($path, $data){
    if(function_exists('saveJson')) { saveJson($path, $data); return true; }
    if(function_exists('bot_data_put_json')) return bot_data_put_json($path, $data);
    $dir = dirname($path); if(!is_dir($dir)) @mkdir($dir, 0755, true);
    return file_put_contents($path, json_encode($data, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT)) !== false;
}
function bot_simple_placeholder($value){
    $v = trim((string)$value);
    if($v === '' || $v === '0' || $v === '-' || strtolower($v) === 'null') return true;
    foreach(['تنظیم','بازگشت','منوی ادمین','برگشت','null'] as $b){
        if(mb_strpos(mb_strtolower($v,'UTF-8'), mb_strtolower($b,'UTF-8'), 0, 'UTF-8') !== false) return true;
    }
    return false;
}
function bot_simple_shop_settings(){
    $defaults = [
        'card_enabled' => true,
        'zibal_enabled' => true,
        'zibal_merchant_id' => '6a22c9706d403d333efab345',
        'zibal_sandbox' => false,
        'support_buy_enabled' => false,
        'support_contact' => '',
    ];
    $cfg = bot_simple_shop_get_json('lib/kodam/shop_payment_settings.json', []);
    if(!is_array($cfg)) $cfg = [];
    // Migration from previous Zarinpal keys to Zibal keys.
    if(array_key_exists('zarinpal_enabled', $cfg) && !array_key_exists('zibal_enabled', $cfg)) $cfg['zibal_enabled'] = !empty($cfg['zarinpal_enabled']);
    if(array_key_exists('zarinpal_merchant_id', $cfg) && !array_key_exists('zibal_merchant_id', $cfg)) $cfg['zibal_merchant_id'] = (string)$cfg['zarinpal_merchant_id'];
    if(array_key_exists('zarinpal_sandbox', $cfg) && !array_key_exists('zibal_sandbox', $cfg)) $cfg['zibal_sandbox'] = !empty($cfg['zarinpal_sandbox']);
    $cfg = array_intersect_key($cfg, array_flip(array_keys($defaults)));
    return array_merge($defaults, $cfg);
}
function bot_simple_shop_setting($key, $default=null){
    $s = bot_simple_shop_settings();
    return array_key_exists($key, $s) ? $s[$key] : $default;
}
function bot_simple_shop_save_setting($key, $value){
    $s = bot_simple_shop_settings();
    $s[$key] = $value;
    return bot_simple_shop_put_json('lib/kodam/shop_payment_settings.json', $s);
}
function bot_simple_shop_toggle_setting($key){
    $s = bot_simple_shop_settings();
    $s[$key] = empty($s[$key]);
    bot_simple_shop_put_json('lib/kodam/shop_payment_settings.json', $s);
    return (bool)$s[$key];
}
function bot_simple_shop_method_enabled($method){
    $s = bot_simple_shop_settings();
    if($method === 'card') return !empty($s['card_enabled']);
    if($method === 'zibal') return !empty($s['zibal_enabled']) && trim((string)$s['zibal_merchant_id']) !== '';
    if($method === 'support_buy') return !empty($s['support_buy_enabled']) && bot_simple_shop_support_url() !== '';
    return false;
}
function bot_simple_shop_slot($i){
    $i = max(1, min(6, (int)$i));
    $label = trim(bot_simple_shop_read("lib/Button/aytem{$i}.txt", ''));
    $coins = bot_simple_clean_int(bot_simple_shop_read("lib/Button/coinshop{$i}.txt", '0'));
    $amount = bot_simple_clean_int(bot_simple_shop_read("lib/Button/amount{$i}.txt", '0'));
    return ['index'=>$i, 'label'=>$label, 'coins'=>$coins, 'amount'=>$amount, 'active'=>(!bot_simple_placeholder($label) && $coins>0 && $amount>0)];
}
function bot_simple_shop_packages(){
    $items = [];
    for($i=1; $i<=6; $i++){ $p = bot_simple_shop_slot($i); if(!empty($p['active'])) $items[] = $p; }
    return $items;
}
function bot_simple_shop_find_package($index){
    $p = bot_simple_shop_slot((int)$index);
    return !empty($p['active']) ? $p : null;
}
function bot_simple_shop_save_package_field($index, $field, $value){
    $index = (int)$index;
    if($index < 1 || $index > 6) return false;
    if($field === 'label'){
        $v = trim((string)$value);
        if(bot_simple_placeholder($v)) return false;
        return bot_simple_shop_write("lib/Button/aytem{$index}.txt", $v);
    }
    if($field === 'coins'){
        $n = bot_simple_clean_int($value); if($n <= 0) return false;
        return bot_simple_shop_write("lib/Button/coinshop{$index}.txt", (string)$n);
    }
    if($field === 'amount'){
        $n = bot_simple_clean_int($value); if($n <= 0) return false;
        return bot_simple_shop_write("lib/Button/amount{$index}.txt", (string)$n);
    }
    return false;
}
function bot_simple_shop_clear_package($index){
    $index = (int)$index; if($index < 1 || $index > 6) return false;
    bot_simple_shop_write("lib/Button/aytem{$index}.txt", '');
    bot_simple_shop_write("lib/Button/coinshop{$index}.txt", '0');
    bot_simple_shop_write("lib/Button/amount{$index}.txt", '0');
    return true;
}
function bot_simple_shop_card_settings(){
    $cfg = bot_simple_shop_get_json('lib/kodam/card_to_card.json', []);
    return [
        'number' => trim((string)($cfg['number'] ?? '')),
        'holder' => trim((string)($cfg['holder'] ?? '')),
        'bank' => trim((string)($cfg['bank'] ?? '')),
        'note' => trim((string)($cfg['note'] ?? 'پس از واریز، عکس رسید یا کد پیگیری را ارسال کنید.')),
    ];
}
function bot_simple_shop_save_card_setting($key, $value){
    if(!in_array($key, ['number','holder','bank','note'], true)) return false;
    $cfg = bot_simple_shop_card_settings();
    $v = trim((string)$value);
    if($key === 'number') $v = preg_replace('/[^0-9]/', '', bot_simple_fa_num($v));
    if($key !== 'note' && $v === '') return false;
    $cfg[$key] = $v;
    return bot_simple_shop_put_json('lib/kodam/card_to_card.json', $cfg);
}
function bot_simple_shop_card_ready(){ $c = bot_simple_shop_card_settings(); return $c['number'] !== '' && $c['holder'] !== ''; }
function bot_simple_shop_normalize_support_contact($value){
    $v = trim((string)$value);
    $v = str_replace([' ', "\t", "\r", "\n"], '', $v);
    if($v === '') return '';
    if(preg_match('~^https?://~i', $v)) return $v;
    if($v[0] === '@') $v = substr($v, 1);
    return trim($v);
}
function bot_simple_shop_support_contact(){
    $s = bot_simple_shop_settings();
    return bot_simple_shop_normalize_support_contact($s['support_contact'] ?? '');
}
function bot_simple_shop_support_url(){
    $contact = bot_simple_shop_support_contact();
    if($contact === '') return '';
    if(preg_match('~^https?://~i', $contact)) return $contact;
    return 'https://t.me/'.ltrim($contact, '@/');
}
function bot_simple_shop_support_ready(){ return bot_simple_shop_method_enabled('support_buy'); }
function bot_simple_shop_support_admin_text(){
    $s = bot_simple_shop_settings();
    $contact = bot_simple_shop_support_contact();
    $url = bot_simple_shop_support_url();
    return "🆔 **تنظیم آیدی پشتیبانی**\n\n".
           "وضعیت خرید از پشتیبانی: **".(!empty($s['support_buy_enabled'])?'روشن ✅':'خاموش ❌')."**\n".
           "آیدی/لینک فعلی: <code>".bot_simple_html($contact ?: 'تنظیم نشده')."</code>\n".
           "لینک بازشونده: <code>".bot_simple_html($url ?: 'تنظیم نشده')."</code>\n\n".
           "برای هدایت درست کاربر، یوزرنیم تلگرام را مثل <code>@support</code> یا لینک کامل مثل <code>https://t.me/support</code> ارسال کن.";
}
function bot_simple_shop_support_admin_keyboard(){
    $s = bot_simple_shop_settings();
    return json_encode(['inline_keyboard'=>[
        [[ 'text'=>'🆔 ثبت/تغییر آیدی پشتیبانی', 'callback_data'=>'simpsupport_contact' ]],
        [[ 'text'=>(!empty($s['support_buy_enabled'])?'✅ خاموش کردن خرید از پشتیبانی':'❌ روشن کردن خرید از پشتیبانی'), 'callback_data'=>'simpsupport_toggle' ]],
        [[ 'text'=>'🔙 بازگشت به فروشگاه', 'callback_data'=>'simpadmin_shop' ]],
    ]], JSON_UNESCAPED_UNICODE);
}
function bot_simple_shop_support_user_text(){
    $contact = bot_simple_shop_support_contact();
    return "🧑‍💻 **خرید از پشتیبانی**\n\nبرای خرید مستقیم یا هماهنگی دستی، روی دکمه زیر بزنید و به پشتیبانی پیام بدهید.\n\nآیدی پشتیبانی: <code>".bot_simple_html($contact ?: 'تنظیم نشده')."</code>";
}
function bot_simple_shop_support_user_keyboard(){
    $url = bot_simple_shop_support_url();
    $rows = [];
    if($url !== '') $rows[] = [[ 'text'=>'💬 رفتن به پیوی پشتیبانی', 'url'=>$url ]];
    $rows[] = [[ 'text'=>'🔙 برگشت به فروشگاه', 'callback_data'=>'simpay_back' ]];
    return json_encode(['inline_keyboard'=>$rows], JSON_UNESCAPED_UNICODE);
}
function bot_simple_shop_admin_text(){
    global $money;
    $card = bot_simple_shop_card_settings(); $items = bot_simple_shop_packages(); $s = bot_simple_shop_settings();
    $cardSt = !empty($s['card_enabled']) ? 'روشن ✅' : 'خاموش ❌';
    $zpSt = !empty($s['zibal_enabled']) ? 'روشن ✅' : 'خاموش ❌';
    $supportSt = !empty($s['support_buy_enabled']) ? 'روشن ✅' : 'خاموش ❌';
    $supportContact = bot_simple_shop_support_contact();
    $receiptChannel = bot_manual_receipt_channel_settings();
    $receiptChannelStatus = (($receiptChannel['enabled'] ?? '') === '✅فعال' && trim((string)($receiptChannel['channel_id'] ?? '')) !== '') ? 'فعال ✅' : 'غیرفعال ❌';
    return "🛍 **مدیریت فروشگاه {$money}**\n\n".
           "📦 بسته‌های فعال: **".count($items)."**\n".
           "🏦 کارت‌به‌کارت: **{$cardSt}**\n".
           "💳 زیبال: **{$zpSt}**\n".
           "🧑‍💻 خرید از پشتیبانی: **{$supportSt}**\n".
           "📣 کانال رسیدها: **{$receiptChannelStatus}**\n\n".
           "💳 شماره کارت: <code>".bot_simple_html($card['number'] ?: 'تنظیم نشده')."</code>\n".
           "👤 گیرنده: **".bot_simple_html($card['holder'] ?: 'تنظیم نشده')."**\n".
           "🏛 بانک: **".bot_simple_html($card['bank'] ?: 'تنظیم نشده')."**\n\n".
           "🔐 مرچنت زیبال: <code>".bot_simple_html($s['zibal_merchant_id'] ? 'ثبت شده' : 'تنظیم نشده')."</code>\n".
           "🆔 آیدی پشتیبانی: <code>".bot_simple_html($supportContact ?: 'تنظیم نشده')."</code>\n".
           "📌 کانال رسید: <code>".bot_simple_html($receiptChannel['channel_id'] ?: 'تنظیم نشده')."</code>";
}
function bot_simple_shop_admin_keyboard(){
    return json_encode(['inline_keyboard'=>[
        [[ 'text'=>'📦 مدیریت بسته‌ها و قیمت‌ها', 'callback_data'=>'simpadmin_packages' ]],
        [[ 'text'=>'🔌 روشن/خاموش روش‌های پرداخت', 'callback_data'=>'simpadmin_methods' ]],
        [[ 'text'=>'🏦 تنظیم کارت‌به‌کارت', 'callback_data'=>'simpadmin_card' ]],
        [[ 'text'=>'💳 تنظیم مرچنت زیبال', 'callback_data'=>'simpadmin_zibal' ]],
        [[ 'text'=>'🆔 تنظیم آیدی پشتیبانی', 'callback_data'=>'simpadmin_support' ]],
        [[ 'text'=>'🧾 رسیدهای در انتظار تأیید', 'callback_data'=>'simpadmin_receipts' ]],
        [[ 'text'=>'📄 گزارش PDF پرداخت‌ها', 'callback_data'=>'simpadmin_payments_pdf' ]],
        [[ 'text'=>'📒 حسابداری و دفتر کل', 'callback_data'=>'simpadmin_accounting' ]],
        [[ 'text'=>'🔥 مدیریت فروش ری‌اکشن', 'callback_data'=>'reaction_admin' ]],
        [[ 'text'=>'🤝 تنظیم اسپانسر جوین اجباری', 'callback_data'=>'sponsor_admin' ]],
        [[ 'text'=>'📣 کانال بررسی رسیدها', 'callback_data'=>'simpadmin_receipt_channel' ]],
        [[ 'text'=>'🔙 بازگشت به منوی ادمین', 'callback_data'=>'admin_main_menu' ]],
    ]], JSON_UNESCAPED_UNICODE);
}
function bot_simple_shop_methods_text(){
    $s = bot_simple_shop_settings();
    return "🔌 **روش‌های پرداخت فروشگاه**\n\n".
           "از این بخش می‌توانی هر روش پرداخت را جداگانه خاموش یا روشن کنی. فقط روش‌های روشن و کامل‌تنظیم‌شده به کاربر نمایش داده می‌شوند.\n\n".
           "🏦 کارت‌به‌کارت: **".(!empty($s['card_enabled'])?'روشن ✅':'خاموش ❌')."**\n".
           "💳 زیبال: **".(!empty($s['zibal_enabled'])?'روشن ✅':'خاموش ❌')."**\n".
           "🧑‍💻 خرید از پشتیبانی: **".(!empty($s['support_buy_enabled'])?'روشن ✅':'خاموش ❌')."**";
}
function bot_simple_shop_methods_keyboard(){
    $s = bot_simple_shop_settings();
    return json_encode(['inline_keyboard'=>[
        [[ 'text'=>(!empty($s['card_enabled'])?'✅':'❌').' کارت‌به‌کارت', 'callback_data'=>'simp_toggle_card' ]],
        [[ 'text'=>(!empty($s['zibal_enabled'])?'✅':'❌').' زیبال', 'callback_data'=>'simp_toggle_zibal' ]],
        [[ 'text'=>(!empty($s['support_buy_enabled'])?'✅':'❌').' خرید از پشتیبانی', 'callback_data'=>'simp_toggle_support_buy' ]],
        [[ 'text'=>'🔙 بازگشت به فروشگاه', 'callback_data'=>'simpadmin_shop' ]],
    ]], JSON_UNESCAPED_UNICODE);
}
function bot_simple_shop_zibal_admin_text(){
    $s = bot_simple_shop_settings();
    return "💳 **تنظیم زیبال**\n\n".
           "مرچنت فعلی: <code>".bot_simple_html($s['zibal_merchant_id'] ?: 'تنظیم نشده')."</code>\n".
           "وضعیت: **".(!empty($s['zibal_enabled'])?'روشن ✅':'خاموش ❌')."**\n\n".
           "مرچنت آیدی زیبال را از پنل زیبال کپی و اینجا ثبت کن.";
}
function bot_simple_shop_zibal_admin_keyboard(){
    return json_encode(['inline_keyboard'=>[
        [[ 'text'=>'🔐 ثبت/تغییر مرچنت آیدی', 'callback_data'=>'simpzibal_merchant' ]],
        [[ 'text'=>'🔌 روشن/خاموش زیبال', 'callback_data'=>'simp_toggle_zibal' ]],
        [[ 'text'=>'🔙 بازگشت به فروشگاه', 'callback_data'=>'simpadmin_shop' ]],
    ]], JSON_UNESCAPED_UNICODE);
}
function bot_simple_shop_packages_admin_text(){
    global $money; $txt = "📦 **مدیریت بسته‌های فروشگاه**\n\n";
    for($i=1; $i<=6; $i++){
        $p = bot_simple_shop_slot($i);
        if($p['active']) $txt .= "✅ **بسته {$i}**: ".bot_simple_html($p['label'])."\n   💎 ".number_format($p['coins'])." {$money} | 💳 ".bot_simple_format_money($p['amount'])."\n\n";
        else $txt .= "➕ **بسته {$i}**: تنظیم نشده یا ناقص\n\n";
    }
    return $txt."فقط بسته‌های کامل به کاربران نمایش داده می‌شوند.";
}
function bot_simple_shop_packages_admin_keyboard(){
    $rows = [];
    for($i=1; $i<=6; $i++){
        $p = bot_simple_shop_slot($i);
        $rows[] = [[ 'text'=>($p['active'] ? "✅ بسته {$i}: ".mb_substr($p['label'],0,22,'UTF-8') : "➕ بسته {$i}: تنظیم نشده"), 'callback_data'=>'noop' ]];
        $rows[] = [[ 'text'=>'✏️ نام', 'callback_data'=>"simpkg_{$i}_label" ],[ 'text'=>'💳 قیمت', 'callback_data'=>"simpkg_{$i}_amount" ],[ 'text'=>'💎 الماس', 'callback_data'=>"simpkg_{$i}_coins" ]];
        $rows[] = [[ 'text'=>'🗑 حذف بسته '.$i, 'callback_data'=>"simpkg_{$i}_delete" ]];
    }
    $rows[] = [[ 'text'=>'🔙 بازگشت به فروشگاه', 'callback_data'=>'simpadmin_shop' ]];
    return json_encode(['inline_keyboard'=>$rows], JSON_UNESCAPED_UNICODE);
}
function bot_simple_shop_card_admin_text(){
    $c = bot_simple_shop_card_settings();
    return "🏦 **تنظیم کارت‌به‌کارت**\n\n".
           "💳 شماره کارت: <code>".bot_simple_html($c['number'] ?: 'تنظیم نشده')."</code>\n".
           "👤 نام گیرنده: **".bot_simple_html($c['holder'] ?: 'تنظیم نشده')."**\n".
           "🏛 بانک: **".bot_simple_html($c['bank'] ?: 'تنظیم نشده')."**\n".
           "📝 راهنمای رسید: ".bot_simple_html($c['note']);
}
function bot_simple_shop_card_admin_keyboard(){
    return json_encode(['inline_keyboard'=>[
        [[ 'text'=>'💳 تنظیم شماره کارت', 'callback_data'=>'simpcard_number' ]],
        [[ 'text'=>'👤 تنظیم نام گیرنده', 'callback_data'=>'simpcard_holder' ]],
        [[ 'text'=>'🏛 تنظیم نام بانک', 'callback_data'=>'simpcard_bank' ]],
        [[ 'text'=>'📝 تنظیم متن راهنمای رسید', 'callback_data'=>'simpcard_note' ]],
        [[ 'text'=>'🔌 روشن/خاموش کارت‌به‌کارت', 'callback_data'=>'simp_toggle_card' ]],
        [[ 'text'=>'🔙 بازگشت به فروشگاه', 'callback_data'=>'simpadmin_shop' ]],
    ]], JSON_UNESCAPED_UNICODE);
}

function bot_manual_receipt_channel_defaults(){
    return [
        'enabled'=>'❌غیر فعال',
        'channel_id'=>'',
        'admin_notify_enabled'=>'✅فعال',
        'updated_at'=>time(),
    ];
}
function bot_manual_receipt_channel_file(){ return 'lib/kodam/manual_receipt_channel.json'; }
function bot_manual_receipt_channel_settings(){
    $def = bot_manual_receipt_channel_defaults();
    $data = function_exists('bot_data_get_json') ? bot_data_get_json(bot_manual_receipt_channel_file(), $def) : [];
    if(!is_array($data)) $data = [];
    $data = array_merge($def, $data);
    $data['enabled'] = ((string)($data['enabled'] ?? '') === '✅فعال') ? '✅فعال' : '❌غیر فعال';
    $data['admin_notify_enabled'] = ((string)($data['admin_notify_enabled'] ?? '') === '❌غیر فعال') ? '❌غیر فعال' : '✅فعال';
    $data['channel_id'] = trim((string)($data['channel_id'] ?? ''));
    return $data;
}
function bot_manual_receipt_channel_save(array $data){
    $cur = bot_manual_receipt_channel_settings();
    $out = array_merge($cur, $data);
    $out['enabled'] = ((string)($out['enabled'] ?? '') === '✅فعال') ? '✅فعال' : '❌غیر فعال';
    $out['admin_notify_enabled'] = ((string)($out['admin_notify_enabled'] ?? '') === '❌غیر فعال') ? '❌غیر فعال' : '✅فعال';
    $out['channel_id'] = trim((string)($out['channel_id'] ?? ''));
    $out['updated_at'] = time();
    if(function_exists('bot_data_put_json')) return bot_data_put_json(bot_manual_receipt_channel_file(), $out);
    $dir = dirname(bot_manual_receipt_channel_file()); if($dir && !is_dir($dir)) @mkdir($dir, 0775, true);
    return @file_put_contents(bot_manual_receipt_channel_file(), json_encode($out, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT), LOCK_EX) !== false;
}
function bot_manual_receipt_channel_enabled(){
    $s = bot_manual_receipt_channel_settings();
    return (($s['enabled'] ?? '') === '✅فعال') && trim((string)($s['channel_id'] ?? '')) !== '';
}
function bot_manual_receipt_channel_admin_text(){
    $s = bot_manual_receipt_channel_settings();
    return "📣 <b>کانال بررسی رسیدها</b>\n\n".
        "وضعیت ارسال به کانال: <b>".(($s['enabled'] ?? '') === '✅فعال' ? 'فعال ✅' : 'غیرفعال ❌')."</b>\n".
        "کانال فعلی: <code>".bot_simple_html($s['channel_id'] ?: 'تنظیم نشده')."</code>\n".
        "ارسال همزمان به ادمین‌ها: <b>".(($s['admin_notify_enabled'] ?? '') === '✅فعال' ? 'فعال ✅' : 'غیرفعال ❌')."</b>\n\n".
        "ربات باید داخل کانال تعیین‌شده ادمین باشد تا بتواند رسید را ارسال کند و بعد از تأیید/رد، همان پیام را آپدیت کند. مقدار مجاز: <code>@channel</code> یا آیدی عددی مثل <code>-1001234567890</code>.";
}
function bot_manual_receipt_channel_admin_keyboard(){
    $s = bot_manual_receipt_channel_settings();
    return json_encode(['inline_keyboard'=>[
        [[ 'text'=>'📌 ثبت/تغییر کانال رسیدها', 'callback_data'=>'simpreceipt_channel_set' ]],
        [[ 'text'=>(($s['enabled'] ?? '') === '✅فعال' ? '✅ خاموش کردن ارسال به کانال' : '❌ روشن کردن ارسال به کانال'), 'callback_data'=>'simpreceipt_channel_toggle' ]],
        [[ 'text'=>(($s['admin_notify_enabled'] ?? '') === '✅فعال' ? '✅ خاموش کردن ارسال همزمان به ادمین‌ها' : '❌ روشن کردن ارسال همزمان به ادمین‌ها'), 'callback_data'=>'simpreceipt_admin_notify_toggle' ]],
        [[ 'text'=>'🔙 بازگشت به فروشگاه', 'callback_data'=>'simpadmin_shop' ]],
    ]], JSON_UNESCAPED_UNICODE);
}
function bot_manual_receipt_status_text($status, $adminId=''){
    $status = (string)$status;
    $by = trim((string)$adminId);
    if($status === 'approved') return '✅ تأیید شده'.($by !== '' ? ' توسط ادمین '.$by : '');
    if($status === 'rejected') return '❌ رد شده'.($by !== '' ? ' توسط ادمین '.$by : '');
    return '⏳ در انتظار بررسی';
}
function bot_manual_receipt_final_keyboard($status, $adminId=''){
    return json_encode(['inline_keyboard'=>[[[ 'text'=>bot_manual_receipt_status_text($status, $adminId), 'callback_data'=>'noop' ]]]], JSON_UNESCAPED_UNICODE);
}
function bot_manual_receipt_review_keyboard($receiptId, $userId=null){
    return json_encode(['inline_keyboard'=>[
        [[ 'text'=>'✅ تأیید و شارژ','callback_data'=>'manualpay_approve_'.$receiptId ],[ 'text'=>'❌ رد رسید','callback_data'=>'manualpay_reject_'.$receiptId ]],
    ]], JSON_UNESCAPED_UNICODE);
}
function bot_manual_receipt_build_review_text($receiptId, $packageLabel, $rewardAmount, $amount, $userId, $fromName='', $receiptType='text', $receiptValue='', $status='pending', $adminId=''){
    $txt = "🧾 <b>رسید کارت‌به‌کارت جدید</b>\n\n".
        "🆔 شناسه رسید: <code>{$receiptId}</code>\n".
        "👤 کاربر: <code>{$userId}</code>".
        ($fromName !== '' ? "\nنام: <b>".bot_simple_html($fromName)."</b>" : '')."\n".
        "📦 بسته: <b>".bot_simple_html($packageLabel)."</b>\n".
        "💎 شارژ: <b>".number_format((int)$rewardAmount)."</b>\n".
        "💳 مبلغ: <b>".bot_simple_format_money($amount)."</b>\n".
        "📌 وضعیت: <b>".bot_simple_html(bot_manual_receipt_status_text($status, $adminId))."</b>";
    if((string)$receiptType === 'text' && trim((string)$receiptValue) !== ''){
        $txt .= "\n\n📎 متن/کد پیگیری:\n<code>".bot_simple_html($receiptValue)."</code>";
    }
    return $txt;
}
function bot_manual_receipt_build_review_text_from_record($receiptId, array $rec, $status=null, $adminId=''){
    $data = bot_manual_receipt_data($rec);
    $fromName = (string)($data['first_name'] ?? '');
    $st = $status === null ? (string)($rec['status'] ?? 'pending') : (string)$status;
    return bot_manual_receipt_build_review_text(
        $receiptId,
        (string)($rec['package_label'] ?? ''),
        (int)($rec['reward_amount'] ?? 0),
        (int)($rec['amount'] ?? 0),
        (string)($rec['user_id'] ?? ''),
        $fromName,
        (string)($rec['receipt_type'] ?? 'text'),
        (string)($rec['receipt_value'] ?? ''),
        $st,
        $adminId
    );
}
function bot_manual_receipt_notify_channel($receiptId,array $package,$userId,$receiptType,$receiptValue,$fromName='', array $origin=[]){
    $s = bot_manual_receipt_channel_settings();
    if(($s['enabled'] ?? '') !== '✅فعال') return ['ok'=>false,'skipped'=>'disabled'];
    $target = trim((string)($s['channel_id'] ?? ''));
    if($target === '') return ['ok'=>false,'skipped'=>'empty_channel'];
    $text = bot_manual_receipt_build_review_text($receiptId, (string)($package['label'] ?? ''), (int)($package['coins'] ?? 0), (int)($package['amount'] ?? 0), $userId, $fromName, $receiptType, $receiptValue, 'pending');
    $kb = bot_manual_receipt_review_keyboard($receiptId, $userId);
    $res = null;
    if($receiptType === 'photo'){
        $res = bot('sendPhoto', ['chat_id'=>$target, 'photo'=>$receiptValue, 'caption'=>$text, 'parse_mode'=>'HTML', 'reply_markup'=>$kb]);
    }elseif($receiptType === 'document'){
        $res = bot('sendDocument', ['chat_id'=>$target, 'document'=>$receiptValue, 'caption'=>$text, 'parse_mode'=>'HTML', 'reply_markup'=>$kb]);
    }else{
        $res = bot('sendMessage', ['chat_id'=>$target, 'text'=>$text, 'parse_mode'=>'HTML', 'reply_markup'=>$kb]);
    }
    $ok = is_object($res) && !empty($res->ok);
    $mid = ($ok && isset($res->result->message_id)) ? (int)$res->result->message_id : 0;
    bot_manual_receipt_update_data($receiptId, [
        'receipt_channel_enabled'=>1,
        'receipt_channel_chat_id'=>$target,
        'receipt_channel_message_id'=>$mid,
        'receipt_channel_kind'=>(string)$receiptType,
        'receipt_channel_sent_at'=>time(),
        'receipt_channel_status'=>$ok ? 'sent' : 'failed',
        'receipt_channel_error'=>$ok ? '' : (isset($res->description) ? (string)$res->description : 'send_failed'),
    ]);
    return ['ok'=>$ok,'message_id'=>$mid,'chat_id'=>$target,'raw'=>$res];
}
function bot_manual_receipt_edit_message_status($chatId, $messageId, $receiptId, array $rec, $status, $adminId='', $kind='text'){
    if(trim((string)$chatId) === '' || (int)$messageId <= 0) return false;
    $text = bot_manual_receipt_build_review_text_from_record($receiptId, $rec, $status, $adminId);
    $markup = bot_manual_receipt_final_keyboard($status, $adminId);
    $kind = (string)$kind;
    if(in_array($kind, ['photo','document','video','animation','voice','audio'], true)){
        $res = bot('editMessageCaption', ['chat_id'=>$chatId, 'message_id'=>(int)$messageId, 'caption'=>$text, 'parse_mode'=>'HTML', 'reply_markup'=>$markup]);
        if(is_object($res) && !empty($res->ok)) return true;
    }
    $res = bot('editMessageText', ['chat_id'=>$chatId, 'message_id'=>(int)$messageId, 'text'=>$text, 'parse_mode'=>'HTML', 'reply_markup'=>$markup]);
    if(is_object($res) && !empty($res->ok)) return true;
    $res2 = bot('editMessageReplyMarkup', ['chat_id'=>$chatId, 'message_id'=>(int)$messageId, 'reply_markup'=>$markup]);
    return is_object($res2) && !empty($res2->ok);
}
function bot_manual_receipt_update_review_messages($receiptId, $status, $adminId='', $currentChatId=null, $currentMessageId=null){
    $rec = bot_manual_receipt_get($receiptId);
    if(!$rec) return [];
    $data = bot_manual_receipt_data($rec);
    $done = [];
    if($currentChatId !== null && $currentMessageId !== null){
        $done['current'] = bot_manual_receipt_edit_message_status($currentChatId, $currentMessageId, $receiptId, $rec, $status, $adminId, (string)($rec['receipt_type'] ?? 'text'));
    }
    if(!empty($data['receipt_channel_chat_id']) && !empty($data['receipt_channel_message_id'])){
        $done['channel'] = bot_manual_receipt_edit_message_status($data['receipt_channel_chat_id'], (int)$data['receipt_channel_message_id'], $receiptId, $rec, $status, $adminId, (string)($data['receipt_channel_kind'] ?? $rec['receipt_type'] ?? 'text'));
    }
    if(!empty($data['admin_message_ids']) && is_array($data['admin_message_ids'])){
        foreach($data['admin_message_ids'] as $aid=>$mid){
            $key = 'admin_'.$aid;
            if($currentChatId !== null && (string)$aid === (string)$currentChatId && (int)$mid === (int)$currentMessageId) continue;
            $res = bot('editMessageReplyMarkup', ['chat_id'=>(string)$aid, 'message_id'=>(int)$mid, 'reply_markup'=>bot_manual_receipt_final_keyboard($status, $adminId)]);
            $done[$key] = is_object($res) && !empty($res->ok);
        }
    }elseif(!empty($data['admin_message_id'])){
        $ids = function_exists('bot_configured_admin_notify_ids') ? bot_configured_admin_notify_ids([]) : [];
        foreach($ids as $aid){
            $res = bot('editMessageReplyMarkup', ['chat_id'=>(string)$aid, 'message_id'=>(int)$data['admin_message_id'], 'reply_markup'=>bot_manual_receipt_final_keyboard($status, $adminId)]);
            $done['admin_'.$aid] = is_object($res) && !empty($res->ok);
        }
    }
    bot_manual_receipt_update_data($receiptId, ['review_messages_updated_at'=>time(), 'review_messages_update_status'=>$done]);
    return $done;
}
function bot_manual_receipt_handle_admin_action($callbackId, $chatId, $messageId, $adminId, $action, $receiptId){
    $rid = (string)$receiptId;
    $rec = bot_manual_receipt_get($rid);
    if(!$rec || (string)($rec['status'] ?? '') !== 'pending'){
        if($callbackId) bot('answercallbackquery', ['callback_query_id'=>$callbackId, 'text'=>'رسید پیدا نشد یا قبلاً بررسی شده.', 'show_alert'=>true]);
        if($rec){ bot_manual_receipt_update_review_messages($rid, (string)($rec['status'] ?? 'pending'), (string)($rec['admin_id'] ?? ''), $chatId, $messageId); }
        return ['ok'=>false,'error'=>'not_pending'];
    }
    if($action === 'reject'){
        $ok = bot_manual_receipt_update_status($rid, 'rejected', $adminId, ['reason'=>'admin_reject','reviewed_at'=>time()]);
        if(!$ok){ if($callbackId) bot('answercallbackquery', ['callback_query_id'=>$callbackId, 'text'=>'رسید قبلاً بررسی شده است.', 'show_alert'=>true]); return ['ok'=>false,'error'=>'update_failed']; }
        if($callbackId) bot('answercallbackquery', ['callback_query_id'=>$callbackId, 'text'=>'رسید رد شد.', 'show_alert'=>false]);
        bot('sendMessage', ['chat_id'=>$rec['user_id'], 'text'=>"❌ رسید کارت‌به‌کارت شما رد شد.\nشناسه رسید: {$rid}"]);
        bot_manual_receipt_update_review_messages($rid, 'rejected', $adminId, $chatId, $messageId);
        return ['ok'=>true,'status'=>'rejected'];
    }
    $ok = bot_manual_receipt_update_status($rid, 'approved', $adminId, ['approved_at'=>time(),'reviewed_at'=>time()]);
    if(!$ok){ if($callbackId) bot('answercallbackquery', ['callback_query_id'=>$callbackId, 'text'=>'رسید قبلاً بررسی شده است.', 'show_alert'=>true]); return ['ok'=>false,'error'=>'update_failed']; }
    $add = bot_simple_add_points_to_user($rec['user_id'], (int)$rec['reward_amount'], 'manual_card_shop', ['receipt_id'=>$rid]);
    $after = is_array($add) && isset($add['after']) ? (int)$add['after'] : 0;
    if(function_exists('bot_payment_event_log_append')){
        bot_payment_event_log_append([
            'source'=>'card',
            'id'=>'manual_'.$rid,
            'receipt_id'=>$rid,
            'user_id'=>(string)($rec['user_id'] ?? ''),
            'amount'=>(int)($rec['amount'] ?? 0),
            'reward_amount'=>(int)($rec['reward_amount'] ?? 0),
            'package_label'=>(string)($rec['package_label'] ?? ''),
            'receipt_type'=>(string)($rec['receipt_type'] ?? ''),
            'receipt_value'=>(string)($rec['receipt_value'] ?? ''),
            'admin_id'=>(string)$adminId,
            'status'=>'approved',
            'created_at'=>$rec['created_at'] ?? time(),
            'approved_at'=>time(),
            'paid_at'=>time(),
            'balance_after'=>$after,
            'raw_receipt'=>$rec,
        ]);
    }
    if($callbackId) bot('answercallbackquery', ['callback_query_id'=>$callbackId, 'text'=>'تأیید شد و حساب شارژ شد.', 'show_alert'=>false]);
    bot('sendMessage', ['chat_id'=>$rec['user_id'], 'text'=>"✅ رسید شما تأیید شد.\n💎 مقدار شارژ: ".number_format((int)$rec['reward_amount'])."\n💰 موجودی فعلی: ".number_format($after)]);
    bot_manual_receipt_update_review_messages($rid, 'approved', $adminId, $chatId, $messageId);
    return ['ok'=>true,'status'=>'approved','after'=>$after];
}
function bot_simple_shop_user_text(){
    global $money;
    $txt = "🛍 **فروشگاه {$money}**\n\nبسته موردنظر را انتخاب کنید.\n\n";
    if(!bot_simple_shop_packages()) $txt .= "❌ فعلاً بسته‌ای توسط مدیریت تنظیم نشده است.";
    return $txt;
}
function bot_simple_shop_user_keyboard(){
    global $money; $rows = [];
    foreach(bot_simple_shop_packages() as $p){ $rows[] = [[ 'text'=>'💎 '.number_format($p['coins'])." {$money} | ".bot_simple_format_money($p['amount']), 'callback_data'=>'simpay_pkg_'.$p['index'] ]]; }
    if(bot_simple_shop_support_ready()) $rows[] = [[ 'text'=>'🧑‍💻 خرید از پشتیبانی', 'callback_data'=>'simpay_support' ]];
    $rows[] = [[ 'text'=>'📋 راهنمای خرید', 'callback_data'=>'simpay_help' ]];
    return json_encode(['inline_keyboard'=>$rows], JSON_UNESCAPED_UNICODE);
}
function bot_simple_shop_package_text(array $p){
    global $money;
    return "🧾 **فاکتور خرید**\n\n📦 بسته: **".bot_simple_html($p['label'])."**\n💎 مقدار: **".number_format($p['coins'])." {$money}**\n💳 مبلغ: **".bot_simple_format_money($p['amount'])."**\n\nروش پرداخت را انتخاب کنید:";
}
function bot_simple_shop_payment_keyboard(array $p){
    $rows = [];
    if(bot_simple_shop_method_enabled('card')) $rows[] = [[ 'text'=>'🏦 کارت‌به‌کارت', 'callback_data'=>'simpay_card_'.$p['index'] ]];
    if(bot_simple_shop_method_enabled('zibal') && function_exists('bot_zibal_request_payment')) $rows[] = [[ 'text'=>'💳 پرداخت آنلاین زیبال', 'callback_data'=>'simpay_zibal_'.$p['index'] ]];
    if(!$rows) $rows[] = [[ 'text'=>'❌ هیچ روش پرداختی فعال نیست', 'callback_data'=>'noop' ]];
    $rows[] = [[ 'text'=>'🔙 برگشت به فروشگاه', 'callback_data'=>'simpay_back' ]];
    return json_encode(['inline_keyboard'=>$rows], JSON_UNESCAPED_UNICODE);
}
function bot_simple_shop_card_text(array $p){
    global $money; $c = bot_simple_shop_card_settings();
    return "🏦 **پرداخت کارت‌به‌کارت**\n\n📦 بسته: **".bot_simple_html($p['label'])."**\n💎 مقدار: **".number_format($p['coins'])." {$money}**\n💳 مبلغ: **".bot_simple_format_money($p['amount'])."**\n\n💳 شماره کارت:\n<code>".bot_simple_html($c['number'] ?: 'تنظیم نشده')."</code>\n👤 نام گیرنده: **".bot_simple_html($c['holder'] ?: 'تنظیم نشده')."**\n🏛 بانک: **".bot_simple_html($c['bank'] ?: 'تنظیم نشده')."**\n\n📎 ".bot_simple_html($c['note'] ?: 'بعد از واریز، رسید را ارسال کنید.');
}
function bot_simple_shop_card_keyboard(array $p){
    return json_encode(['inline_keyboard'=>[[[ 'text'=>'📤 ارسال رسید پرداخت', 'callback_data'=>'simpay_receipt_'.$p['index'] ]],[[ 'text'=>'🔙 برگشت', 'callback_data'=>'simpay_pkg_'.$p['index'] ]]]], JSON_UNESCAPED_UNICODE);
}
function bot_simple_shop_pay_url_keyboard($url, $backCallback='simpay_back'){
    return json_encode(['inline_keyboard'=>[[[ 'text'=>'💳 پرداخت آنلاین', 'url'=>$url ]],[[ 'text'=>'🔙 برگشت', 'callback_data'=>$backCallback ]]]], JSON_UNESCAPED_UNICODE);
}
function bot_manual_receipt_install_schema(){
    if(function_exists('bot_sql_pdo') && ($pdo = bot_sql_pdo())){
        $pdo->exec("CREATE TABLE IF NOT EXISTS bot_manual_receipts (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,user_id VARCHAR(32) NOT NULL,package_index INT NOT NULL DEFAULT 0,package_label VARCHAR(191) NULL,amount INT NOT NULL DEFAULT 0,reward_amount INT NOT NULL DEFAULT 0,receipt_type VARCHAR(20) NOT NULL DEFAULT 'text',receipt_value TEXT NULL,status VARCHAR(30) NOT NULL DEFAULT 'pending',admin_id VARCHAR(32) NULL,data_json LONGTEXT NULL,created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,KEY idx_status (status), KEY idx_user (user_id), KEY idx_created (created_at)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci");
    }
    if(!is_dir('cache')) @mkdir('cache',0755,true); return true;
}
function bot_manual_receipt_data($rec){
    if(!is_array($rec)) return [];
    $raw = $rec['data_json'] ?? [];
    if(is_array($raw)) return $raw;
    if(is_string($raw) && trim($raw) !== ''){
        $j = json_decode($raw, true);
        return is_array($j) ? $j : [];
    }
    return [];
}
function bot_manual_receipt_create($userId, array $package, $receiptType, $receiptValue, array $extra=[]){
    bot_manual_receipt_install_schema();
    if(function_exists('bot_sql_pdo') && ($pdo = bot_sql_pdo())){
        $st=$pdo->prepare('INSERT INTO bot_manual_receipts (user_id,package_index,package_label,amount,reward_amount,receipt_type,receipt_value,status,data_json) VALUES (?,?,?,?,?,?,?,?,?)');
        $st->execute([(string)$userId,(int)$package['index'],(string)$package['label'],(int)$package['amount'],(int)$package['coins'],(string)$receiptType,(string)$receiptValue,'pending',json_encode($extra,JSON_UNESCAPED_UNICODE)]);
        return (int)$pdo->lastInsertId();
    }
    $file='cache/manual_receipts.json';
    $all=is_file($file)?json_decode((string)file_get_contents($file),true):[];
    if(!is_array($all))$all=[];
    $id=time().rand(100,999);
    $all[(string)$id]=['id'=>$id,'user_id'=>(string)$userId,'package_index'=>(int)$package['index'],'package_label'=>(string)$package['label'],'amount'=>(int)$package['amount'],'reward_amount'=>(int)$package['coins'],'receipt_type'=>(string)$receiptType,'receipt_value'=>(string)$receiptValue,'status'=>'pending','data_json'=>$extra,'created_at'=>date('Y-m-d H:i:s')];
    file_put_contents($file,json_encode($all,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT));
    return $id;
}
function bot_manual_receipt_get($id){
    bot_manual_receipt_install_schema();
    if(function_exists('bot_sql_pdo') && ($pdo = bot_sql_pdo())){ $st=$pdo->prepare('SELECT * FROM bot_manual_receipts WHERE id=? LIMIT 1'); $st->execute([(string)$id]); $r=$st->fetch(); return $r?:null; }
    $file='cache/manual_receipts.json'; $all=is_file($file)?json_decode((string)file_get_contents($file),true):[]; return is_array($all)&&isset($all[(string)$id])?$all[(string)$id]:null;
}
function bot_manual_receipt_update_status($id,$status,$adminId='',array $data=[]){
    $rec = bot_manual_receipt_get($id);
    $oldData = bot_manual_receipt_data($rec);
    $mergedData = array_merge($oldData, $data);
    if(function_exists('bot_sql_pdo') && ($pdo = bot_sql_pdo())){ $st=$pdo->prepare('UPDATE bot_manual_receipts SET status=?, admin_id=?, data_json=?, updated_at=CURRENT_TIMESTAMP WHERE id=? AND status=?'); return $st->execute([(string)$status,(string)$adminId,json_encode($mergedData,JSON_UNESCAPED_UNICODE),(string)$id,'pending']); }
    $file='cache/manual_receipts.json'; $all=is_file($file)?json_decode((string)file_get_contents($file),true):[]; if(!is_array($all)||!isset($all[(string)$id])||($all[(string)$id]['status']??'')!=='pending')return false; $all[(string)$id]['status']=(string)$status; $all[(string)$id]['admin_id']=(string)$adminId; $all[(string)$id]['data_json']=$mergedData; $all[(string)$id]['updated_at']=date('Y-m-d H:i:s'); file_put_contents($file,json_encode($all,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT)); return true;
}
function bot_manual_receipt_update_data($id, array $data){
    $rec = bot_manual_receipt_get($id);
    if(!$rec) return false;
    $mergedData = array_merge(bot_manual_receipt_data($rec), $data);
    if(function_exists('bot_sql_pdo') && ($pdo = bot_sql_pdo())){
        $st=$pdo->prepare('UPDATE bot_manual_receipts SET data_json=?, updated_at=CURRENT_TIMESTAMP WHERE id=?');
        return $st->execute([json_encode($mergedData,JSON_UNESCAPED_UNICODE),(string)$id]);
    }
    $file='cache/manual_receipts.json';
    $all=is_file($file)?json_decode((string)file_get_contents($file),true):[];
    if(!is_array($all)||!isset($all[(string)$id])) return false;
    $all[(string)$id]['data_json']=$mergedData;
    $all[(string)$id]['updated_at']=date('Y-m-d H:i:s');
    file_put_contents($file,json_encode($all,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT));
    return true;
}
function bot_manual_receipt_admin_keyboard($id, $userId=null){
    if($userId === null || $userId === ''){
        $rec = bot_manual_receipt_get($id);
        if(is_array($rec) && isset($rec['user_id'])) $userId = $rec['user_id'];
    }
    $rows = [
        [[ 'text'=>'✅ تأیید و شارژ','callback_data'=>'manualpay_approve_'.$id ],[ 'text'=>'❌ رد رسید','callback_data'=>'manualpay_reject_'.$id ]],
        [[ 'text'=>'💬 پاسخ به کاربر','callback_data'=>'manualpay_reply_'.$id ], [ 'text'=>'⚡ پاسخ آماده','callback_data'=>'manualpay_quick_menu_'.$id ]],
    ];
    $uid = trim((string)$userId);
    if($uid !== '' && preg_match('/^-?\d+$/', $uid)){
        $rows[] = [[ 'text'=>'👤 باز کردن چت کاربر','url'=>'tg://user?id='.$uid ]];
    }
    return json_encode(['inline_keyboard'=>$rows],JSON_UNESCAPED_UNICODE);
}
function bot_manual_receipt_caption($receiptId, array $package, $userId, $fromName=''){
    return "🧾 **رسید کارت‌به‌کارت جدید**\n\n".
        "🆔 شناسه رسید: <code>{$receiptId}</code>\n".
        "👤 کاربر: <code>{$userId}</code>".
        ($fromName?"\nنام: **".bot_simple_html($fromName)."**":'')."\n".
        "📦 بسته: **".bot_simple_html($package['label'])."**\n".
        "💎 شارژ: **".number_format((int)$package['coins'])."**\n".
        "💳 مبلغ: **".bot_simple_format_money($package['amount'])."**\n\n".
        "رسید بالا به‌صورت مستقیم از پیام کاربر فوروارد/کپی شده و روی هاست ذخیره نشده است.";
}
function bot_manual_receipt_notify_admin($adminId,$receiptId,array $package,$userId,$receiptType,$receiptValue,$fromName='', array $origin=[]){
    $channelResult = bot_manual_receipt_notify_channel($receiptId, $package, $userId, $receiptType, $receiptValue, $fromName, $origin);
    $receiptChannelSettings = bot_manual_receipt_channel_settings();
    if(($receiptChannelSettings['admin_notify_enabled'] ?? '✅فعال') === '❌غیر فعال'){
        bot_manual_receipt_update_data($receiptId, ['admin_notify_skipped'=>'disabled_by_receipt_channel_settings']);
        return ['channel'=>$channelResult];
    }
    $adminIds = [];
    if(function_exists('bot_configured_admin_notify_ids')){
        $adminIds = bot_configured_admin_notify_ids((array)$adminId);
    }elseif(function_exists('bot_runtime_admin_list')){
        $adminIds = bot_runtime_admin_list();
        foreach((array)$adminId as $aid) $adminIds[] = $aid;
        $adminIds = function_exists('bot_unique_numeric_ids') ? bot_unique_numeric_ids($adminIds) : array_values(array_unique(array_filter(array_map('strval', $adminIds))));
    }elseif(function_exists('bot_config_master_admin_ids')){
        $adminIds = bot_config_master_admin_ids();
        foreach((array)$adminId as $aid) $adminIds[] = $aid;
        $adminIds = function_exists('bot_unique_numeric_ids') ? bot_unique_numeric_ids($adminIds) : array_values(array_unique(array_filter(array_map('strval', $adminIds))));
    }else{
        $adminIds = array_values(array_unique(array_filter(array_map('strval', (array)$adminId))));
    }
    if(!$adminIds) return ['channel'=>$channelResult,'admins'=>[]];

    $caption = bot_manual_receipt_caption($receiptId, $package, $userId, $fromName);
    $fromChatId = $origin['from_chat_id'] ?? $origin['chat_id'] ?? $userId;
    $fromMsgId = $origin['message_id'] ?? $origin['msg_id'] ?? null;
    $messageIds = [];
    $results = [];
    $statuses = [];

    foreach($adminIds as $targetAdminId){
        $copiedOrForwarded = false;
        $mediaFallback = false;
        $errors = [];
        if(!empty($fromChatId) && !empty($fromMsgId)){
            // copyMessage معمولاً حتی وقتی فوروارد کاربر بسته باشد بهتر جواب می‌دهد.
            $cp = bot('copyMessage', ['chat_id'=>$targetAdminId, 'from_chat_id'=>$fromChatId, 'message_id'=>$fromMsgId]);
            $copiedOrForwarded = is_object($cp) && !empty($cp->ok);
            if(!$copiedOrForwarded){
                $errors[] = isset($cp->description) ? (string)$cp->description : 'copyMessage_failed';
                $fw = bot('forwardMessage', ['chat_id'=>$targetAdminId, 'from_chat_id'=>$fromChatId, 'message_id'=>$fromMsgId]);
                $copiedOrForwarded = is_object($fw) && !empty($fw->ok);
                if(!$copiedOrForwarded) $errors[] = isset($fw->description) ? (string)$fw->description : 'forwardMessage_failed';
            }
        }
        if(!$copiedOrForwarded){
            if($receiptType==='photo'){
                $mr = bot('sendPhoto',['chat_id'=>$targetAdminId,'photo'=>$receiptValue]);
                $mediaFallback = is_object($mr) && !empty($mr->ok);
                if(!$mediaFallback) $errors[] = isset($mr->description) ? (string)$mr->description : 'sendPhoto_failed';
            }elseif($receiptType==='document'){
                $mr = bot('sendDocument',['chat_id'=>$targetAdminId,'document'=>$receiptValue]);
                $mediaFallback = is_object($mr) && !empty($mr->ok);
                if(!$mediaFallback) $errors[] = isset($mr->description) ? (string)$mr->description : 'sendDocument_failed';
            }
        }
        $res = bot('sendMessage',[
            'chat_id'=>$targetAdminId,
            'text'=>$caption.(($receiptType==='text')?"\n\n📎 متن/کد پیگیری:\n<code>".bot_simple_html($receiptValue)."</code>":''),
            'parse_mode'=>'HTML',
            'reply_markup'=>bot_manual_receipt_admin_keyboard($receiptId, $userId)
        ]);
        $ok = is_object($res) && !empty($res->ok);
        if(!$ok) $errors[] = isset($res->description) ? (string)$res->description : 'sendMessage_failed';
        $mid = ($ok && isset($res->result->message_id)) ? (int)$res->result->message_id : 0;
        if($mid > 0) $messageIds[(string)$targetAdminId] = $mid;
        $statuses[(string)$targetAdminId] = [
            'ok'=>$ok,
            'message_id'=>$mid,
            'copied_or_forwarded'=>$copiedOrForwarded ? 1 : 0,
            'media_fallback'=>$mediaFallback ? 1 : 0,
            'errors'=>$errors,
        ];
        $results[(string)$targetAdminId] = $res;
    }

    $firstMessageId = 0;
    foreach($messageIds as $mid){ $firstMessageId = (int)$mid; break; }
    bot_manual_receipt_update_data($receiptId, [
        'admin_notified_at'=>time(),
        'admin_ids_notified'=>$adminIds,
        'admin_message_id'=>$firstMessageId,
        'admin_message_ids'=>$messageIds,
        'admin_notify_status'=>$statuses,
        'forwarded_to_admin'=>array_sum(array_map(function($s){ return !empty($s['copied_or_forwarded']) ? 1 : 0; }, $statuses)) > 0 ? 1 : 0,
    ]);
    return ['channel'=>$channelResult,'admins'=>$results];
}
function bot_simple_shop_pending_receipts_text(){
    $lines=["🧾 **رسیدهای در انتظار تأیید**\n"]; $count=0; bot_manual_receipt_install_schema();
    if(function_exists('bot_sql_pdo') && ($pdo=bot_sql_pdo())){ $st=$pdo->query("SELECT * FROM bot_manual_receipts WHERE status='pending' ORDER BY id DESC LIMIT 20"); foreach($st->fetchAll() as $r){$count++;$lines[]="#{$r['id']} | کاربر: <code>{$r['user_id']}</code> | ".number_format((int)$r['reward_amount'])." الماس | ".bot_simple_format_money($r['amount']);}}
    if($count===0)$lines[]='فعلاً رسید در انتظار تأیید ندارید.'; return implode("\n",$lines);
}
function bot_simple_shop_pending_receipts_keyboard(){
    $rows=[]; if(function_exists('bot_sql_pdo')&&($pdo=bot_sql_pdo())){ bot_manual_receipt_install_schema(); $st=$pdo->query("SELECT id,user_id,reward_amount,amount FROM bot_manual_receipts WHERE status='pending' ORDER BY id DESC LIMIT 20"); foreach($st->fetchAll() as $r){$rows[]=[[ 'text'=>'🧾 #'.$r['id'].' | '.$r['user_id'].' | '.number_format((int)$r['reward_amount']).' 💎','callback_data'=>'simpadmin_receipt_'.$r['id'] ]];}}
    $rows[]=[[ 'text'=>'🔙 بازگشت به فروشگاه','callback_data'=>'simpadmin_shop' ]]; return json_encode(['inline_keyboard'=>$rows],JSON_UNESCAPED_UNICODE);
}
function bot_simple_shop_receipt_detail_text($id){
    $r=bot_manual_receipt_get($id); if(!$r)return '❌ رسید پیدا نشد.';
    $data = bot_manual_receipt_data($r);
    return "🧾 **جزئیات رسید #{$id}**\n\n👤 کاربر: <code>{$r['user_id']}</code>\n📦 بسته: **".bot_simple_html($r['package_label']??'')."**\n💎 شارژ: **".number_format((int)($r['reward_amount']??0))."**\n💳 مبلغ: **".bot_simple_format_money($r['amount']??0)."**\n📌 وضعیت: **".bot_simple_html($r['status']??'')."**\n📎 نوع رسید: **".bot_simple_html($r['receipt_type']??'')."**".
        (!empty($data['forwarded_to_admin'])?"\n✅ رسید به ادمین فوروارد/کپی شده است.":'').
        (((string)($r['receipt_type']??'')==='text')?"\n\n<code>".bot_simple_html($r['receipt_value']??'')."</code>":'');
}
function bot_simple_shop_is_user_text($msg){ global $dok9; $m=trim((string)$msg); $labels=['🛍 فروشگاه','🛍فروشگاه','🛍 فروشـگاه','فروشگاه']; if(isset($dok9)&&trim((string)$dok9)!=='')$labels[]=trim((string)$dok9); return in_array($m,array_unique($labels),true); }
function bot_simple_shop_is_admin_text($msg){ $m=trim((string)$msg); return in_array($m,['🛍 مدیریت فروشگاه','🛍مدیریت فروشگاه','🛍 تنظیم فروشگاه','🛍تنظیم فروشگاه'],true); }
function bot_simple_shop_admin_legacy_text($msg){ $m=trim((string)$msg); foreach(['🔢آیتم های الماس','✔️متن اصلی فروشگاه✔️','🔢آیتم های'] as $l){ if($m===$l || mb_strpos($m,$l,0,'UTF-8')!==false)return true; } return false; }
function bot_simple_add_points_to_user($targetUserId,$amount,$reason='shop',array $extra=[]){
    $amount=(int)$amount; if($amount<=0)return ['ok'=>false,'error'=>'bad_amount'];
    if(function_exists('bot_wallet_add')){ $res=bot_wallet_add($targetUserId,$amount,$reason,$extra); if(is_array($res)&&!empty($res['ok']))return $res; }
    $u=function_exists('bot_data_get_json')?bot_data_get_json('melat/'.$targetUserId.'.json',[]):[]; if(!is_array($u))$u=[]; $before=(int)($u['Points']??0); $u['Points']=$before+$amount; if(function_exists('saveJson'))saveJson('melat/'.$targetUserId.'.json',$u); return ['ok'=>true,'before'=>$before,'after'=>$u['Points']];
}
function bot_simple_shop_sanitize_old_packages(){ $cleaned=0; for($i=1;$i<=6;$i++){ $p=bot_simple_shop_slot($i); if(bot_simple_placeholder($p['label'])&&($p['label']!==''||$p['coins']>0||$p['amount']>0)){bot_simple_shop_clear_package($i);$cleaned++;}} return $cleaned; }

function bot_simple_shop_runtime_router(){
    global $msg,$data,$data_id,$chatID,$msg_id,$user,$userID,$step,$isAdmin,$Tc,$message,$admin,$first_name,$username,$money,$Button_back_panel,$Button_Home,$Button_Panel;
    if(!isset($Tc) || $Tc !== 'private') return false;

    if(isset($message) && $isAdmin && isset($step) && preg_match('/^simpkg_(\d+)_(label|amount|coins)$/',(string)$step,$m)){
        $idx=(int)$m[1]; $field=$m[2]; $value=trim((string)($msg??''));
        if(function_exists('bot_is_menu_back_text') && (bot_is_menu_back_text($value) || (function_exists('bot_is_admin_menu_back_text') && bot_is_admin_menu_back_text($value)))){ $user['step']='none'; saveJson("melat/$userID.json",$user); SM($chatID,bot_simple_shop_packages_admin_text(),'html',null,bot_simple_shop_packages_admin_keyboard()); return true; }
        if(!bot_simple_shop_save_package_field($idx,$field,$value)){ $title=$field==='label'?'نام بسته':($field==='amount'?'قیمت به ریال':'مقدار الماس'); SM($chatID,"❌ مقدار واردشده برای {$title} معتبر نیست. دوباره ارسال کنید.",'html',null,$Button_back_panel); return true; }
        $user['step']='none'; saveJson("melat/$userID.json",$user); SM($chatID,"✅ بسته {$idx} ذخیره شد.",'html',null,bot_simple_shop_packages_admin_keyboard()); return true;
    }
    if(isset($message) && $isAdmin && isset($step) && preg_match('/^simpcard_(number|holder|bank|note)$/',(string)$step,$m)){
        $value=trim((string)($msg??'')); if(!bot_simple_shop_save_card_setting($m[1],$value)){ SM($chatID,'❌ مقدار معتبر نیست. دوباره ارسال کنید.','html',null,$Button_back_panel); return true; }
        $user['step']='none'; saveJson("melat/$userID.json",$user); SM($chatID,'✅ اطلاعات کارت ذخیره شد.','html',null,bot_simple_shop_card_admin_keyboard()); return true;
    }
    if(isset($message) && $isAdmin && isset($step) && (string)$step === 'simpreceipt_channel'){
        $value = trim((string)($msg ?? ''));
        if(function_exists('bot_is_menu_back_text') && (bot_is_menu_back_text($value) || (function_exists('bot_is_admin_menu_back_text') && bot_is_admin_menu_back_text($value)))){
            $user['step']='none'; saveJson("melat/$userID.json",$user); SM($chatID, bot_manual_receipt_channel_admin_text(), 'html', null, bot_manual_receipt_channel_admin_keyboard()); return true;
        }
        if($value === ''){ SM($chatID, '❌ آیدی یا یوزرنیم کانال رسیدها را ارسال کنید.', 'html', null, $Button_back_panel); return true; }
        bot_manual_receipt_channel_save(['channel_id'=>$value, 'enabled'=>'✅فعال']);
        $user['step']='none'; saveJson("melat/$userID.json",$user);
        SM($chatID, '✅ کانال رسیدها ذخیره و روشن شد.', 'html', null, bot_manual_receipt_channel_admin_keyboard());
        return true;
    }
    if(isset($message) && $isAdmin && isset($step) && in_array((string)$step,['simpzibal_merchant','simpzarin_merchant','simpsupport_contact'],true)){
        $value=trim((string)($msg??''));
        if($step==='simpzibal_merchant' || $step==='simpzarin_merchant'){ if(strlen($value)<8){SM($chatID,'❌ مرچنت آیدی معتبر نیست.','html',null,$Button_back_panel);return true;} bot_simple_shop_save_setting('zibal_merchant_id',$value); $user['step']='none'; saveJson("melat/$userID.json",$user); SM($chatID,'✅ مرچنت آیدی زیبال ذخیره شد.','html',null,bot_simple_shop_zibal_admin_keyboard()); return true; }
        if($step==='simpsupport_contact'){ $contact=bot_simple_shop_normalize_support_contact($value); if($contact===''){SM($chatID,'❌ آیدی یا لینک پشتیبانی معتبر نیست.','html',null,$Button_back_panel);return true;} bot_simple_shop_save_setting('support_contact',$contact); $user['step']='none'; saveJson("melat/$userID.json",$user); SM($chatID,'✅ آیدی پشتیبانی ذخیره شد.','html',null,bot_simple_shop_support_admin_keyboard()); return true; }
    }
    if(isset($message) && $isAdmin && isset($step) && preg_match('/^manualpay_reply_(\d+)$/',(string)$step,$mrp)){
        $rid = $mrp[1];
        if(function_exists('bot_is_menu_back_text') && (bot_is_menu_back_text($msg ?? '') || (function_exists('bot_is_admin_menu_back_text') && bot_is_admin_menu_back_text($msg ?? '')))){
            $user['step']='none'; saveJson("melat/$userID.json",$user);
            SM($chatID,'✅ ارسال پاسخ لغو شد.','html',null,$Button_Panel);
            return true;
        }
        $rec = bot_manual_receipt_get($rid);
        if(!$rec){
            $user['step']='none'; saveJson("melat/$userID.json",$user);
            SM($chatID,'❌ رسید پیدا نشد.','html',null,$Button_Panel);
            return true;
        }
        bot('sendMessage',['chat_id'=>$rec['user_id'],'text'=>"💬 پیام پشتیبانی درباره رسید #{$rid}:"]);
        $copied = bot('copyMessage',['chat_id'=>$rec['user_id'],'from_chat_id'=>$chatID,'message_id'=>$msg_id]);
        if(!is_object($copied) || empty($copied->ok)){
            $txt = trim((string)($msg ?? ''));
            if($txt !== '') bot('sendMessage',['chat_id'=>$rec['user_id'],'text'=>$txt]);
        }
        bot_manual_receipt_update_data($rid, ['last_admin_reply_at'=>time(), 'last_admin_reply_by'=>(string)$userID]);
        $user['step']='none'; saveJson("melat/$userID.json",$user);
        SM($chatID,"✅ پیام شما برای کاربر <code>{$rec['user_id']}</code> ارسال شد.",'html',null,bot_manual_receipt_admin_keyboard($rid, $rec['user_id']));
        return true;
    }
    if(isset($message) && isset($step) && preg_match('/^manual_receipt_(\d+)$/',(string)$step,$m)){
        $p=bot_simple_shop_find_package((int)$m[1]); if(!$p){$user['step']='none';saveJson("melat/$userID.json",$user);SM($chatID,'❌ این بسته دیگر فعال نیست. دوباره از فروشگاه انتخاب کنید.','html',null,$Button_Home);return true;}
        $rtype='text'; $rvalue=trim((string)($msg??''));
        if(isset($message->photo)&&is_array($message->photo)&&count($message->photo)>0){$last=end($message->photo);$rvalue=(string)($last->file_id??'');$rtype='photo';}
        elseif(isset($message->document)&&isset($message->document->file_id)){$rvalue=(string)$message->document->file_id;$rtype='document';}
        if($rvalue===''){SM($chatID,'❌ رسید معتبر دریافت نشد. عکس رسید، فایل رسید یا کد پیگیری را ارسال کنید.','html',null,null);return true;}
        $rid=bot_manual_receipt_create($userID,$p,$rtype,$rvalue,['username'=>$username??'','first_name'=>$first_name??'','from_chat_id'=>$chatID,'message_id'=>$msg_id]); bot_manual_receipt_notify_admin($admin,$rid,$p,$userID,$rtype,$rvalue,(string)($first_name??''),['from_chat_id'=>$chatID,'message_id'=>$msg_id]);
        $user['step']='none'; saveJson("melat/$userID.json",$user); SM($chatID,"✅ رسید شما ثبت شد.\n\n🧾 شناسه رسید: <code>{$rid}</code>\nبعد از تأیید ادمین، حساب شما شارژ می‌شود.",'html',null,$Button_Home); return true;
    }

    if(isset($msg) && $isAdmin && in_array(trim((string)$msg), ['🆔 تنظیم آیدی پشتیبانی','تنظیم آیدی پشتیبانی','تنظیم ایدی پشتیبانی'], true)){ $user['step']='none'; saveJson("melat/$userID.json",$user); SM($chatID,bot_simple_shop_support_admin_text(),'html',null,bot_simple_shop_support_admin_keyboard()); return true; }
    if(isset($msg) && $isAdmin && (bot_simple_shop_is_admin_text($msg) || bot_simple_shop_admin_legacy_text($msg))){ $user['step']='none'; saveJson("melat/$userID.json",$user); SM($chatID,bot_simple_shop_admin_text(),'html',null,bot_simple_shop_admin_keyboard()); return true; }
    if(isset($msg) && bot_simple_shop_is_user_text($msg)){ $user['step']='none'; saveJson("melat/$userID.json",$user); SM($chatID,bot_simple_shop_user_text(),'html',null,bot_simple_shop_user_keyboard()); return true; }

    if(isset($data) && (string)$data==='simpay_support'){ if(!bot_simple_shop_support_ready()){bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'خرید از پشتیبانی فعال یا کامل تنظیم نشده است.','show_alert'=>true]);return true;} bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'پشتیبانی','show_alert'=>false]); bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_simple_shop_support_user_text(),'parse_mode'=>'HTML','reply_markup'=>bot_simple_shop_support_user_keyboard()]); return true; }
    if(isset($data) && preg_match('/^simpay_pkg_(\d+)$/',(string)$data,$m)){ $p=bot_simple_shop_find_package((int)$m[1]); if(!$p){bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'بسته فعال نیست.','show_alert'=>true]);return true;} bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'انتخاب روش پرداخت','show_alert'=>false]); bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_simple_shop_package_text($p),'parse_mode'=>'HTML','reply_markup'=>bot_simple_shop_payment_keyboard($p)]); return true; }
    if(isset($data) && in_array((string)$data,['simpay_back','shop-back'],true)){ bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'فروشگاه','show_alert'=>false]); bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_simple_shop_user_text(),'parse_mode'=>'HTML','reply_markup'=>bot_simple_shop_user_keyboard()]); return true; }
    if(isset($data) && (string)$data==='simpay_help'){ bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'راهنما','show_alert'=>false]); bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>"📋 **راهنمای خرید**\n\n۱) بسته را انتخاب کنید.\n۲) یکی از روش‌های پرداخت فعال را بزنید.\n۳) اگر کارت‌به‌کارت انتخاب کردید، رسید را بفرستید.\n۴) اگر زیبال انتخاب کردید، بعد از پرداخت موفق حساب شما خودکار شارژ می‌شود.",'parse_mode'=>'HTML','reply_markup'=>json_encode(['inline_keyboard'=>[[['text'=>'🔙 برگشت به فروشگاه','callback_data'=>'simpay_back']]]],JSON_UNESCAPED_UNICODE)]); return true; }
    if(isset($data) && preg_match('/^simpay_card_(\d+)$/',(string)$data,$m)){ $p=bot_simple_shop_find_package((int)$m[1]); if(!$p){bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'بسته فعال نیست.','show_alert'=>true]);return true;} if(!bot_simple_shop_method_enabled('card')||!bot_simple_shop_card_ready()){bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'کارت‌به‌کارت فعال یا کامل تنظیم نشده است.','show_alert'=>true]);return true;} bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'اطلاعات کارت','show_alert'=>false]); bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_simple_shop_card_text($p),'parse_mode'=>'HTML','reply_markup'=>bot_simple_shop_card_keyboard($p)]); return true; }
    if(isset($data) && preg_match('/^simpay_receipt_(\d+)$/',(string)$data,$m)){ $p=bot_simple_shop_find_package((int)$m[1]); if(!$p){bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'بسته فعال نیست.','show_alert'=>true]);return true;} $user['step']='manual_receipt_'.$p['index']; saveJson("melat/$userID.json",$user); bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'رسید را ارسال کنید','show_alert'=>false]); SM($chatID,"📤 رسید پرداخت را ارسال کنید.\n\nمی‌توانید عکس رسید، فایل رسید یا کد پیگیری را بفرستید.",'html',null,$Button_back_panel); return true; }
    if(isset($data) && preg_match('/^simpay_(?:zibal|zp)_(\d+)$/',(string)$data,$m)){ $p=bot_simple_shop_find_package((int)$m[1]); if(!$p){bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'بسته فعال نیست.','show_alert'=>true]);return true;} if(!bot_simple_shop_method_enabled('zibal')||!function_exists('bot_zibal_request_payment')){bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'زیبال فعال یا کامل تنظیم نشده است.','show_alert'=>true]);return true;} bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'در حال ساخت لینک پرداخت...','show_alert'=>false]); $res=bot_zibal_request_payment($userID,(int)$p['amount'],"خرید {$p['coins']} $money",(string)($user['phone']??''),'coin',(int)$p['coins'],['item'=>$p,'simple_shop'=>1]); if(empty($res['ok'])){SM($chatID,"❌ ساخت لینک پرداخت انجام نشد.\nکد خطا: <code>".bot_simple_html($res['error']??'unknown')."</code>",'html',null,bot_simple_shop_payment_keyboard($p));return true;} SM($chatID,bot_simple_shop_package_text($p),'html',null,bot_simple_shop_pay_url_keyboard($res['payment_url'],'simpay_pkg_'.$p['index'])); return true; }

    if(isset($data) && $isAdmin && in_array((string)$data,['simpadmin_shop','backshop'],true)){ bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'مدیریت فروشگاه','show_alert'=>false]); bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_simple_shop_admin_text(),'parse_mode'=>'HTML','reply_markup'=>bot_simple_shop_admin_keyboard()]); return true; }
    if(isset($data) && $isAdmin && (string)$data==='simpadmin_packages'){ bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'بسته‌ها','show_alert'=>false]); bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_simple_shop_packages_admin_text(),'parse_mode'=>'HTML','reply_markup'=>bot_simple_shop_packages_admin_keyboard()]); return true; }
    if(isset($data) && $isAdmin && preg_match('/^simpkg_(\d+)_(label|amount|coins)$/',(string)$data,$m)){ $user['step']='simpkg_'.$m[1].'_'.$m[2]; saveJson("melat/$userID.json",$user); $title=$m[2]==='label'?'نام بسته':($m[2]==='amount'?'قیمت بسته به ریال':'مقدار الماس بسته'); bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>$title.' را ارسال کنید','show_alert'=>false]); SM($chatID,"✏️ {$title} را برای بسته {$m[1]} ارسال کنید.",'html',null,$Button_back_panel); return true; }
    if(isset($data) && $isAdmin && preg_match('/^simpkg_(\d+)_delete$/',(string)$data,$m)){ bot_simple_shop_clear_package((int)$m[1]); bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'بسته حذف شد','show_alert'=>false]); bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_simple_shop_packages_admin_text(),'parse_mode'=>'HTML','reply_markup'=>bot_simple_shop_packages_admin_keyboard()]); return true; }
    if(isset($data) && $isAdmin && (string)$data==='simpadmin_card'){ bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'تنظیم کارت','show_alert'=>false]); bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_simple_shop_card_admin_text(),'parse_mode'=>'HTML','reply_markup'=>bot_simple_shop_card_admin_keyboard()]); return true; }
    if(isset($data) && $isAdmin && preg_match('/^simpcard_(number|holder|bank|note)$/',(string)$data,$m)){ $user['step']='simpcard_'.$m[1]; saveJson("melat/$userID.json",$user); $titles=['number'=>'شماره کارت','holder'=>'نام گیرنده','bank'=>'نام بانک','note'=>'متن راهنمای رسید']; bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'مقدار را ارسال کنید','show_alert'=>false]); SM($chatID,"✏️ {$titles[$m[1]]} را ارسال کنید.",'html',null,$Button_back_panel); return true; }
    if(isset($data) && $isAdmin && (string)$data==='simpadmin_receipt_channel'){ bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'کانال رسیدها','show_alert'=>false]); bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_manual_receipt_channel_admin_text(),'parse_mode'=>'HTML','reply_markup'=>bot_manual_receipt_channel_admin_keyboard()]); return true; }
    if(isset($data) && $isAdmin && (string)$data==='simpreceipt_channel_set'){ $user['step']='simpreceipt_channel'; saveJson("melat/$userID.json",$user); bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'کانال را ارسال کنید','show_alert'=>false]); SM($chatID,'📌 آیدی عددی یا یوزرنیم کانال رسیدها را ارسال کنید. مثال: <code>@mychannel</code> یا <code>-1001234567890</code>','html',null,$Button_back_panel); return true; }
    if(isset($data) && $isAdmin && (string)$data==='simpreceipt_channel_toggle'){ $s=bot_manual_receipt_channel_settings(); bot_manual_receipt_channel_save(['enabled'=>(($s['enabled']??'')==='✅فعال'?'❌غیر فعال':'✅فعال')]); bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'وضعیت تغییر کرد','show_alert'=>false]); bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_manual_receipt_channel_admin_text(),'parse_mode'=>'HTML','reply_markup'=>bot_manual_receipt_channel_admin_keyboard()]); return true; }
    if(isset($data) && $isAdmin && (string)$data==='simpreceipt_admin_notify_toggle'){ $s=bot_manual_receipt_channel_settings(); bot_manual_receipt_channel_save(['admin_notify_enabled'=>(($s['admin_notify_enabled']??'')==='✅فعال'?'❌غیر فعال':'✅فعال')]); bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'وضعیت تغییر کرد','show_alert'=>false]); bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_manual_receipt_channel_admin_text(),'parse_mode'=>'HTML','reply_markup'=>bot_manual_receipt_channel_admin_keyboard()]); return true; }
    if(isset($data) && $isAdmin && (string)$data==='simpadmin_methods'){ bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'روش‌های پرداخت','show_alert'=>false]); bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_simple_shop_methods_text(),'parse_mode'=>'HTML','reply_markup'=>bot_simple_shop_methods_keyboard()]); return true; }
    if(isset($data) && $isAdmin && preg_match('/^simp_toggle_(card|zibal|zarinpal|support_buy)$/',(string)$data,$m)){ $key=$m[1]==='zarinpal'?'zibal':$m[1]; bot_simple_shop_toggle_setting($key.'_enabled'); bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'وضعیت تغییر کرد','show_alert'=>false]); bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_simple_shop_methods_text(),'parse_mode'=>'HTML','reply_markup'=>bot_simple_shop_methods_keyboard()]); return true; }
    if(isset($data) && $isAdmin && (string)$data==='simpadmin_support'){ bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'پشتیبانی','show_alert'=>false]); bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_simple_shop_support_admin_text(),'parse_mode'=>'HTML','reply_markup'=>bot_simple_shop_support_admin_keyboard()]); return true; }
    if(isset($data) && $isAdmin && (string)$data==='simpsupport_contact'){ $user['step']='simpsupport_contact'; saveJson("melat/$userID.json",$user); bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'آیدی پشتیبانی را ارسال کنید','show_alert'=>false]); SM($chatID,'🆔 آیدی یا لینک پشتیبانی تلگرام را ارسال کنید. مثال: @support یا https://t.me/support','html',null,$Button_back_panel); return true; }
    if(isset($data) && $isAdmin && (string)$data==='simpsupport_toggle'){ bot_simple_shop_toggle_setting('support_buy_enabled'); bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'وضعیت تغییر کرد','show_alert'=>false]); bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_simple_shop_support_admin_text(),'parse_mode'=>'HTML','reply_markup'=>bot_simple_shop_support_admin_keyboard()]); return true; }
    if(isset($data) && $isAdmin && in_array((string)$data,['simpadmin_zibal','simpadmin_zarinpal'],true)){ bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'زیبال','show_alert'=>false]); bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_simple_shop_zibal_admin_text(),'parse_mode'=>'HTML','reply_markup'=>bot_simple_shop_zibal_admin_keyboard()]); return true; }
    if(isset($data) && $isAdmin && in_array((string)$data,['simpzibal_merchant','simpzarin_merchant'],true)){ $user['step']='simpzibal_merchant'; saveJson("melat/$userID.json",$user); bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'مرچنت را ارسال کنید','show_alert'=>false]); SM($chatID,'🔐 مرچنت آیدی زیبال را ارسال کنید.','html',null,$Button_back_panel); return true; }
    if(isset($data) && $isAdmin && (string)$data==='simpadmin_receipts'){ bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'رسیدها','show_alert'=>false]); bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_simple_shop_pending_receipts_text(),'parse_mode'=>'HTML','reply_markup'=>bot_simple_shop_pending_receipts_keyboard()]); return true; }
    if(isset($data) && $isAdmin && (string)$data==='simpadmin_accounting'){
        bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'حسابداری','show_alert'=>false]);
        $base = defined('BOT_PUBLIC_BASE_URL') ? rtrim((string)BOT_PUBLIC_BASE_URL, '/') : '';
        $url = $base !== '' ? $base.'/admin/accounting.php' : '/admin/accounting.php';
        $txt = "📒 <b>حسابداری و دفتر کل</b>

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

".
               "🌐 مسیر پنل: <code>".htmlspecialchars($url, ENT_QUOTES, 'UTF-8')."</code>";
        SM($chatID,$txt,'html',null,bot_simple_shop_admin_keyboard());
        return true;
    }
    if(isset($data) && $isAdmin && (string)$data==='simpadmin_payments_pdf'){
        bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'در حال ساخت فایل PDF...','show_alert'=>false]);
        if(!function_exists('bot_payment_report_send_pdf_to_admin')){
            SM($chatID,'❌ سرویس گزارش پرداخت‌ها در دسترس نیست. فایل app/Services/PaymentReportService.php را جایگزین کن.','html',null,bot_simple_shop_admin_keyboard());
            return true;
        }
        $send = bot_payment_report_send_pdf_to_admin($chatID);
        if(!empty($send['ok'])){
            $tot = $send['report']['totals'] ?? [];
            SM($chatID, "✅ گزارش PDF پرداخت‌ها ارسال شد.

💰 درآمد کل: <b>".number_format((int)($tot['amount'] ?? 0))." ریال</b>
🧾 تعداد پرداخت موفق: <b>".(int)($tot['paid_count'] ?? ($tot['count'] ?? 0))."</b>
📦 فاکتورهای قبلی: <b>".(int)($tot['legacy_count'] ?? 0)."</b>", 'html', null, bot_simple_shop_admin_keyboard());
        }else{
            $err = htmlspecialchars((string)($send['error'] ?? ($send['response']->description ?? 'send_failed')), ENT_QUOTES, 'UTF-8');
            SM($chatID, '❌ ساخت یا ارسال فایل PDF انجام نشد.\nخطا: <code>'.$err.'</code>\n\nاگر خطا upload بود، افزونه curl هاست را بررسی کن. از پنل وب هم می‌توانی فایل را دانلود کنی: /admin/payments-report.php', 'html', null, bot_simple_shop_admin_keyboard());
        }
        return true;
    }
    if(isset($data) && $isAdmin && preg_match('/^simpadmin_receipt_(\d+)$/',(string)$data,$m)){ bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'جزئیات رسید','show_alert'=>false]); bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_simple_shop_receipt_detail_text($m[1]),'parse_mode'=>'HTML','reply_markup'=>bot_manual_receipt_admin_keyboard($m[1])]); return true; }
    if(isset($data) && $isAdmin && preg_match('/^manualpay_reply_(\d+)$/',(string)$data,$m)){
        $rid = $m[1];
        $rec = bot_manual_receipt_get($rid);
        if(!$rec){ bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'رسید پیدا نشد.','show_alert'=>true]); return true; }
        $user['step']='manualpay_reply_'.$rid; saveJson("melat/$userID.json",$user);
        bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'پیام پاسخ را ارسال کنید','show_alert'=>false]);
        SM($chatID,"💬 پاسخ خود را برای کاربر <code>{$rec['user_id']}</code> ارسال کنید.

هر نوع پیام متنی/عکس/فایل را می‌توانی بفرستی؛ ربات بدون دانلود روی هاست آن را برای کاربر کپی می‌کند.",'html',null,$Button_back_panel);
        return true;
    }
    if(isset($data) && $isAdmin && preg_match('/^manualpay_quick_menu_(\d+)$/',(string)$data,$m)){
        $rid=(int)$m[1]; $rec=bot_manual_receipt_get($rid);
        bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>$rec?'پاسخ‌های آماده':'رسید پیدا نشد','show_alert'=>!$rec]);
        if(!$rec) return true;
        $kb=function_exists('bot_canned_keyboard') ? bot_canned_keyboard('receipts','manualpay_quick',$rid,'manualpay_back') : bot_manual_receipt_admin_keyboard($rid, $rec['user_id'] ?? null);
        bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>'⚡ <b>پاسخ آماده رسید</b>

یکی از پاسخ‌های آماده را انتخاب کن. متن‌ها از پنل وب قابل تغییر هستند.','parse_mode'=>'HTML','reply_markup'=>$kb]);
        return true;
    }
    if(isset($data) && $isAdmin && preg_match('/^manualpay_back:(\d+)$/',(string)$data,$m)){
        $rid=(int)$m[1]; $rec=bot_manual_receipt_get($rid);
        bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'بازگشت','show_alert'=>false]);
        if($rec) bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_simple_shop_receipt_detail_text($rid),'parse_mode'=>'HTML','reply_markup'=>bot_manual_receipt_admin_keyboard($rid,$rec['user_id'] ?? null)]);
        return true;
    }
    if(isset($data) && $isAdmin && preg_match('/^manualpay_quick:(\d+):([A-Za-z0-9_\-]+)$/',(string)$data,$m)){
        $rid=(int)$m[1]; $key=(string)$m[2]; $rec=bot_manual_receipt_get($rid); $reply=function_exists('bot_canned_get')?bot_canned_get('receipts',$key):null;
        if(!$rec || !$reply){ bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'رسید یا پاسخ پیدا نشد','show_alert'=>true]); return true; }
        if(function_exists('bot_canned_send_to_user')) bot_canned_send_to_user($rec['user_id'],$reply['text'],$reply['title']); else bot('sendMessage',['chat_id'=>$rec['user_id'],'text'=>$reply['text']]);
        bot_manual_receipt_update_data($rid, ['last_canned_reply_at'=>time(),'last_canned_reply_key'=>$key,'last_canned_reply_by'=>(string)$userID]);
        bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'پاسخ آماده ارسال شد','show_alert'=>false]);
        bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>'✅ پاسخ آماده برای کاربر <code>'.htmlspecialchars((string)$rec['user_id'],ENT_QUOTES,'UTF-8').'</code> ارسال شد.','parse_mode'=>'HTML','reply_markup'=>bot_manual_receipt_admin_keyboard($rid,$rec['user_id'] ?? null)]);
        return true;
    }
    if(isset($data) && $isAdmin && preg_match('/^manualpay_(approve|reject)_(\d+)$/',(string)$data,$m)){
        bot_manual_receipt_handle_admin_action($data_id, $chatID, $msg_id, $userID, $m[1], $m[2]);
        return true;
    }
    if(isset($data) && (string)$data==='noop'){ bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'','show_alert'=>false]); return true; }
    return false;
}
