<?php
// ========================== Reaction Shop Service ==========================
// فروش ری‌اکشن: محصولات قابل تنظیم، حداقل/حداکثر خرید، پرداخت زیبال/کارت‌به‌کارت، دریافت لینک بعد از پرداخت و ارسال به ادمین.

if(!function_exists('bot_reaction_root_path')){
    function bot_reaction_root_path($path=''){
        $root = defined('BOT_ROOT_DIR') ? BOT_ROOT_DIR : dirname(__DIR__, 2);
        $path = ltrim((string)$path, '/');
        return $path === '' ? $root : ($root . '/' . $path);
    }
}
if(!function_exists('bot_reaction_html')){
    function bot_reaction_html($v){ return htmlspecialchars((string)$v, ENT_QUOTES, 'UTF-8'); }
}
if(!function_exists('bot_reaction_clean_int')){
    function bot_reaction_clean_int($v){ return (int)preg_replace('/[^0-9]/', '', (string)$v); }
}
if(!function_exists('bot_reaction_money')){
    function bot_reaction_money($amount){ return number_format((int)$amount) . ' ریال'; }
}
if(!function_exists('bot_reaction_read_json')){
    function bot_reaction_read_json($path, $default=[]){
        if(function_exists('bot_data_get_json')){
            $v = bot_data_get_json($path, $default);
            return is_array($v) ? $v : $default;
        }
        $full = bot_reaction_root_path($path);
        if(!is_file($full)) return $default;
        $json = json_decode((string)@file_get_contents($full), true);
        return is_array($json) ? $json : $default;
    }
}
if(!function_exists('bot_reaction_write_json')){
    function bot_reaction_write_json($path, $data){
        if(function_exists('saveJson')) return saveJson($path, $data);
        $full = bot_reaction_root_path($path);
        $dir = dirname($full); if(!is_dir($dir)) @mkdir($dir, 0755, true);
        return (bool)@file_put_contents($full, json_encode($data, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT), LOCK_EX);
    }
}
if(!function_exists('bot_reaction_send')){
    function bot_reaction_send($chatId, $text, $replyMarkup=null){
        if(function_exists('SM')) return SM($chatId, $text, 'html', null, $replyMarkup);
        if(function_exists('bot')) return bot('sendMessage', ['chat_id'=>$chatId, 'text'=>$text, 'parse_mode'=>'HTML', 'reply_markup'=>$replyMarkup]);
        return false;
    }
}

if(!function_exists('bot_reaction_user_back_keyboard')){
    function bot_reaction_user_back_keyboard(){
        return json_encode(['keyboard'=>[[['text'=>'🔙 بازگشت']]], 'resize_keyboard'=>true, 'one_time_keyboard'=>true], JSON_UNESCAPED_UNICODE);
    }
}

if(!function_exists('bot_reaction_admin_ids')){
    function bot_reaction_admin_ids(){
        global $admin, $main_admins;
        $ids=[];
        if(function_exists('bot_config_master_admin_ids')) $ids = bot_config_master_admin_ids();
        if(!is_array($ids)) $ids=[];
        if(!empty($admin)) $ids[]=(string)$admin;
        if(!empty($main_admins) && is_array($main_admins)) foreach($main_admins as $a) $ids[]=(string)$a;
        return array_values(array_unique(array_filter(array_map('strval',$ids), function($v){return trim($v)!=='';})));
    }
}

if(!function_exists('bot_reaction_default_settings')){
    function bot_reaction_default_settings(){
        return [
            'enabled'=>'✅فعال',
            'min_qty'=>10,
            'max_qty'=>100,
            'products'=>[
                1=>['id'=>1,'title'=>'❤️ ری‌اکشن قلب','emoji'=>'❤️','unit_price'=>1000,'active'=>'✅فعال'],
                2=>['id'=>2,'title'=>'🔥 ری‌اکشن آتش','emoji'=>'🔥','unit_price'=>1000,'active'=>'❌غیر فعال'],
                3=>['id'=>3,'title'=>'👍 ری‌اکشن لایک','emoji'=>'👍','unit_price'=>1000,'active'=>'❌غیر فعال'],
            ],
        ];
    }
}
if(!function_exists('bot_reaction_settings_path')){ function bot_reaction_settings_path(){ return 'lib/kodam/reaction_shop_settings.json'; } }
if(!function_exists('bot_reaction_orders_path')){ function bot_reaction_orders_path(){ return 'cache/reaction_orders.json'; } }
if(!function_exists('bot_reaction_settings')){
    function bot_reaction_settings(){
        $d = bot_reaction_default_settings();
        $s = bot_reaction_read_json(bot_reaction_settings_path(), []);
        if(!is_array($s)) $s=[];
        $out = array_merge($d, $s);
        if(!isset($out['products']) || !is_array($out['products'])) $out['products']=$d['products'];
        for($i=1;$i<=8;$i++){
            if(!isset($out['products'][$i]) || !is_array($out['products'][$i])) $out['products'][$i]=['id'=>$i,'title'=>'','emoji'=>'','unit_price'=>0,'active'=>'❌غیر فعال'];
            $out['products'][$i]['id']=$i;
            $out['products'][$i]['title']=trim((string)($out['products'][$i]['title']??''));
            $out['products'][$i]['emoji']=trim((string)($out['products'][$i]['emoji']??''));
            $out['products'][$i]['unit_price']=(int)($out['products'][$i]['unit_price']??0);
            $out['products'][$i]['active']=((string)($out['products'][$i]['active']??'❌غیر فعال')==='✅فعال')?'✅فعال':'❌غیر فعال';
        }
        $out['min_qty']=max(1,(int)($out['min_qty']??10));
        $out['max_qty']=max($out['min_qty'],(int)($out['max_qty']??100));
        $out['enabled']=((string)($out['enabled']??'✅فعال')==='✅فعال')?'✅فعال':'❌غیر فعال';
        return $out;
    }
}
if(!function_exists('bot_reaction_save_settings')){
    function bot_reaction_save_settings(array $patch){
        $s=bot_reaction_settings();
        foreach($patch as $k=>$v) $s[$k]=$v;
        return bot_reaction_write_json(bot_reaction_settings_path(), $s);
    }
}
if(!function_exists('bot_reaction_product')){
    function bot_reaction_product($id){
        $s=bot_reaction_settings(); $id=(int)$id;
        return isset($s['products'][$id]) && is_array($s['products'][$id]) ? $s['products'][$id] : null;
    }
}
if(!function_exists('bot_reaction_active_products')){
    function bot_reaction_active_products(){
        $s=bot_reaction_settings(); $out=[];
        foreach($s['products'] as $p){
            if(($p['active']??'')==='✅فعال' && trim((string)($p['title']??''))!=='' && (int)($p['unit_price']??0)>0) $out[(int)$p['id']]=$p;
        }
        return $out;
    }
}
if(!function_exists('bot_reaction_orders_read')){
    function bot_reaction_orders_read(){ $d=bot_reaction_read_json(bot_reaction_orders_path(), []); return is_array($d)?$d:[]; }
}
if(!function_exists('bot_reaction_orders_write')){
    function bot_reaction_orders_write(array $orders){ return bot_reaction_write_json(bot_reaction_orders_path(), $orders); }
}
if(!function_exists('bot_reaction_order_get')){
    function bot_reaction_order_get($id){ $o=bot_reaction_orders_read(); return isset($o[$id])&&is_array($o[$id])?$o[$id]:null; }
}
if(!function_exists('bot_reaction_order_save')){
    function bot_reaction_order_save(array $order){
        if(empty($order['id'])) $order['id']='rx_'.date('YmdHis').'_'.mt_rand(1000,9999);
        $order['updated_at']=time();
        $all=bot_reaction_orders_read(); $all[(string)$order['id']]=$order;
        return bot_reaction_orders_write($all);
    }
}
if(!function_exists('bot_reaction_new_order')){
    function bot_reaction_new_order($userId, array $product, $qty, $method){
        $qty=(int)$qty; $amount=$qty*(int)$product['unit_price'];
        $id='rx_'.date('YmdHis').'_'.mt_rand(1000,9999);
        $order=[
            'id'=>$id,
            'user_id'=>(string)$userId,
            'product_id'=>(int)$product['id'],
            'product_title'=>(string)$product['title'],
            'product_emoji'=>(string)($product['emoji']??''),
            'unit_price'=>(int)$product['unit_price'],
            'qty'=>$qty,
            'amount'=>$amount,
            'method'=>(string)$method,
            'status'=>$method==='card'?'awaiting_card_receipt':'awaiting_zibal',
            'created_at'=>time(),
            'updated_at'=>time(),
            'target_link'=>'',
        ];
        bot_reaction_order_save($order);
        return $order;
    }
}

if(!function_exists('bot_reaction_user_text')){
    function bot_reaction_user_text(){
        $s=bot_reaction_settings();
        $txt="🔥 <b>خرید ری‌اکشن</b>\n\n".
             "از این بخش می‌توانید برای لینک پست/پیام خود ری‌اکشن سفارش دهید.\n\n".
             "📌 حداقل خرید: <b>".number_format((int)$s['min_qty'])."</b>\n".
             "📌 حداکثر خرید: <b>".number_format((int)$s['max_qty'])."</b>\n\n";
        $items=bot_reaction_active_products();
        if(!$items) $txt.="❌ فعلاً محصول ری‌اکشن توسط مدیریت فعال نشده است.";
        else $txt.="ابتدا نوع ری‌اکشن را انتخاب کنید.";
        return $txt;
    }
}
if(!function_exists('bot_reaction_user_keyboard')){
    function bot_reaction_user_keyboard(){
        $rows=[];
        foreach(bot_reaction_active_products() as $p){
            $rows[]=[[ 'text'=>(trim(($p['emoji']??''))!==''?$p['emoji'].' ':'').$p['title'].' | هر عدد '.bot_reaction_money((int)$p['unit_price']), 'callback_data'=>'reaction_prod_'.$p['id'] ]];
        }
        $rows[]=[[ 'text'=>'🔙 بازگشت', 'callback_data'=>'reaction_close' ]];
        return json_encode(['inline_keyboard'=>$rows], JSON_UNESCAPED_UNICODE);
    }
}
if(!function_exists('bot_reaction_admin_text')){
    function bot_reaction_admin_text(){
        $s=bot_reaction_settings();
        $orders=bot_reaction_orders_read(); $pending=0; $paid=0; $submitted=0;
        foreach($orders as $o){ if(!is_array($o)) continue; $st=(string)($o['status']??''); if(strpos($st,'awaiting')===0)$pending++; elseif($st==='paid_waiting_link')$paid++; elseif($st==='submitted')$submitted++; }
        $txt="🔥 <b>مدیریت فروش ری‌اکشن</b>\n\n".
             "وضعیت: <b>".($s['enabled']==='✅فعال'?'فعال ✅':'غیرفعال ❌')."</b>\n".
             "حداقل خرید: <b>".(int)$s['min_qty']."</b>\n".
             "حداکثر خرید: <b>".(int)$s['max_qty']."</b>\n\n".
             "⏳ در انتظار پرداخت/رسید: <b>{$pending}</b>\n".
             "🔗 پرداخت‌شده و منتظر لینک: <b>{$paid}</b>\n".
             "✅ ارسال‌شده برای ادمین: <b>{$submitted}</b>\n\n".
             "📦 <b>محصولات:</b>\n";
        foreach($s['products'] as $p){
            $state=($p['active']==='✅فعال'?'✅':'❌');
            $title=trim((string)$p['title']); if($title==='') $title='تنظیم نشده';
            $txt.="{$state} {$p['id']}) ".bot_reaction_html($title)." — هر عدد ".bot_reaction_money((int)$p['unit_price'])."\n";
        }
        return $txt;
    }
}
if(!function_exists('bot_reaction_admin_keyboard')){
    function bot_reaction_admin_keyboard(){
        $s=bot_reaction_settings();
        $rows=[
            [[ 'text'=>'🔢 تنظیم حداقل خرید', 'callback_data'=>'reaction_admin_min' ],[ 'text'=>'🔢 تنظیم حداکثر خرید', 'callback_data'=>'reaction_admin_max' ]],
            [[ 'text'=>($s['enabled']==='✅فعال'?'✅ خاموش کردن فروش ری‌اکشن':'❌ روشن کردن فروش ری‌اکشن'), 'callback_data'=>'reaction_admin_toggle' ]],
        ];
        for($i=1;$i<=8;$i++){
            $p=$s['products'][$i]; $title=trim((string)$p['title']); if($title==='') $title='محصول '.$i;
            $rows[]=[[ 'text'=>'📦 '.$i.' - '.mb_substr($title,0,18,'UTF-8'), 'callback_data'=>'reaction_admin_product_'.$i ]];
        }
        $rows[]=[[ 'text'=>'📋 آخرین سفارش‌ها', 'callback_data'=>'reaction_admin_orders' ]];
        $rows[]=[[ 'text'=>'🔙 بازگشت به فروشگاه', 'callback_data'=>'simpadmin_shop' ]];
        return json_encode(['inline_keyboard'=>$rows], JSON_UNESCAPED_UNICODE);
    }
}
if(!function_exists('bot_reaction_product_admin_text')){
    function bot_reaction_product_admin_text($id){
        $p=bot_reaction_product($id);
        if(!$p) return 'محصول پیدا نشد.';
        return "📦 <b>محصول ری‌اکشن {$id}</b>\n\n".
            "وضعیت: <b>".($p['active']==='✅فعال'?'فعال ✅':'غیرفعال ❌')."</b>\n".
            "نام: <b>".bot_reaction_html($p['title'] ?: 'تنظیم نشده')."</b>\n".
            "ایموجی: <b>".bot_reaction_html($p['emoji'] ?: '-')."</b>\n".
            "قیمت هر عدد: <b>".bot_reaction_money((int)$p['unit_price'])."</b>";
    }
}
if(!function_exists('bot_reaction_product_admin_keyboard')){
    function bot_reaction_product_admin_keyboard($id){
        $p=bot_reaction_product($id); $enabled=($p && $p['active']==='✅فعال');
        return json_encode(['inline_keyboard'=>[
            [[ 'text'=>'✏️ تنظیم نام', 'callback_data'=>'reaction_set_title_'.$id ],[ 'text'=>'😀 تنظیم ایموجی', 'callback_data'=>'reaction_set_emoji_'.$id ]],
            [[ 'text'=>'💳 قیمت هر عدد', 'callback_data'=>'reaction_set_price_'.$id ]],
            [[ 'text'=>($enabled?'✅ غیرفعال کردن':'❌ فعال کردن'), 'callback_data'=>'reaction_toggle_product_'.$id ]],
            [[ 'text'=>'🔙 برگشت به ری‌اکشن', 'callback_data'=>'reaction_admin' ]],
        ]], JSON_UNESCAPED_UNICODE);
    }
}
if(!function_exists('bot_reaction_quantity_text')){
    function bot_reaction_quantity_text(array $p){
        $s=bot_reaction_settings();
        return "🔢 <b>تعداد ری‌اکشن را ارسال کنید</b>\n\n".
            "📦 محصول: <b>".bot_reaction_html($p['title'])."</b>\n".
            "💳 قیمت هر عدد: <b>".bot_reaction_money((int)$p['unit_price'])."</b>\n".
            "حداقل: <b>".(int)$s['min_qty']."</b> | حداکثر: <b>".(int)$s['max_qty']."</b>";
    }
}
if(!function_exists('bot_reaction_payment_text')){
    function bot_reaction_payment_text(array $order){
        return "🔥 <b>پیش‌فاکتور خرید ری‌اکشن</b>\n\n".
            "🆔 سفارش: <code>".bot_reaction_html($order['id'])."</code>\n".
            "📦 محصول: <b>".bot_reaction_html($order['product_title'])."</b>\n".
            "🔢 تعداد: <b>".number_format((int)$order['qty'])."</b>\n".
            "💳 قیمت هر عدد: <b>".bot_reaction_money((int)$order['unit_price'])."</b>\n".
            "💰 مبلغ کل: <b>".bot_reaction_money((int)$order['amount'])."</b>\n\n".
            "روش پرداخت را انتخاب کنید.";
    }
}
if(!function_exists('bot_reaction_payment_keyboard')){
    function bot_reaction_payment_keyboard(array $order){
        $rows=[];
        if(function_exists('bot_simple_shop_method_enabled') && bot_simple_shop_method_enabled('zibal') && function_exists('bot_zibal_request_payment')) $rows[]=[[ 'text'=>'💳 پرداخت آنلاین زیبال', 'callback_data'=>'reaction_pay_zibal_'.$order['id'] ]];
        if(function_exists('bot_simple_shop_method_enabled') && bot_simple_shop_method_enabled('card') && function_exists('bot_simple_shop_card_ready') && bot_simple_shop_card_ready()) $rows[]=[[ 'text'=>'🏦 کارت‌به‌کارت', 'callback_data'=>'reaction_pay_card_'.$order['id'] ]];
        $rows[]=[[ 'text'=>'🔙 برگشت', 'callback_data'=>'reaction_open' ]];
        return json_encode(['inline_keyboard'=>$rows], JSON_UNESCAPED_UNICODE);
    }
}
if(!function_exists('bot_reaction_pay_url_keyboard')){
    function bot_reaction_pay_url_keyboard($url, $orderId){
        return json_encode(['inline_keyboard'=>[
            [[ 'text'=>'💳 پرداخت در زیبال', 'url'=>$url ]],
            [[ 'text'=>'🔙 برگشت', 'callback_data'=>'reaction_payback_'.$orderId ]],
        ]], JSON_UNESCAPED_UNICODE);
    }
}
if(!function_exists('bot_reaction_card_text')){
    function bot_reaction_card_text(array $order){
        $c=function_exists('bot_simple_shop_card_settings') ? bot_simple_shop_card_settings() : ['number'=>'','holder'=>'','bank'=>''];
        return "🏦 <b>پرداخت کارت‌به‌کارت ری‌اکشن</b>\n\n".
            "🆔 سفارش: <code>".bot_reaction_html($order['id'])."</code>\n".
            "💰 مبلغ: <b>".bot_reaction_money((int)$order['amount'])."</b>\n".
            "📦 محصول: <b>".bot_reaction_html($order['product_title'])."</b> | تعداد: <b>".number_format((int)$order['qty'])."</b>\n\n".
            "💳 شماره کارت:\n<code>".bot_reaction_html($c['number']??'')."</code>\n".
            "👤 نام گیرنده: <b>".bot_reaction_html($c['holder']??'')."</b>\n".
            "🏛 بانک: <b>".bot_reaction_html($c['bank']??'')."</b>\n\n".
            "بعد از واریز، عکس رسید یا کد پیگیری را ارسال کنید.";
    }
}
if(!function_exists('bot_reaction_review_keyboard')){
    function bot_reaction_review_keyboard($id){ return json_encode(['inline_keyboard'=>[[['text'=>'✅ تأیید سفارش ری‌اکشن','callback_data'=>'reaction_card_approve_'.$id],['text'=>'❌ رد رسید','callback_data'=>'reaction_card_reject_'.$id]]]], JSON_UNESCAPED_UNICODE); }
}
if(!function_exists('bot_reaction_review_text')){
    function bot_reaction_review_text(array $o){
        return "🔥 <b>رسید کارت‌به‌کارت ری‌اکشن</b>\n\n".
            "🆔 سفارش: <code>".bot_reaction_html($o['id']??'')."</code>\n".
            "👤 کاربر: <code>".bot_reaction_html($o['user_id']??'')."</code>\n".
            "📦 محصول: <b>".bot_reaction_html($o['product_title']??'')."</b>\n".
            "🔢 تعداد: <b>".number_format((int)($o['qty']??0))."</b>\n".
            "💰 مبلغ: <b>".bot_reaction_money((int)($o['amount']??0))."</b>\n".
            "⏰ زمان: <code>".date('Y-m-d H:i:s',(int)($o['receipt_at']??time()))."</code>\n\n".
            "📎 رسید/کد پیگیری:\n<code>".bot_reaction_html($o['receipt_value']??'')."</code>";
    }
}
if(!function_exists('bot_reaction_notify_admins_receipt')){
    function bot_reaction_notify_admins_receipt(array $order){
        $txt=bot_reaction_review_text($order); $kb=bot_reaction_review_keyboard($order['id']);
        foreach(bot_reaction_admin_ids() as $aid){ @bot('sendMessage',['chat_id'=>$aid,'text'=>$txt,'parse_mode'=>'HTML','reply_markup'=>$kb]); }
        if(function_exists('bot_manual_receipt_channel_settings')){
            $s=bot_manual_receipt_channel_settings();
            if(($s['enabled']??'')==='✅فعال' && trim((string)($s['channel_id']??''))!=='') @bot('sendMessage',['chat_id'=>trim((string)$s['channel_id']),'text'=>$txt,'parse_mode'=>'HTML','reply_markup'=>$kb]);
        }
    }
}
if(!function_exists('bot_reaction_prompt_link')){
    function bot_reaction_prompt_link(array $order){
        $uid=(string)($order['user_id']??''); if($uid==='') return false;
        $u=bot_reaction_read_json("melat/$uid.json", []); if(!is_array($u)) $u=[];
        $u['step']='reaction_link_'.$order['id']; bot_reaction_write_json("melat/$uid.json", $u);
        return bot_reaction_send($uid,"✅ پرداخت سفارش ری‌اکشن تأیید شد.\n\nحالا لینک پست/پیام موردنظر را ارسال کنید.\n\nمثال: <code>https://t.me/channel/123</code>");
    }
}
if(!function_exists('bot_reaction_admin_order_text')){
    function bot_reaction_admin_order_text(array $o){
        return "🔥 <b>سفارش جدید ری‌اکشن</b>\n\n".
            "🆔 سفارش: <code>".bot_reaction_html($o['id']??'')."</code>\n".
            "👤 کاربر: <code>".bot_reaction_html($o['user_id']??'')."</code>\n".
            "📦 محصول: <b>".bot_reaction_html($o['product_title']??'')."</b>\n".
            "🔢 تعداد: <b>".number_format((int)($o['qty']??0))."</b>\n".
            "💰 مبلغ: <b>".bot_reaction_money((int)($o['amount']??0))."</b>\n".
            "💳 روش پرداخت: <b>".bot_reaction_html($o['method']??'')."</b>\n".
            "🔗 لینک:\n<code>".bot_reaction_html($o['target_link']??'')."</code>\n".
            "⏰ زمان ثبت لینک: <code>".date('Y-m-d H:i:s',(int)($o['link_at']??time()))."</code>";
    }
}
if(!function_exists('bot_reaction_notify_admins_order')){
    function bot_reaction_notify_admins_order(array $order){
        $txt=bot_reaction_admin_order_text($order);
        foreach(bot_reaction_admin_ids() as $aid){ @bot('sendMessage',['chat_id'=>$aid,'text'=>$txt,'parse_mode'=>'HTML']); }
        if(function_exists('bot_manual_receipt_channel_settings')){
            $s=bot_manual_receipt_channel_settings();
            if(($s['enabled']??'')==='✅فعال' && trim((string)($s['channel_id']??''))!=='') @bot('sendMessage',['chat_id'=>trim((string)$s['channel_id']),'text'=>$txt,'parse_mode'=>'HTML']);
        }
    }
}
if(!function_exists('bot_reaction_on_zibal_paid')){
    function bot_reaction_on_zibal_paid($trackId, array $payment, array $verify=[]){
        $meta=is_array($payment['meta']??null)?$payment['meta']:[];
        $id=(string)($meta['reaction_order_id']??'');
        if($id==='') return ['ok'=>false,'reason'=>'missing_reaction_order_id'];
        $order=bot_reaction_order_get($id);
        if(!$order) return ['ok'=>false,'reason'=>'order_not_found','id'=>$id];
        if(in_array((string)($order['status']??''), ['paid_waiting_link','submitted','done'], true)) return ['ok'=>true,'already'=>true,'id'=>$id];
        $order['status']='paid_waiting_link';
        $order['paid_at']=time();
        $order['trackId']=(string)$trackId;
        $order['verify']=$verify;
        bot_reaction_order_save($order);
        bot_reaction_prompt_link($order);
        return ['ok'=>true,'id'=>$id,'status'=>'paid_waiting_link'];
    }
}
if(!function_exists('bot_reaction_orders_list_text')){
    function bot_reaction_orders_list_text(){
        $orders=array_reverse(bot_reaction_orders_read(), true); $lines=["📋 <b>آخرین سفارش‌های ری‌اکشن</b>"]; $i=0;
        foreach($orders as $o){ if(!is_array($o)) continue; $i++; if($i>20) break; $lines[]="\n{$i}) <code>".bot_reaction_html($o['id']??'')."</code> — ".bot_reaction_html($o['status']??'')."\n👤 ".bot_reaction_html($o['user_id']??'')." | 📦 ".bot_reaction_html($o['product_title']??'')." | 🔢 ".(int)($o['qty']??0)."\n💰 ".bot_reaction_money((int)($o['amount']??0))."\n🔗 ".bot_reaction_html($o['target_link']??'ثبت نشده'); }
        if($i===0) $lines[]='هنوز سفارشی ثبت نشده است.';
        return implode("\n", $lines);
    }
}

if(!function_exists('bot_reaction_runtime_router')){
    function bot_reaction_runtime_router(){
        global $msg,$data,$chatID,$userID,$user,$step,$isAdmin,$Tc,$data_id,$msg_id,$Button_back_panel,$Button_Home;
        $text=trim((string)($msg??'')); $cb=isset($data)?(string)$data:'';
        $adminCardCallback = !empty($isAdmin) && preg_match('/^reaction_card_(approve|reject)_/', $cb);
        if((!isset($Tc) || (string)$Tc!=='private') && !$adminCardCallback) return false;
        if($text==='🔙 بازگشت' && preg_match('/^reaction_/', (string)($step??''))){
            if(is_array($user)){ $user['step']='none'; bot_reaction_write_json("melat/$userID.json", $user); }
            bot_reaction_send($chatID, 'به منوی اصلی برگشتی.', $Button_Home);
            return true;
        }
        $s=bot_reaction_settings();

        if($text==='🔥 خرید ری‌اکشن' || $text==='خرید ری اکشن' || $text==='خرید ری‌اکشن' || $cb==='reaction_open'){
            if($cb && !empty($data_id)) bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'ری‌اکشن','show_alert'=>false]);
            if($s['enabled']!=='✅فعال'){ bot_reaction_send($chatID,'❌ فروش ری‌اکشن فعلاً غیرفعال است.',$Button_Home); return true; }
            bot_reaction_send($chatID, bot_reaction_user_text(), bot_reaction_user_keyboard()); return true;
        }
        if($cb==='reaction_close'){
            if(!empty($data_id)) bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'بازگشت','show_alert'=>false]);
            bot_reaction_send($chatID,'به منوی اصلی برگشتی.',$Button_Home); return true;
        }
        if(!empty($isAdmin) && $cb==='reaction_admin'){
            if(!empty($data_id)) bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'ری‌اکشن','show_alert'=>false]);
            bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_reaction_admin_text(),'parse_mode'=>'HTML','reply_markup'=>bot_reaction_admin_keyboard()]); return true;
        }
        if(!empty($isAdmin) && $cb==='reaction_admin_toggle'){
            bot_reaction_save_settings(['enabled'=>($s['enabled']==='✅فعال'?'❌غیر فعال':'✅فعال')]);
            if(!empty($data_id)) bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'وضعیت تغییر کرد','show_alert'=>false]);
            bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_reaction_admin_text(),'parse_mode'=>'HTML','reply_markup'=>bot_reaction_admin_keyboard()]); return true;
        }
        if(!empty($isAdmin) && in_array($cb,['reaction_admin_min','reaction_admin_max'],true)){
            $user['step']=($cb==='reaction_admin_min'?'reaction_admin_min':'reaction_admin_max'); bot_reaction_write_json("melat/$userID.json", $user);
            if(!empty($data_id)) bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'عدد را ارسال کنید','show_alert'=>false]);
            bot_reaction_send($chatID,($cb==='reaction_admin_min'?'🔢 حداقل تعداد خرید را ارسال کنید.':'🔢 حداکثر تعداد خرید را ارسال کنید.'),$Button_back_panel); return true;
        }
        if(!empty($isAdmin) && in_array((string)($step??''), ['reaction_admin_min','reaction_admin_max'], true) && $text!==''){
            $n=bot_reaction_clean_int($text); if($n<=0){ bot_reaction_send($chatID,'❌ عدد معتبر نیست.',$Button_back_panel); return true; }
            $s=bot_reaction_settings();
            if((string)$step==='reaction_admin_min'){ $s['min_qty']=$n; if((int)$s['max_qty']<$n) $s['max_qty']=$n; }
            else { $s['max_qty']=max($n,(int)$s['min_qty']); }
            bot_reaction_write_json(bot_reaction_settings_path(), $s); $user['step']='none'; bot_reaction_write_json("melat/$userID.json", $user);
            bot_reaction_send($chatID,'✅ تنظیمات تعداد ذخیره شد.',bot_reaction_admin_keyboard()); return true;
        }
        if(!empty($isAdmin) && preg_match('/^reaction_admin_product_(\d+)$/',$cb,$m)){
            if(!empty($data_id)) bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'محصول','show_alert'=>false]);
            bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_reaction_product_admin_text((int)$m[1]),'parse_mode'=>'HTML','reply_markup'=>bot_reaction_product_admin_keyboard((int)$m[1])]); return true;
        }
        if(!empty($isAdmin) && preg_match('/^reaction_toggle_product_(\d+)$/',$cb,$m)){
            $id=(int)$m[1]; $s=bot_reaction_settings(); $cur=$s['products'][$id]['active']??'❌غیر فعال'; $s['products'][$id]['active']=($cur==='✅فعال'?'❌غیر فعال':'✅فعال'); bot_reaction_write_json(bot_reaction_settings_path(),$s);
            if(!empty($data_id)) bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'وضعیت تغییر کرد','show_alert'=>false]);
            bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_reaction_product_admin_text($id),'parse_mode'=>'HTML','reply_markup'=>bot_reaction_product_admin_keyboard($id)]); return true;
        }
        if(!empty($isAdmin) && preg_match('/^reaction_set_(title|emoji|price)_(\d+)$/',$cb,$m)){
            $field=$m[1]; $id=(int)$m[2]; $user['step']='reaction_set_'.$field.'_'.$id; bot_reaction_write_json("melat/$userID.json",$user);
            $label=$field==='title'?'نام محصول':($field==='emoji'?'ایموجی محصول':'قیمت هر عدد به ریال');
            if(!empty($data_id)) bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>$label.' را ارسال کنید','show_alert'=>false]);
            bot_reaction_send($chatID,"✏️ {$label} را ارسال کنید.",$Button_back_panel); return true;
        }
        if(!empty($isAdmin) && preg_match('/^reaction_set_(title|emoji|price)_(\d+)$/',(string)($step??''),$m) && $text!==''){
            $field=$m[1]; $id=(int)$m[2]; $s=bot_reaction_settings();
            if($field==='price'){ $n=bot_reaction_clean_int($text); if($n<=0){ bot_reaction_send($chatID,'❌ قیمت معتبر نیست.',$Button_back_panel); return true; } $s['products'][$id]['unit_price']=$n; }
            elseif($field==='title'){ $s['products'][$id]['title']=mb_substr($text,0,80,'UTF-8'); }
            else { $s['products'][$id]['emoji']=mb_substr($text,0,12,'UTF-8'); }
            bot_reaction_write_json(bot_reaction_settings_path(),$s); $user['step']='none'; bot_reaction_write_json("melat/$userID.json",$user);
            bot_reaction_send($chatID,'✅ محصول ذخیره شد.',bot_reaction_product_admin_keyboard($id)); return true;
        }
        if(!empty($isAdmin) && $cb==='reaction_admin_orders'){
            if(!empty($data_id)) bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'سفارش‌ها','show_alert'=>false]);
            bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_reaction_orders_list_text(),'parse_mode'=>'HTML','reply_markup'=>bot_reaction_admin_keyboard()]); return true;
        }

        if(preg_match('/^reaction_prod_(\d+)$/',$cb,$m)){
            $p=bot_reaction_product((int)$m[1]);
            if(!$p || $p['active']!=='✅فعال' || (int)$p['unit_price']<=0){ bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'محصول فعال نیست.','show_alert'=>true]); return true; }
            $user['step']='reaction_qty_'.$p['id']; bot_reaction_write_json("melat/$userID.json",$user);
            if(!empty($data_id)) bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'تعداد را ارسال کنید','show_alert'=>false]);
            bot_reaction_send($chatID,bot_reaction_quantity_text($p),bot_reaction_user_back_keyboard()); return true;
        }
        if(preg_match('/^reaction_qty_(\d+)$/',(string)($step??''),$m) && $text!==''){
            $p=bot_reaction_product((int)$m[1]); if(!$p || $p['active']!=='✅فعال'){ $user['step']='none'; bot_reaction_write_json("melat/$userID.json",$user); return false; }
            $qty=bot_reaction_clean_int($text); $s=bot_reaction_settings();
            if($qty<(int)$s['min_qty'] || $qty>(int)$s['max_qty']){ bot_reaction_send($chatID,"❌ تعداد باید بین <b>".(int)$s['min_qty']."</b> تا <b>".(int)$s['max_qty']."</b> باشد.",bot_reaction_user_back_keyboard()); return true; }
            $order=bot_reaction_new_order($userID,$p,$qty,'pending'); $user['step']='none'; bot_reaction_write_json("melat/$userID.json",$user);
            bot_reaction_send($chatID,bot_reaction_payment_text($order),bot_reaction_payment_keyboard($order)); return true;
        }
        if(preg_match('/^reaction_payback_(rx_[A-Za-z0-9_]+)$/',$cb,$m)){
            $order=bot_reaction_order_get($m[1]); if(!$order){ bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'سفارش پیدا نشد','show_alert'=>true]); return true; }
            bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_reaction_payment_text($order),'parse_mode'=>'HTML','reply_markup'=>bot_reaction_payment_keyboard($order)]); return true;
        }
        if(preg_match('/^reaction_pay_zibal_(rx_[A-Za-z0-9_]+)$/',$cb,$m)){
            if(!empty($data_id)) bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'ساخت لینک پرداخت','show_alert'=>false]);
            $order=bot_reaction_order_get($m[1]); if(!$order || (string)$order['user_id']!==(string)$userID){ bot_reaction_send($chatID,'❌ سفارش پیدا نشد.',bot_reaction_user_keyboard()); return true; }
            $order['method']='zibal'; $order['status']='awaiting_zibal'; bot_reaction_order_save($order);
            $res=function_exists('bot_zibal_request_payment') ? bot_zibal_request_payment($userID,(int)$order['amount'],'خرید ری‌اکشن: '.$order['product_title'].' تعداد '.$order['qty'],'','reaction',0,['reaction_order_id'=>$order['id'],'qty'=>$order['qty'],'product'=>$order['product_title']]) : ['ok'=>false,'error'=>'zibal_missing'];
            if(empty($res['ok'])){ $order['status']='failed_zibal_request'; $order['zibal_error']=$res; bot_reaction_order_save($order); bot_reaction_send($chatID,'❌ ساخت لینک پرداخت انجام نشد.\nکد خطا: <code>'.bot_reaction_html($res['error']??'unknown').'</code>',bot_reaction_payment_keyboard($order)); return true; }
            $order['trackId']=(string)($res['trackId']??$res['track_id']??''); $order['payment_url']=(string)($res['payment_url']??''); bot_reaction_order_save($order);
            bot_reaction_send($chatID,"💳 پرداخت ری‌اکشن\n\nمبلغ: <b>".bot_reaction_money((int)$order['amount'])."</b>\nبعد از پرداخت موفق، لینک پست/پیام را از شما می‌گیریم.",bot_reaction_pay_url_keyboard($order['payment_url'],$order['id'])); return true;
        }
        if(preg_match('/^reaction_pay_card_(rx_[A-Za-z0-9_]+)$/',$cb,$m)){
            if(!empty($data_id)) bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'کارت‌به‌کارت','show_alert'=>false]);
            $order=bot_reaction_order_get($m[1]); if(!$order || (string)$order['user_id']!==(string)$userID){ bot_reaction_send($chatID,'❌ سفارش پیدا نشد.',bot_reaction_user_keyboard()); return true; }
            if(!function_exists('bot_simple_shop_card_ready') || !bot_simple_shop_card_ready()){ bot_reaction_send($chatID,'❌ کارت‌به‌کارت هنوز تنظیم نشده است.',bot_reaction_payment_keyboard($order)); return true; }
            $order['method']='card'; $order['status']='awaiting_card_receipt'; bot_reaction_order_save($order);
            $u=bot_reaction_read_json("melat/$userID.json", []); if(!is_array($u))$u=[]; $u['step']='reaction_card_receipt_'.$order['id']; bot_reaction_write_json("melat/$userID.json",$u);
            bot_reaction_send($chatID,bot_reaction_card_text($order),bot_reaction_user_back_keyboard()); return true;
        }
        if(preg_match('/^reaction_card_receipt_(rx_[A-Za-z0-9_]+)$/',(string)($step??''),$m)){
            $id=$m[1]; $order=bot_reaction_order_get($id); if(!$order){ $user['step']='none'; bot_reaction_write_json("melat/$userID.json",$user); return false; }
            $receipt=$text;
            if(isset($GLOBALS['message']->photo) && is_array($GLOBALS['message']->photo)){ $last=end($GLOBALS['message']->photo); $receipt='photo:'.($last->file_id??''); }
            elseif(isset($GLOBALS['message']->document->file_id)){ $receipt='document:'.$GLOBALS['message']->document->file_id; }
            if(trim((string)$receipt)===''){ bot_reaction_send($chatID,'❌ رسید معتبر دریافت نشد. عکس رسید یا کد پیگیری را بفرست.',bot_reaction_user_back_keyboard()); return true; }
            $order['status']='awaiting_card_review'; $order['receipt_value']=(string)$receipt; $order['receipt_at']=time(); bot_reaction_order_save($order);
            $user['step']='none'; bot_reaction_write_json("melat/$userID.json",$user);
            bot_reaction_notify_admins_receipt($order);
            bot_reaction_send($chatID,'✅ رسید خرید ری‌اکشن ثبت شد و برای بررسی ادمین ارسال شد. بعد از تأیید، لینک پست/پیام را از شما می‌گیریم.',$Button_Home); return true;
        }
        if(!empty($isAdmin) && preg_match('/^reaction_card_(approve|reject)_(rx_[A-Za-z0-9_]+)$/',$cb,$m)){
            $act=$m[1]; $id=$m[2]; $order=bot_reaction_order_get($id);
            if(!$order){ if(!empty($data_id)) bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'سفارش پیدا نشد','show_alert'=>true]); return true; }
            if($act==='reject'){
                $order['status']='rejected'; $order['review_admin']=(string)$userID; $order['reviewed_at']=time(); bot_reaction_order_save($order);
                if(!empty($data_id)) bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'رد شد','show_alert'=>false]);
                @bot('sendMessage',['chat_id'=>$order['user_id'],'text'=>'❌ رسید خرید ری‌اکشن شما رد شد.']);
                bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_reaction_review_text($order).'\n\n❌ رد شد.','parse_mode'=>'HTML']); return true;
            }
            $order['status']='paid_waiting_link'; $order['paid_at']=time(); $order['review_admin']=(string)$userID; $order['reviewed_at']=time(); bot_reaction_order_save($order);
            if(function_exists('bot_payment_event_log_append')) bot_payment_event_log_append(['source'=>'reaction_card','id'=>'reaction_card_'.$id,'user_id'=>$order['user_id'],'amount'=>(int)$order['amount'],'reward_amount'=>0,'description'=>'خرید ری‌اکشن '.$order['product_title'].' تعداد '.$order['qty'],'type'=>'reaction','status'=>'paid','paid_at'=>time(),'raw_payment'=>$order]);
            bot_reaction_prompt_link($order);
            if(!empty($data_id)) bot('answercallbackquery',['callback_query_id'=>$data_id,'text'=>'تأیید شد','show_alert'=>false]);
            bot('editMessageText',['chat_id'=>$chatID,'message_id'=>$msg_id,'text'=>bot_reaction_review_text($order).'\n\n✅ تأیید شد و از کاربر لینک گرفته می‌شود.','parse_mode'=>'HTML']); return true;
        }
        if(preg_match('/^reaction_link_(rx_[A-Za-z0-9_]+)$/',(string)($step??''),$m) && $text!==''){
            $id=$m[1]; $order=bot_reaction_order_get($id);
            if(!$order || (string)($order['user_id']??'') !== (string)$userID){ $user['step']='none'; bot_reaction_write_json("melat/$userID.json",$user); return false; }
            $link=trim($text);
            if(!preg_match('~^(https?://|t\.me/|@)~i',$link)){
                bot_reaction_send($chatID,'❌ لینک معتبر نیست. لینک پست/پیام را ارسال کنید. مثال: <code>https://t.me/channel/123</code>',bot_reaction_user_back_keyboard()); return true;
            }
            $order['target_link']=$link; $order['status']='submitted'; $order['link_at']=time(); bot_reaction_order_save($order);
            $user['step']='none'; bot_reaction_write_json("melat/$userID.json",$user);
            bot_reaction_notify_admins_order($order);
            bot_reaction_send($chatID,"✅ سفارش ری‌اکشن شما ثبت شد و برای ادمین ارسال شد.\n\n🆔 سفارش: <code>".bot_reaction_html($order['id'])."</code>",$Button_Home); return true;
        }
        return false;
    }
}
