<?php
// ========================================
// ربات تلگرام حرفه‌ای مدیریت فروشگاه
// نسخه کامل با تمام قابلیت‌ها
// ========================================

class TelegramBot {
    private $token;
    private $chatId;
    private $apiUrl = 'https://api.telegram.org/bot';

    public function __construct($token = '', $chatId = '') {
        $this->token = $token ?: $this->getSetting('telegram_bot_token');
        $this->chatId = $chatId ?: $this->getSetting('telegram_admin_chat_id');
        $this->apiUrl .= $this->token . '/';
    }

    private function getSetting($key) {
        try {
            $db = Database::getInstance()->getConnection();
            $stmt = $db->prepare("SELECT setting_value FROM settings WHERE setting_key = ?");
            $stmt->execute([$key]);
            $result = $stmt->fetchColumn();
            return $result !== false ? $result : '';
        } catch(Exception $e) { return ''; }
    }

    private function setSetting($key, $value) {
        try {
            $db = Database::getInstance()->getConnection();
            $db->prepare("INSERT INTO settings (setting_key, setting_value, setting_type) VALUES (?, ?, 'text') ON DUPLICATE KEY UPDATE setting_value = ?")->execute([$key, $value, $value]);
        } catch(Exception $e) {}
    }

    private function getDb() { return Database::getInstance()->getConnection(); }

    // ========================================
    // API Helpers
    // ========================================
    public function sendMessage($text, $parseMode = 'HTML', $replyMarkup = null) {
        if (empty($this->token) || empty($this->chatId)) return false;
        $data = ['chat_id' => $this->chatId, 'text' => $text, 'parse_mode' => $parseMode, 'disable_web_page_preview' => true];
        if ($replyMarkup) $data['reply_markup'] = json_encode(['inline_keyboard' => $replyMarkup]);
        return $this->apiRequest('sendMessage', $data);
    }

    public function sendPhoto($path, $caption = '') {
        if (!file_exists($path)) return $this->sendMessage($caption);
        $ch = curl_init();
        curl_setopt_array($ch, [CURLOPT_URL => $this->apiUrl.'sendPhoto', CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => ['chat_id'=>$this->chatId, 'photo'=>new CURLFile(realpath($path)), 'caption'=>$caption, 'parse_mode'=>'HTML'],
            CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30]);
        $r = curl_exec($ch); curl_close($ch);
        return (json_decode($r,true)['ok']) ?? false;
    }

    public function editMessage($text, $msgId, $kb = null, $parseMode = 'HTML') {
        $d = ['chat_id'=>$this->chatId, 'message_id'=>$msgId, 'text'=>$text, 'parse_mode'=>$parseMode];
        if ($kb) $d['reply_markup'] = json_encode(['inline_keyboard'=>$kb]);
        return $this->apiRequest('editMessageText', $d);
    }

    public function answerCallback($id, $text = '') {
        return $this->apiRequest('answerCallbackQuery', ['callback_query_id'=>$id, 'text'=>$text]);
    }

    private function apiRequest($method, $data = []) {
        $ch = curl_init();
        curl_setopt_array($ch, [CURLOPT_URL=>$this->apiUrl.$method, CURLOPT_POST=>true,
            CURLOPT_POSTFIELDS=>json_encode($data), CURLOPT_HTTPHEADER=>['Content-Type: application/json'],
            CURLOPT_RETURNTRANSFER=>true, CURLOPT_TIMEOUT=>15]);
        $r = curl_exec($ch); curl_close($ch);
        return (json_decode($r,true)['ok']) ?? false;
    }

    public function setWebhook($url) {
        return $this->apiRequest('setWebhook', ['url'=>$url, 'allowed_updates'=>['message','callback_query'], 'drop_pending_updates'=>true]);
    }
    public function isConfigured() { return !empty($this->token) && !empty($this->chatId); }

    // ========================================
    // State Machine Helper
    // ========================================
    private function setState($state, $data = []) {
        $this->setSetting('tg_bot_state', $state);
        $this->setSetting('tg_bot_state_data', json_encode($data));
    }
    private function getState() {
        return [
            'state' => $this->getSetting('tg_bot_state'),
            'data' => json_decode($this->getSetting('tg_bot_state_data') ?: '{}', true)
        ];
    }
    private function clearState() { $this->setState(''); }

    // ========================================
    // منوی اصلی
    // ========================================
    private function mainMenu() {
        $db = $this->getDb();
        $today = date('Y-m-d');
        $p = $db->prepare("SELECT COALESCE(SUM(final_amount),0) FROM orders WHERE status!='cancelled' AND DATE(created_at)=?");
        $p->execute([$today]); $rev = $p->fetchColumn();
        $p = $db->prepare("SELECT COUNT(*) FROM orders WHERE DATE(created_at)=?");
        $p->execute([$today]); $ord = $p->fetchColumn();
        $pend = $db->query("SELECT COUNT(*) FROM orders WHERE status IN ('pending','processing')")->fetchColumn();
        $unread = $db->query("SELECT COUNT(*) FROM messages WHERE status='unread'")->fetchColumn();

        $t = "━━━━━━━━━━━━━━━━━━━━━━\n👑 <b>پنل مدیریت کیف‌لند</b>\n━━━━━━━━━━━━━━━━━━━━━━\n\n";
        $t .= "💰 فروش امروز: <b>".number_format($rev)."</b> ت\n";
        $t .= "📦 سفارشات: <b>{$ord}</b> | ⏳ <b>{$pend}</b> در انتظار\n";
        $t .= "💬 پیام: <b>{$unread}</b> خوانده‌نشده\n";
        $t .= "📅 ".date('Y/m/d H:i')."\n━━━━━━━━━━━━━━━━━━━━━━";

        $kb = [
            [['text'=>'📊 آمار','callback_data'=>'adm_stats'],['text'=>'📦 سفارشات','callback_data'=>'adm_orders']],
            [['text'=>'🎒 مدیریت محصول','callback_data'=>'adm_prod_menu'],['text'=>'👤 مدیریت کاربر','callback_data'=>'adm_user_menu']],
            [['text'=>'💬 پیام‌ها','callback_data'=>'adm_messages'],['text'=>'🔔 هشدارها','callback_data'=>'adm_alerts']],
            [['text'=>'💳 کیف پول و کارت','callback_data'=>'adm_wallet_menu'],['text'=>'📨 پیام به کاربر','callback_data'=>'adm_sendmsg_start']],
            [['text'=>'🔄 بروزرسانی','callback_data'=>'adm_refresh']]
        ];
        return ['text'=>$t, 'keyboard'=>$kb];
    }

    // ========================================
    // Webhook Handler
    // ========================================
    public function handleWebhook($update) {
        if (isset($update['callback_query'])) { $this->handleCallback($update['callback_query']); return; }
        if (!isset($update['message'])) return;
        $msg = $update['message'];
        $chatId = $msg['chat']['id'];
        $text = $msg['text'] ?? '';
        if ($chatId != $this->chatId) return;

        ['state'=>$state, 'data'=>$data] = $this->getState();

        // اگر state فعال باشه و متن /cancel نباشه
        if ($state && $text !== '/start' && $text !== '/menu' && $text !== '/cancel') {
            $this->handleState($text, $state, $data);
            return;
        }

        if ($text === '/cancel') { $this->clearState(); $this->sendMessage("❌ لغو شد."); $m=$this->mainMenu(); $this->sendMessage($m['text'],'HTML',$m['keyboard']); return; }

        $cmds = ['/start'=>'cmdStart','/menu'=>'cmdStart','/help'=>'cmdHelp','/orders'=>'cmdOrders','/stats'=>'cmdStats','/products'=>'cmdProducts','/users'=>'cmdUsers','/messages'=>'cmdMessages'];
        $cmd = strtolower(explode(' ',$text)[0]);
        if (isset($cmds[$cmd])) $this->{$cmds[$cmd]}();
        else { $m=$this->mainMenu(); $this->sendMessage($m['text'],'HTML',$m['keyboard']); }
    }

    // ========================================
    // State Handler (ورودی چندمرحله‌ای)
    // ========================================
    private function handleState($text, $state, $data) {
        $db = $this->getDb();

        // ---- افزودن محصول ----
        if ($state === 'addprod_name') {
            $data['name'] = $text; $this->setState('addprod_price', $data);
            $this->sendMessage("💰 قیمت (تومان):\n✏️ {$data['name']}\n📝 /cancel");
        } elseif ($state === 'addprod_price') {
            $price = (int)preg_replace('/[^0-9]/','',$text);
            if ($price < 1000) { $this->sendMessage("❌ قیمت نامعتبر."); return; }
            $data['price'] = $price; $this->setState('addprod_stock', $data);
            $this->sendMessage("📦 موجودی:\n✏️ {$data['name']} | 💰 ".number_format($price)." ت\n📝 /cancel");
        } elseif ($state === 'addprod_stock') {
            $data['stock'] = (int)$text; $this->setState('addprod_cat', $data);
            $cats = $db->query("SELECT id,name FROM categories WHERE is_active=1 ORDER BY sort_order")->fetchAll();
            $kb = []; foreach (array_chunk($cats,2) as $ch) { $r=[]; foreach($ch as $c) $r[]=['text'=>$c['name'],"callback_data"=>"apcat_{$c['id']}"]; $kb[]=$r; }
            $this->sendMessage("📂 دسته‌بندی:\n✏️ {$data['name']} | 💰 ".number_format($data['price'])." ت | 📦 {$data['stock']}",'HTML',$kb);
        }

        // ---- ویرایش محصول ----
        elseif ($state === 'editprod_field') {
            $field = $text;
            if (!in_array($field, ['name','price','stock','discount_price','is_active'])) { $this->sendMessage("❌ فیلد نامعتبر. مقدار صحیح را وارد کنید."); return; }
            $data['field'] = $field; $this->setState('editprod_value', $data);
            $this->sendMessage("📝 مقدار جدید <b>{$field}</b> را وارد کنید:\n📝 /cancel");
        } elseif ($state === 'editprod_value') {
            $pid = $data['product_id']; $field = $data['field'];
            $val = in_array($field, ['name']) ? $text : (int)preg_replace('/[^0-9]/','',$text);
            $db->prepare("UPDATE products SET {$field}=?, updated_at=NOW() WHERE id=?")->execute([$val, $pid]);
            $this->clearState();
            $this->sendMessage("✅ محصول #{$pid} بروزرسانی شد.\n📋 {$field} = {$val}");
            $this->showProducts();
        }

        // ---- حذف محصول ----
        elseif ($state === 'delprod_confirm') {
            if (strtolower($text) === 'بله' || $text === 'bale') {
                $pid = $data['product_id'];
                $db->prepare("UPDATE products SET is_active=0 WHERE id=?")->execute([$pid]);
                $this->clearState();
                $this->sendMessage("✅ محصول #{$pid} غیرفعال شد.");
                $this->showProducts();
            } else { $this->clearState(); $this->sendMessage("❌ حذف لغو شد."); }
        }

        // ---- تخفیف محصول ----
        elseif ($state === 'discount_value') {
            $pid = $data['product_id'];
            $price = $db->prepare("SELECT price FROM products WHERE id=?"); $price->execute([$pid]); $price = $price->fetchColumn();
            $discount = (int)preg_replace('/[^0-9]/','',$text);
            if ($discount <= 0 || $discount >= $price) { $this->sendMessage("❌ درصد تخفیف نامعتبر."); return; }
            $newPrice = $price - $discount;
            $db->prepare("UPDATE products SET discount_price=?, updated_at=NOW() WHERE id=?")->execute([$newPrice, $pid]);
            $this->clearState();
            $this->sendMessage("✅ تخفیف اعمال شد!\n💰 قیمت اصلی: ".number_format($price)." ت\n🎁 قیمت جدید: ".number_format($newPrice)." ت\n📉 تخفیف: ".number_format($discount)." ت");
            $this->showProducts();
        }

        // ---- افزودن کاربر ----
        elseif ($state === 'adduser_name') {
            $data['full_name'] = $text; $this->setState('adduser_email', $data);
            $this->sendMessage("📧 ایمیل کاربر:\n👤 {$data['full_name']}\n📝 /cancel");
        } elseif ($state === 'adduser_email') {
            if (!filter_var($text, FILTER_VALIDATE_EMAIL)) { $this->sendMessage("❌ ایمیل نامعتبر."); return; }
            $data['email'] = $text; $this->setState('adduser_pass', $data);
            $this->sendMessage("🔑 رمز عبور (حداقل ۸ کاراکتر):\n👤 {$data['full_name']} | 📧 {$text}\n📝 /cancel");
        } elseif ($state === 'adduser_pass') {
            if (strlen($text) < 8) { $this->sendMessage("❌ رمز باید حداقل ۸ کاراکتر باشد."); return; }
            $data['password'] = $text; $this->setState('adduser_role', $data);
            $kb = [[['text'=>'👤 کاربر عادی','callback_data'=>'aurole_user'],['text'=>'⚙️ ادمین','callback_data'=>'aurole_admin']]];
            $this->sendMessage("نقش کاربر:\n👤 {$data['full_name']} | 📧 {$data['email']}",'HTML',$kb);
        }

        // ---- ویرایش کاربر ----
        elseif ($state === 'edituser_field') {
            $field = $text;
            if (!in_array($field, ['full_name','email','phone','role'])) { $this->sendMessage("❌ فیلد نامعتبر."); return; }
            $data['field'] = $field; $this->setState('edituser_value', $data);
            $this->sendMessage("📝 مقدار جدید <b>{$field}</b> را وارد کنید:\n📝 /cancel");
        } elseif ($state === 'edituser_value') {
            $uid = $data['user_id']; $field = $data['field'];
            $val = in_array($field, ['full_name','email','phone']) ? $text : $text;
            $db->prepare("UPDATE users SET {$field}=?, updated_at=NOW() WHERE id=?")->execute([$val, $uid]);
            $this->clearState();
            $this->sendMessage("✅ کاربر #{$uid} بروزرسانی شد.\n📋 {$field} = {$val}");
            $this->showUsers();
        }

        // ---- ارسال پیام به کاربر ----
        elseif ($state === 'sendmsg_uid') {
            if (!is_numeric($text)) { $this->sendMessage("❌ شناسه نامعتبر."); return; }
            $data['user_id'] = (int)$text; $this->setState('sendmsg_text', $data);
            $u = $db->prepare("SELECT full_name,email FROM users WHERE id=?"); $u->execute([$data['user_id']]); $u = $u->fetch();
            $this->sendMessage("💬 متن پیام برای <b>".($u['full_name']??'نامشخص')."</b>:\n📝 /cancel");
        } elseif ($state === 'sendmsg_text') {
            $u = $db->prepare("SELECT full_name,email FROM users WHERE id=?"); $u->execute([$data['user_id']]); $u = $u->fetch();
            if ($u) {
                @mail($u['email'], "پاسخ پشتیبانی کیف‌لند", "<p>".nl2br(htmlspecialchars($text))."</p>", "Content-Type: text/html; charset=UTF-8\r\nFrom: no-reply@".$_SERVER['HTTP_HOST']);
                $this->clearState(); $this->sendMessage("✅ پیام برای <b>{$u['full_name']}</b> ارسال شد.");
            } else { $this->clearState(); $this->sendMessage("❌ کاربر یافت نشد."); }
            $m=$this->mainMenu(); $this->sendMessage($m['text'],'HTML',$m['keyboard']);
        }

        // ---- تعویض شماره کارت ----
        elseif ($state === 'change_card') {
            $card = preg_replace('/[^0-9]/','',$text);
            if (strlen($card) < 16) { $this->sendMessage("❌ شماره کارت نامعتبر (حداقل ۱۶ رقم)."); return; }
            $this->setSetting('card_number', $card);
            $this->clearState();
            $this->sendMessage("✅ شماره کارت بروزرسانی شد:\n💳 <code>{$card}</code>");
            $this->showWalletMenu();
        }

        // ---- شارژ کیف پول ----
        elseif ($state === 'wallet_charge') {
            $parts = explode(' ', $text);
            $uid = (int)($parts[0] ?? 0);
            $amount = (int)preg_replace('/[^0-9]/','', $parts[1] ?? 0);
            if ($uid <= 0 || $amount <= 0) { $this->sendMessage("❌ فرمت: <شناسه_کاربر> <مبلغ>\nمثال: 1 50000"); return; }
            $u = $db->prepare("SELECT full_name,wallet_balance FROM users WHERE id=?"); $u->execute([$uid]); $u = $u->fetch();
            if (!$u) { $this->sendMessage("❌ کاربر یافت نشد."); return; }
            $newBal = $u['wallet_balance'] + $amount;
            $db->prepare("UPDATE users SET wallet_balance=? WHERE id=?")->execute([$newBal, $uid]);
            $db->prepare("INSERT INTO wallet_transactions (user_id,type,amount,balance_after,description,status,created_at) VALUES (?,'admin_charge',?,?,?,'success',NOW())")
               ->execute([$uid, $amount, $newBal, "شارژ توسط ادمین"]);
            $this->clearState();
            $this->sendMessage("✅ کیف پول <b>{$u['full_name']}</b> شارژ شد.\n💰 مبلغ: ".number_format($amount)." ت\n📊 موجودی جدید: ".number_format($newBal)." ت");
            $this->showWalletMenu();
        }

        // ---- برداشت کیف پول ----
        elseif ($state === 'wallet_withdraw') {
            $parts = explode(' ', $text);
            $uid = (int)($parts[0] ?? 0);
            $amount = (int)preg_replace('/[^0-9]/','', $parts[1] ?? 0);
            if ($uid <= 0 || $amount <= 0) { $this->sendMessage("❌ فرمت: <شناسه_کاربر> <مبلغ>"); return; }
            $u = $db->prepare("SELECT full_name,wallet_balance FROM users WHERE id=?"); $u->execute([$uid]); $u = $u->fetch();
            if (!$u) { $this->sendMessage("❌ کاربر یافت نشد."); return; }
            if ($u['wallet_balance'] < $amount) { $this->sendMessage("❌ موجودی ناکافی.\n📊 فعلی: ".number_format($u['wallet_balance'])." ت"); return; }
            $newBal = $u['wallet_balance'] - $amount;
            $db->prepare("UPDATE users SET wallet_balance=? WHERE id=?")->execute([$newBal, $uid]);
            $db->prepare("INSERT INTO wallet_transactions (user_id,type,amount,balance_after,description,status,created_at) VALUES (?,'admin_withdraw',?,?,?,'success',NOW())")
               ->execute([$uid, $amount, $newBal, "برداشت توسط ادمین"]);
            $this->clearState();
            $this->sendMessage("✅ از کیف پول <b>{$u['full_name']}</b> برداشت شد.\n💰 مبلغ: ".number_format($amount)." ت\n📊 موجودی جدید: ".number_format($newBal)." ت");
            $this->showWalletMenu();
        }
    }

    // ========================================
    // دستورات
    // ========================================
    private function cmdStart() { $m=$this->mainMenu(); $this->sendMessage($m['text'],'HTML',$m['keyboard']); }
    private function cmdHelp() {
        $t = "📖 <b>راهنما</b>\n\n";
        $t .= "🔮 /menu - منوی اصلی\n📦 /orders - سفارشات\n📊 /stats - آمار\n";
        $t .= "🎒 /products - محصولات\n👤 /users - کاربران\n💬 /messages - پیام‌ها\n\n";
        $t .= "🔔 اعلان خودکار: سفارش • وضعیت • پیام • موجودی";
        $this->sendMessage($t,'HTML',[[['text'=>'🏠 منو','callback_data'=>'adm_refresh']]]);
    }
    private function cmdOrders() { $this->showOrders(); }
    private function cmdStats() { $this->showStats(); }
    private function cmdProducts() { $this->showProducts(); }
    private function cmdUsers() { $this->showUsers(); }
    private function cmdMessages() { $this->showMessages(); }

    // ========================================
    // منوی مدیریت محصول
    // ========================================
    private function showProdMenu($editId = null) {
        $t = "🎒 <b>مدیریت محصولات</b>\n━━━━━━━━━━━━━━━━━━━━━━\n\nیکی از گزینه‌ها را انتخاب کنید:";
        $kb = [
            [['text'=>'📦 لیست محصولات','callback_data'=>'adm_products'],['text'=>'➕ افزودن محصول','callback_data'=>'adm_addprod_start']],
            [['text'=>'✏️ ویرایش محصول','callback_data'=>'adm_editprod_start'],['text'=>'🗑️ حذف محصول','callback_data'=>'adm_delprod_start']],
            [['text'=>'🎁 تخفیف محصول','callback_data'=>'adm_discount_start']],
            [['text'=>'🏠 منو','callback_data'=>'adm_refresh']]
        ];
        if ($editId) $this->editMessage($t,$editId,$kb); else $this->sendMessage($t,'HTML',$kb);
    }

    // ========================================
    // منوی مدیریت کاربر
    // ========================================
    private function showUserMenu($editId = null) {
        $t = "👤 <b>مدیریت کاربران</b>\n━━━━━━━━━━━━━━━━━━━━━━\n\nیکی از گزینه‌ها را انتخاب کنید:";
        $kb = [
            [['text'=>'📋 لیست کاربران','callback_data'=>'adm_users'],['text'=>'➕ افزودن کاربر','callback_data'=>'adm_adduser_start']],
            [['text'=>'✏️ ویرایش کاربر','callback_data'=>'adm_edituser_start'],['text'=>'🗑️ حذف/تعلیق','callback_data'=>'adm_deluser_start']],
            [['text'=>'🏠 منو','callback_data'=>'adm_refresh']]
        ];
        if ($editId) $this->editMessage($t,$editId,$kb); else $this->sendMessage($t,'HTML',$kb);
    }

    // ========================================
    // منوی کیف پول و کارت
    // ========================================
    private function showWalletMenu($editId = null) {
        $db = $this->getDb();
        $card = $this->getSetting('card_number') ?: 'ثبت نشده';
        $cardOwner = $this->getSetting('card_owner') ?: '-';
        $bank = $this->getSetting('card_bank') ?: '-';

        $t = "💳 <b>کیف پول و کارت بانکی</b>\n━━━━━━━━━━━━━━━━━━━━━━\n\n";
        $t .= "🏦 <b>کارت فعلی:</b>\n";
        $t .= "💳 <code>{$card}</code>\n";
        $t .= "👤 صاحب: {$cardOwner}\n";
        $t .= "🏦 بانک: {$bank}\n\n";
        $t .= "عملیات مورد نظر را انتخاب کنید:";

        $kb = [
            [['text'=>'💳 تعویض شماره کارت','callback_data'=>'adm_change_card']],
            [['text'=>'💰 شارژ کیف پول','callback_data'=>'adm_wallet_charge'],['text'=>'💸 برداشت','callback_data'=>'adm_wallet_withdraw']],
            [['text'=>'📊 لیست تراکنش‌ها','callback_data'=>'adm_wallet_txns']],
            [['text'=>'🏠 منو','callback_data'=>'adm_refresh']]
        ];
        if ($editId) $this->editMessage($t,$editId,$kb); else $this->sendMessage($t,'HTML',$kb);
    }

    // ========================================
    // نمایش سفارشات
    // ========================================
    private function showOrders($editId = null) {
        $db = $this->getDb();
        $orders = $db->query("SELECT o.id,o.order_number,o.final_amount,o.status,o.created_at,o.payment_status,u.full_name FROM orders o LEFT JOIN users u ON o.user_id=u.id ORDER BY o.created_at DESC LIMIT 8")->fetchAll();
        $t = "📦 <b>آخرین سفارشات</b>\n━━━━━━━━━━━━━━━━━━━━━━\n\n";
        $kb = [];
        if (!$orders) { $t .= "📭 نیست.\n"; }
        else {
            foreach ($orders as $o) {
                $e = match($o['status']){'pending'=>'🟡','processing'=>'🔵','shipped'=>'🚚','delivered'=>'✅','cancelled'=>'❌',default=>'⚪'};
                $t .= "{$e} <code>{$o['order_number']}</code> | {$o['full_name']}\n   💰 ".number_format($o['final_amount'])." ت | 📅 ".date('m/d H:i',strtotime($o['created_at']))."\n\n";
                $kb[] = [['text'=>"🔍 #{$o['order_number']}",'callback_data'=>"adm_order_{$o['id']}"]];
            }
        }
        $kb[] = [['text'=>'🔄 بروزرسانی','callback_data'=>'adm_orders']]; $kb[] = [['text'=>'🏠 منو','callback_data'=>'adm_refresh']];
        if ($editId) $this->editMessage($t,$editId,$kb); else $this->sendMessage($t,'HTML',$kb);
    }

    // ========================================
    // جزئیات سفارش + تغییر وضعیت
    // ========================================
    private function showOrderDetail($oid, $editId) {
        $db = $this->getDb();
        $o = $db->prepare("SELECT o.*,u.full_name,u.email FROM orders o LEFT JOIN users u ON o.user_id=u.id WHERE o.id=?");
        $o->execute([$oid]); $o = $o->fetch();
        if (!$o) { $this->editMessage("❌ یافت نشد.",$editId,[[['text'=>'🏠','callback_data'=>'adm_orders']]]); return; }

        $items = $db->prepare("SELECT * FROM order_items WHERE order_id=?"); $items->execute([$oid]); $items = $items->fetchAll();
        $e = match($o['status']){'pending'=>'🟡','processing'=>'🔵','shipped'=>'🚚','delivered'=>'✅','cancelled'=>'❌',default=>'⚪'};

        $t = "🔍 <b>#{$o['order_number']}</b>\n━━━━━━━━━━━━━━━━━━━━━━\n\n";
        $t .= "📊 {$e} <b>{$o['status']}</b> | 💳 {$o['payment_status']}\n";
        $t .= "👤 {$o['full_name']} | 📧 {$o['email']}\n📞 {$o['shipping_phone']}\n";
        $t .= "💰 <b>".number_format($o['final_amount'])." ت</b>\n📅 ".date('Y/m/d H:i',strtotime($o['created_at']))."\n\n";
        if ($items) { $t .= "🛒 <b>محصولات:</b>\n"; foreach($items as $i) $t .= "  • {$i['product_name']} × {$i['quantity']} = ".number_format($i['subtotal'])." ت\n"; }

        $statuses = ['pending'=>'🟡 انتظار','processing'=>'🔵 پردازش','shipped'=>'🚚 ارسال','delivered'=>'✅ تحویل','cancelled'=>'❌ لغو'];
        $kb = []; $row = [];
        foreach ($statuses as $s=>$l) { $row[]=['text'=>$l,"callback_data"=>"adm_setstatus_{$oid}_{$s}"]; if(count($row)===2){$kb[]=$row;$row=[];} }
        if($row) $kb[]=$row; $kb[]=[['text'=>'🔙 بازگشت','callback_data'=>'adm_orders']];
        $this->editMessage($t,$editId,$kb);
    }

    private function setOrderStatus($oid,$status) {
        $db = $this->getDb();
        $db->prepare("UPDATE orders SET status=?,updated_at=NOW() WHERE id=?")->execute([$status,$oid]);
        $o = $db->prepare("SELECT order_number,full_name FROM orders o LEFT JOIN users u ON o.user_id=u.id WHERE o.id=?"); $o->execute([$oid]); $o=$o->fetch();
        $st = match($status){'pending'=>'انتظار','processing'=>'پردازش','shipped'=>'ارسال','delivered'=>'تحویل','cancelled'=>'لغو'};
        $this->sendMessage("✅ #{$o['order_number']} → <b>{$st}</b>\n👤 {$o['full_name']}");
        $this->showOrders();
    }

    // ========================================
    // آمار
    // ========================================
    private function showStats($editId=null) {
        $db=$this->getDb(); $today=date('Y-m-d');
        $p=$db->prepare("SELECT COALESCE(SUM(final_amount),0) FROM orders WHERE status!='cancelled' AND DATE(created_at)=?"); $p->execute([$today]); $todayRev=$p->fetchColumn();
        $p=$db->prepare("SELECT COUNT(*) FROM orders WHERE DATE(created_at)=?"); $p->execute([$today]); $todayOrd=$p->fetchColumn();
        $total=$db->query("SELECT COALESCE(SUM(final_amount),0) FROM orders WHERE status!='cancelled'")->fetchColumn();
        $users=$db->query("SELECT COUNT(*) FROM users WHERE role='user' AND is_active=1")->fetchColumn();
        $prods=$db->query("SELECT COUNT(*) FROM products WHERE is_active=1")->fetchColumn();
        $pend=$db->query("SELECT COUNT(*) FROM orders WHERE status IN ('pending','processing')")->fetchColumn();

        $t = "📊 <b>آمار فروشگاه</b>\n━━━━━━━━━━━━━━━━━━━━━━\n\n";
        $t .= "💰 امروز: <b>".number_format($todayRev)." ت</b>\n📦 سفارشات: <b>{$todayOrd}</b> | ⏳ <b>{$pend}</b>\n";
        $t .= "💰 کل: <b>".number_format($total)." ت</b>\n👥 کاربران: <b>{$users}</b> | 🎒 محصولات: <b>{$prods}</b>\n━━━━━━━━━━━━━━━━━━━━━━";
        $kb = [[['text'=>'🔄 بروزرسانی','callback_data'=>'adm_stats']],[['text'=>'🏠 منو','callback_data'=>'adm_refresh']]];
        if($editId) $this->editMessage($t,$editId,$kb); else $this->sendMessage($t,'HTML',$kb);
    }

    // ========================================
    // محصولات
    // ========================================
    private function showProducts($editId=null) {
        $db=$this->getDb();
        $prods=$db->query("SELECT id,name,price,stock,sales_count,discount_price FROM products WHERE is_active=1 ORDER BY sales_count DESC LIMIT 8")->fetchAll();
        $t = "🎒 <b>محصولات</b>\n━━━━━━━━━━━━━━━━━━━━━━\n\n";
        $kb = [];
        if (!$prods) { $t .= "📭 نیست.\n"; }
        else {
            foreach($prods as $i=>$p) {
                $se=$p['stock']<=0?'🔴':($p['stock']<=5?'🟡':'🟢');
                $disc = $p['discount_price'] ? " | 🎁 ".number_format($p['discount_price'])." ت" : "";
                $t .= ($i+1).". {$p['name']}\n   🛒 {$p['sales_count']} فروش | 💰 ".number_format($p['price'])." ت{$disc} | {$se} {$p['stock']}\n\n";
            }
        }
        $kb[]=[['text'=>'➕ افزودن','callback_data'=>'adm_addprod_start'],['text'=>'✏️ ویرایش','callback_data'=>'adm_editprod_start']];
        $kb[]=[['text'=>'🗑️ حذف','callback_data'=>'adm_delprod_start'],['text'=>'🎁 تخفیف','callback_data'=>'adm_discount_start']];
        $kb[]=[['text'=>'🔄 بروزرسانی','callback_data'=>'adm_products']]; $kb[]=[['text'=>'🏠 منو','callback_data'=>'adm_refresh']];
        if($editId) $this->editMessage($t,$editId,$kb); else $this->sendMessage($t,'HTML',$kb);
    }

    // ========================================
    // کاربران
    // ========================================
    private function showUsers($editId=null) {
        $db=$this->getDb();
        $users=$db->query("SELECT u.id,u.full_name,u.email,u.role,u.is_active,u.wallet_balance,COUNT(o.id) as orders,SUM(o.final_amount) as spent FROM users u LEFT JOIN orders o ON u.id=o.user_id GROUP BY u.id ORDER BY spent DESC LIMIT 8")->fetchAll();
        $t = "👥 <b>کاربران</b>\n━━━━━━━━━━━━━━━━━━━━━━\n\n";
        if (!$users) { $t .= "📭 نیست.\n"; }
        else {
            foreach($users as $i=>$u) {
                $status = $u['is_active'] ? '🟢' : '🔴';
                $role = $u['role']==='admin'?'⚙️':'👤';
                $t .= "{$status}{$role} #{$u['id']} {$u['full_name']}\n   📧 {$u['email']}\n   🛒 {$u['orders']} سفارش | 💰 ".number_format($u['spent']??0)." ت | 💳 ".number_format($u['wallet_balance']??0)." ت\n\n";
            }
        }
        $kb = [[['text'=>'➕ افزودن','callback_data'=>'adm_adduser_start'],['text'=>'✏️ ویرایش','callback_data'=>'adm_edituser_start']],[['text'=>'🔄 بروزرسانی','callback_data'=>'adm_users']],[['text'=>'🏠 منو','callback_data'=>'adm_refresh']]];
        if($editId) $this->editMessage($t,$editId,$kb); else $this->sendMessage($t,'HTML',$kb);
    }

    // ========================================
    // پیام‌ها
    // ========================================
    private function showMessages($editId=null) {
        $db=$this->getDb();
        $msgs=$db->query("SELECT m.*,u.full_name FROM messages m LEFT JOIN users u ON m.user_id=u.id ORDER BY m.created_at DESC LIMIT 6")->fetchAll();
        $unread=$db->query("SELECT COUNT(*) FROM messages WHERE status='unread'")->fetchColumn();
        $t = "💬 <b>پیام‌ها</b>\n━━━━━━━━━━━━━━━━━━━━━━\n📬 خوانده‌نشده: <b>{$unread}</b>\n\n";
        if (!$msgs) { $t .= "📭 نیست.\n"; }
        else {
            foreach($msgs as $m) {
                $se=match($m['status']){'unread'=>'📩','read'=>'📭','replied'=>'✅','archived'=>'📁'};
                $t .= "{$se} <b>{$m['subject']}</b>\n   👤 {$m['name']} | 📅 ".date('m/d H:i',strtotime($m['created_at']))."\n   💬 ".mb_substr($m['message'],0,50).(mb_strlen($m['message'])>50?'...':'')."\n\n";
            }
        }
        $kb = [[['text'=>'📨 پیام به کاربر','callback_data'=>'adm_sendmsg_start']],[['text'=>'🔄 بروزرسانی','callback_data'=>'adm_messages']],[['text'=>'🏠 منو','callback_data'=>'adm_refresh']]];
        if($editId) $this->editMessage($t,$editId,$kb); else $this->sendMessage($t,'HTML',$kb);
    }

    // ========================================
    // هشدارها
    // ========================================
    private function showAlerts($editId=null) {
        $db=$this->getDb();
        $out=$db->query("SELECT COUNT(*) FROM products WHERE stock=0 AND is_active=1")->fetchColumn();
        $low=$db->query("SELECT COUNT(*) FROM products WHERE stock<5 AND stock>0 AND is_active=1")->fetchColumn();
        $pend=$db->query("SELECT COUNT(*) FROM orders WHERE status IN ('pending','processing')")->fetchColumn();
        $unread=$db->query("SELECT COUNT(*) FROM messages WHERE status='unread'")->fetchColumn();
        $t = "🔔 <b>هشدارها</b>\n━━━━━━━━━━━━━━━━━━━━━━\n\n";
        $has=false;
        if($out>0){$t.="🔴 <b>{$out}</b> ناموجود\n";$has=true;}
        if($low>0){$t.="🟡 <b>{$low}</b> بحرانی\n";$has=true;}
        if($pend>0){$t.="⏳ <b>{$pend}</b> در انتظار\n";$has=true;}
        if($unread>0){$t.="💬 <b>{$unread}</b> پیام\n";$has=true;}
        if(!$has) $t.="✅ همه عادی.\n";
        $kb = [[['text'=>'🔄 بروزرسانی','callback_data'=>'adm_alerts']],[['text'=>'🏠 منو','callback_data'=>'adm_refresh']]];
        if($editId) $this->editMessage($t,$editId,$kb); else $this->sendMessage($t,'HTML',$kb);
    }

    // ========================================
    // Callback Handler
    // ========================================
    private function handleCallback($cb) {
        $chatId=$cb['message']['chat']['id']; $msgId=$cb['message']['message_id']; $data=$cb['data'];
        if($chatId!=$this->chatId) return;
        $this->answerCallback($cb['id']);

        // سفارش
        if(strpos($data,'adm_order_')===0){$this->showOrderDetail((int)str_replace('adm_order_','',$data),$msgId);return;}
        if(strpos($data,'adm_setstatus_')===0){$p=explode('_',str_replace('adm_setstatus_','',$data));$this->setOrderStatus((int)$p[0],$p[1]);return;}

        // دسته‌بندی محصول جدید
        if(strpos($data,'apcat_')===0){
            $catId=(int)str_replace('apcat_','',$data);
            $sd=json_decode($this->getSetting('tg_bot_state_data')?:'{}',true);
            $sd['category_id']=$catId;
            $db=$this->getDb();
            $db->prepare("INSERT INTO products (name,price,stock,category_id,is_active,created_at,updated_at) VALUES (?,?,?,?,1,NOW(),NOW())")->execute([$sd['name'],$sd['price'],$sd['stock'],$catId]);
            $pid=$db->lastInsertId();
            $this->clearState();
            $this->sendMessage("✅ <b>{$sd['name']}</b> اضافه شد!\n🆔 #{$pid} | 💰 ".number_format($sd['price'])." ت | 📦 {$sd['stock']}");
            $this->showProducts();
            return;
        }

        // نقش کاربر جدید
        if(strpos($data,'aurole_')===0){
            $role=str_replace('aurole_','',$data);
            $sd=json_decode($this->getSetting('tg_bot_state_data')?:'{}',true);
            $db=$this->getDb();
            $hashed=password_hash($sd['password'],PASSWORD_DEFAULT);
            $db->prepare("INSERT INTO users (username,email,password,full_name,role,is_active,created_at) VALUES (?,?,?,?,?,1,NOW())")->execute([strtolower(preg_replace('/[^a-zA-Z0-9]/','',$sd['full_name'])),$sd['email'],$hashed,$sd['full_name'],$role]);
            $uid=$db->lastInsertId();
            $this->clearState();
            $this->sendMessage("✅ کاربر <b>{$sd['full_name']}</b> ایجاد شد!\n🆔 #{$uid} | 📧 {$sd['email']} | نقش: {$role}");
            $this->showUsers();
            return;
        }

        // منوها
        switch($data){
            case 'adm_refresh':case 'adm_start':$m=$this->mainMenu();$this->editMessage($m['text'],$msgId,$m['keyboard']);break;
            case 'adm_stats':$this->showStats($msgId);break;
            case 'adm_orders':$this->showOrders($msgId);break;
            case 'adm_messages':$this->showMessages($msgId);break;
            case 'adm_alerts':$this->showAlerts($msgId);break;

            // منوی محصول
            case 'adm_prod_menu':$this->showProdMenu($msgId);break;
            case 'adm_products':$this->showProducts($msgId);break;
            case 'adm_addprod_start':$this->setState('addprod_name');$this->sendMessage("✏️ <b>نام محصول</b>:\n📝 /cancel");break;
            case 'adm_editprod_start':
                $db=$this->getDb();$prods=$db->query("SELECT id,name FROM products WHERE is_active=1 ORDER BY id DESC LIMIT 8")->fetchAll();
                $kb=[];foreach($prods as $p)$kb[]=[['text'=>"#{$p['id']} {$p['name']}",'callback_data'=>"adm_editpid_{$p['id']}"]];
                $kb[]=[['text'=>'🏠 بازگشت','callback_data'=>'adm_prod_menu']];
                $this->sendMessage("✏️ محصول را انتخاب کنید:",'HTML',$kb);break;
            case 'adm_delprod_start':
                $db=$this->getDb();$prods=$db->query("SELECT id,name FROM products WHERE is_active=1 ORDER BY id DESC LIMIT 8")->fetchAll();
                $kb=[];foreach($prods as $p)$kb[]=[['text'=>"🗑️ {$p['name']}",'callback_data'=>"adm_delpid_{$p['id']}"]];
                $kb[]=[['text'=>'🏠 بازگشت','callback_data'=>'adm_prod_menu']];
                $this->sendMessage("🗑️ کدام محصول حذف شود:",'HTML',$kb);break;
            case 'adm_discount_start':
                $db=$this->getDb();$prods=$db->query("SELECT id,name,price FROM products WHERE is_active=1 AND discount_price IS NULL ORDER BY id DESC LIMIT 8")->fetchAll();
                $kb=[];foreach($prods as $p)$kb[]=[['text'=>"🎁 {$p['name']} (".number_format($p['price'])." ت)",'callback_data'=>"adm_discpid_{$p['id']}"]];
                $kb[]=[['text'=>'🏠 بازگشت','callback_data'=>'adm_prod_menu']];
                $this->sendMessage("🎁 کدام محصول تخفیف بخورد:",'HTML',$kb);break;

            // منوی کاربر
            case 'adm_user_menu':$this->showUserMenu($msgId);break;
            case 'adm_users':$this->showUsers($msgId);break;
            case 'adm_adduser_start':$this->setState('adduser_name');$this->sendMessage("👤 <b>نام کامل</b>:\n📝 /cancel");break;
            case 'adm_edituser_start':
                $db=$this->getDb();$users=$db->query("SELECT id,full_name FROM users ORDER BY id DESC LIMIT 8")->fetchAll();
                $kb=[];foreach($users as $u)$kb[]=[['text'=>"#{$u['id']} {$u['full_name']}",'callback_data'=>"adm_edituid_{$u['id']}"]];
                $kb[]=[['text'=>'🏠 بازگشت','callback_data'=>'adm_user_menu']];
                $this->sendMessage("✏️ کاربر را انتخاب کنید:",'HTML',$kb);break;
            case 'adm_deluser_start':
                $db=$this->getDb();$users=$db->query("SELECT id,full_name,is_active FROM users WHERE role='user' ORDER BY id DESC LIMIT 8")->fetchAll();
                $kb=[];foreach($users as $u){
                    $icon=$u['is_active']?'🔴 تعلیق':'🟢 فعال';
                    $kb[]=[['text'=>"{$icon} {$u['full_name']}",'callback_data'=>"adm_toggleuid_{$u['id']}"]];
                }
                $kb[]=[['text'=>'🏠 بازگشت','callback_data'=>'adm_user_menu']];
                $this->sendMessage("🔴🟢 تعلیق/فعال‌سازی کاربر:",'HTML',$kb);break;

            // منوی کیف پول
            case 'adm_wallet_menu':$this->showWalletMenu($msgId);break;
            case 'adm_change_card':$this->setState('change_card');$this->sendMessage("💳 شماره کارت جدید (۱۶ رقم):\n📝 /cancel");break;
            case 'adm_wallet_charge':$this->setState('wallet_charge');$this->sendMessage("💰 فرمت: <شناسه_کاربر> <مبلغ>\nمثال: 1 50000\n📝 /cancel");break;
            case 'adm_wallet_withdraw':$this->setState('wallet_withdraw');$this->sendMessage("💸 فرمت: <شناسه_کاربر> <مبلغ>\n📝 /cancel");break;
            case 'adm_wallet_txns':
                $db=$this->getDb();$txns=$db->query("SELECT wt.*,u.full_name FROM wallet_transactions wt LEFT JOIN users u ON wt.user_id=u.id ORDER BY wt.created_at DESC LIMIT 8")->fetchAll();
                $t="📊 <b>تراکنش‌های اخیر</b>\n━━━━━━━━━━━━━━━━━━━━━━\n\n";
                if(!$txns)$t.="📭 نیست.\n";
                else foreach($txns as $tx){
                    $icon=$tx['type']==='charge'||$tx['type']==='admin_charge'?'💰':'💸';
                    $t.="{$icon} {$tx['full_name']} | ".number_format($tx['amount'])." ت | {$tx['type']}\n   📅 ".date('m/d H:i',strtotime($tx['created_at']))."\n\n";
                }
                $this->editMessage($t,$msgId,[[['text'=>'🔙 بازگشت','callback_data'=>'adm_wallet_menu']]]);break;

            // ارسال پیام
            case 'adm_sendmsg_start':$this->setState('sendmsg_uid');$this->sendMessage("👤 شناسه کاربر:\n📝 /cancel");break;

            // ویرایش/حذف/تخفیف محصول + ویرایش/تعلیق کاربر
            default:
                if(strpos($data,'adm_editpid_')===0){
                    $pid=(int)str_replace('adm_editpid_','',$data);
                    $this->setState('editprod_field',['product_id'=>$pid]);
                    $this->sendMessage("✏️ کدام فیلد؟\n📝 نام | 💰 قیمت | 📦 موجودی | 🎁 تخفیف | ✅ فعال/غیرفعال");
                } elseif(strpos($data,'adm_delpid_')===0){
                    $pid=(int)str_replace('adm_delpid_','',$data);
                    $this->setState('delprod_confirm',['product_id'=>$pid]);
                    $this->sendMessage("⚠️ غیرفعال کردن #{$pid}?\nبله / خیر");
                } elseif(strpos($data,'adm_discpid_')===0){
                    $pid=(int)str_replace('adm_discpid_','',$data);
                    $db=$this->getDb();$p=$db->prepare("SELECT name,price FROM products WHERE id=?");$p->execute([$pid]);$p=$p->fetch();
                    $this->setState('discount_value',['product_id'=>$pid]);
                    $this->sendMessage("🎁 مبلغ تخفیف برای <b>{$p['name']}</b>:\n💰 ".number_format($p['price'])." ت\n📝 /cancel");
                } elseif(strpos($data,'adm_edituid_')===0){
                    $uid=(int)str_replace('adm_edituid_','',$data);
                    $this->setState('edituser_field',['user_id'=>$uid]);
                    $this->sendMessage("✏️ کدام فیلد؟\n📝 نام | 📧 ایمیل | 📞 تلفن | 🎭 نقش");
                } elseif(strpos($data,'adm_toggleuid_')===0){
                    $uid=(int)str_replace('adm_toggleuid_','',$data);
                    $db=$this->getDb();
                    $db->prepare("UPDATE users SET is_active=NOT is_active,updated_at=NOW() WHERE id=?")->execute([$uid]);
                    $u=$db->prepare("SELECT full_name,is_active FROM users WHERE id=?");$u->execute([$uid]);$u=$u->fetch();
                    $st=$u['is_active']?'✅ فعال':'🔴 تعلیق';
                    $this->sendMessage("{$st} <b>{$u['full_name']}</b>");
                    $this->showUsers();
                }
                break;
        }
    }

    // ========================================
    // اعلان‌ها (برای استفاده در سایت)
    // ========================================
    public function sendOrderNotification($order,$items=[]) {
        $e=match($order['status']??'pending'){'pending'=>'🟡','processing'=>'🔵','shipped'=>'🚚','delivered'=>'✅','cancelled'=>'❌',default=>'⚪'};
        $t="📦 <b>سفارش جدید!</b>\n━━━━━━━━━━━━━━━━━━\n";
        $t.="🔢 <code>".htmlspecialchars($order['order_number']??'')."</code>\n👤 ".htmlspecialchars($order['customer_name']??'مهمان')."\n";
        if(!empty($order['shipping_phone']))$t.="📞 ".htmlspecialchars($order['shipping_phone'])."\n";
        $t.="💰 <b>".number_format($order['final_amount']??0)." ت</b>\n💳 ".htmlspecialchars($order['payment_method']??'')."\n📊 {$e} ".($order['status']??'pending')."\n";
        return $this->sendMessage($t);
    }
    public function sendOrderStatusUpdate($num,$status,$name='') {
        $e=match($status){'pending'=>'🟡','processing'=>'🔵','shipped'=>'🚚','delivered'=>'✅','cancelled'=>'❌',default=>'⚪'};
        return $this->sendMessage("🔄 <b>{$num}</b>\n{$e} <b>{$status}</b>".($name?"\n👤 {$name}":"")."\n⏰ ".date('Y/m/d H:i'));
    }
    public function sendLowStockAlert($name,$stock) {
        return $this->sendMessage("⚠️ 🎥 {$name}: <b>{$stock}</b> عدد");
    }
    public function sendNewMessageNotification($name,$email,$subject,$message,$attachment=null) {
        $t="💬 <b>پیام جدید</b>\n━━━━━━━━━━━━━━━━━━\n👤 {$name}\n📧 {$email}\n";
        if($subject)$t.="📋 {$subject}\n";
        $t.="💬 ".htmlspecialchars(mb_substr($message,0,400)).(mb_strlen($message)>400?'...':'')."\n🕐 ".date('Y/m/d H:i');
        if($attachment&&file_exists($attachment)){if(in_array(strtolower(pathinfo($attachment,PATHINFO_EXTENSION)),['jpg','jpeg','png','gif','webp']))return $this->sendPhoto($attachment,$t);}
        return $this->sendMessage($t);
    }
    public function sendDailyReport($s) {
        $t="📊 <b>گزارش روزانه</b>\n📅 ".date('Y/m/d')."\n━━━━━━━━━━━━━━━━━━\n";
        $t.="💰 امروز: <b>".number_format($s['today_revenue']??0)." ت</b>\n📦 ".($s['today_orders']??0)."\n";
        $t.="💰 کل: <b>".number_format($s['total_revenue']??0)." ت</b>\n👥 ".number_format($s['total_users']??0)."\n";
        return $this->sendMessage($t);
    }
}
