<?php
// bot.php — نسخه کامل و نهایی با تمام اصلاحات
declare(strict_types=1);
require __DIR__.'/config.php';

$__raw = isset($GLOBALS['__update_override_raw']) ? $GLOBALS['__update_override_raw'] : file_get_contents('php://input');
$update = json_decode($__raw, true);
if (!$update) exit('OK');

$pdo = db();

/*──────────────────────── State (روی فایل) */
$cacheFile = __DIR__.'/state-cache.json';
$STATE = file_exists($cacheFile) ? json_decode(@file_get_contents($cacheFile), true) : [];
function setUserMode($uid, $mode, $payload=null): void {
  global $STATE,$cacheFile;
  $STATE[(string)$uid] = ['mode'=>$mode,'payload'=>$payload,'t'=>time()];
  file_put_contents($cacheFile, json_encode($STATE, JSON_UNESCAPED_UNICODE));
}
function getUserMode($uid){ global $STATE; return $STATE[(string)$uid] ?? null; }
function clearUserMode($uid): void { setUserMode($uid, null, null); }

/*──────────────────────── Helpers */

/**
 * تابع دیباگ برای پیام عمومی
 */
function debug_broadcast($message) {
    error_log("🔔 BROADCAST DEBUG: " . $message);
    
    // همچنین به ادمین اصلی اطلاع دهید
    $admins_raw = ADMIN_IDS;
    if ($admins_raw) {
        $admins = array_filter(array_map('trim', explode(',', $admins_raw)));
        $main_admin = $admins[0] ?? null;
        if ($main_admin) {
            tg('sendMessage', [
                'chat_id' => $main_admin,
                'text' => "🔔 دیباگ پیام عمومی:\n{$message}",
                'parse_mode' => 'Markdown'
            ]);
        }
    }
}
/**
 * تابع تبدیل تاریخ به فارسی
 */
function jdate($format, $timestamp = null, $timezone = null) {
    if ($timestamp === null) $timestamp = time();
    
    // تاریخ میلادی
    $g_year = date('Y', $timestamp);
    $g_month = date('m', $timestamp);
    $g_day = date('d', $timestamp);
    
    // تبدیل میلادی به شمسی (الگوریتم دقیق)
    $g_days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    $j_days_in_month = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);
    
    $gy = $g_year - 1600;
    $gm = $g_month - 1;
    $gd = $g_day - 1;
    
    $g_day_no = 365 * $gy + floor(($gy + 3) / 4) - floor(($gy + 99) / 100) + floor(($gy + 399) / 400);
    
    for ($i = 0; $i < $gm; ++$i) {
        $g_day_no += $g_days_in_month[$i];
    }
    if ($gm > 1 && (($gy % 4 == 0 && $gy % 100 != 0) || ($gy % 400 == 0))) {
        $g_day_no++;
    }
    $g_day_no += $gd;
    
    $j_day_no = $g_day_no - 79;
    
    $j_np = floor($j_day_no / 12053);
    $j_day_no = $j_day_no % 12053;
    
    $jy = 979 + 33 * $j_np + 4 * floor($j_day_no / 1461);
    $j_day_no %= 1461;
    
    if ($j_day_no >= 366) {
        $jy += floor(($j_day_no - 1) / 365);
        $j_day_no = ($j_day_no - 1) % 365;
    }
    
    for ($i = 0; $i < 11 && $j_day_no >= $j_days_in_month[$i]; ++$i) {
        $j_day_no -= $j_days_in_month[$i];
    }
    $jm = $i + 1;
    $jd = $j_day_no + 1;
    
    // نام ماه‌های شمسی
    $jmonths = array(
        '', 'فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور',
        'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'
    );
    
    // فرمت‌دهی خروجی
    if ($format == 'd/m') {
        $result = sprintf("%02d/%s", $jd, $jmonths[$jm]);
    } else {
        $result = sprintf("%02d/%s/%04d", $jd, $jmonths[$jm], $jy);
    }
    
    // تبدیل اعداد انگلیسی به فارسی
    $english = array('0','1','2','3','4','5','6','7','8','9');
    $persian = array('۰','۱','۲','۳','۴','۵','۶','۷','۸','۹');
    
    return str_replace($english, $persian, $result);
}

function ensureUser(array $u): void {
  global $pdo;
  $stmt = $pdo->prepare("INSERT INTO users (id,username,first_name,last_name,is_admin)
    VALUES (:id,:un,:fn,:ln,:is_admin)
    ON DUPLICATE KEY UPDATE username=VALUES(username), first_name=VALUES(first_name), last_name=VALUES(last_name), is_admin=VALUES(is_admin)");
  $stmt->execute([
    ':id'=>$u['id'],
    ':un'=>$u['username']??null,
    ':fn'=>$u['first_name']??null,
    ':ln'=>$u['last_name']??null,
    ':is_admin'=> isAdmin($u['id']) ? 1 : 0
  ]);
}

function isMember($user_id): bool {
  // برای تست، همیشه true برمی‌گرداند. در تولید باید واقعی چک شود
  // $result = tg('getChatMember', ['chat_id'=>CHANNEL_USERNAME, 'user_id'=>$user_id]);
  // return ($result && isset($result['result']['status']) && $result['result']['status'] !== 'left');
  return true; // فعلاً غیرفعال - برای تست
}

function make_copyable_card(): string {
  return "🔻 شماره کارت (قابل کپی):\n`".CARD_NUMBER."`\nبه نام زحمت‌کش";
}

function fmt_order(array $o): string {
  $status_icons = [
    'PENDING' => '⏳',
    'APPROVED' => '✅', 
    'REJECTED' => '❌'
  ];
  return "📦 سفارش #{$o['id']}\n".
         "👤 کاربر: {$o['user_id']}\n".
         "🛒 پلن: {$o['plan_title']}\n".
         "💳 مبلغ: ".money((int)$o['price'])."\n".
         "📊 وضعیت: {$status_icons[$o['status']]} {$o['status']}\n".
         "📅 تاریخ: {$o['created_at']}";
}
/*──────────────────────── Sales Stats (آمار فروش) تنظیمات و توابع */

// 🔧 تنظیمات قابل تغییر آمار فروش
// اگر ساختار دیتابیس‌ات فرق دارد، فقط این‌ها را عوض کن
$STATS_TABLE            = 'orders';      // نام جدول سفارش‌ها یا پرداخت‌ها (مثلاً orders یا payments)
$STATS_AMOUNT_COLUMN    = 'price';       // ستون مبلغ پرداخت (به تومان)
$STATS_STATUS_COLUMN    = 'status';      // ستون وضعیت پرداخت
$STATS_SUCCESS_STATUS   = 'APPROVED';    // مقدار وضعیت موفق (مثلاً 'APPROVED' یا 'paid')
$STATS_DATE_COLUMN      = 'approved_at'; // ستون زمان پرداخت موفق (مثلاً approved_at یا paid_at یا created_at)
$STATS_WEEK_MODE        = 1;             // شروع هفته در MySQL: 1 = دوشنبه، 0 یا 7 = یکشنبه، ... (در صورت نیاز قابل تغییر)

/**
 * خواندن آمار فروش از دیتابیس
 * خروجی همیشه اعداد صحیح برمی‌گرداند (حتی اگر دیتابیس خالی باشد -> 0)
 */
function get_sales_stats(PDO $pdo): array {
  global $STATS_TABLE, $STATS_AMOUNT_COLUMN, $STATS_STATUS_COLUMN, $STATS_SUCCESS_STATUS, $STATS_DATE_COLUMN, $STATS_WEEK_MODE;

  // برای خوانایی بیشتر
  $dateExpr = $STATS_DATE_COLUMN;
  $weekMode = (int)$STATS_WEEK_MODE;

  // کوئری جمع‌بندی آمار در یک شات
  $sql = "
    SELECT
      COUNT(*) AS total_count,
      COALESCE(SUM($STATS_AMOUNT_COLUMN), 0) AS total_amount,

      SUM(CASE WHEN DATE($dateExpr) = CURDATE() THEN 1 ELSE 0 END) AS today_count,
      COALESCE(SUM(CASE WHEN DATE($dateExpr) = CURDATE() THEN $STATS_AMOUNT_COLUMN ELSE 0 END), 0) AS today_amount,

      SUM(
        CASE
          WHEN YEAR($dateExpr) = YEAR(CURDATE())
           AND MONTH($dateExpr) = MONTH(CURDATE())
          THEN 1 ELSE 0
        END
      ) AS month_count,
      COALESCE(
        SUM(
          CASE
            WHEN YEAR($dateExpr) = YEAR(CURDATE())
             AND MONTH($dateExpr) = MONTH(CURDATE())
            THEN $STATS_AMOUNT_COLUMN ELSE 0
          END
        ), 0
      ) AS month_amount,

      SUM(
        CASE
          WHEN YEARWEEK($dateExpr, $weekMode) = YEARWEEK(CURDATE(), $weekMode)
          THEN 1 ELSE 0
        END
      ) AS week_count,
      COALESCE(
        SUM(
          CASE
            WHEN YEARWEEK($dateExpr, $weekMode) = YEARWEEK(CURDATE(), $weekMode)
            THEN $STATS_AMOUNT_COLUMN ELSE 0
          END
        ), 0
      ) AS week_amount
    FROM $STATS_TABLE
    WHERE $STATS_STATUS_COLUMN = :status
      AND $dateExpr IS NOT NULL
  ";

  $stmt = $pdo->prepare($sql);
  $stmt->execute([':status' => $STATS_SUCCESS_STATUS]);
  $row = $stmt->fetch(PDO::FETCH_ASSOC) ?: [];

  // اگر به هر دلیلی ستون‌ها NULL یا خالی بودند، به 0 تبدیل شوند
  $defaults = [
    'total_count'  => 0,
    'total_amount' => 0,
    'today_count'  => 0,
    'today_amount' => 0,
    'week_count'   => 0,
    'week_amount'  => 0,
    'month_count'  => 0,
    'month_amount' => 0,
  ];
  foreach ($defaults as $k => $v) {
    if (!isset($row[$k]) || $row[$k] === null) {
      $row[$k] = $v;
    }
  }

  // همه چیز را به int تبدیل می‌کنیم که warning ندهد
  return [
    'total_count'  => (int)$row['total_count'],
    'total_amount' => (int)$row['total_amount'],
    'today_count'  => (int)$row['today_count'],
    'today_amount' => (int)$row['today_amount'],
    'week_count'   => (int)$row['week_count'],
    'week_amount'  => (int)$row['week_amount'],
    'month_count'  => (int)$row['month_count'],
    'month_amount' => (int)$row['month_amount'],
  ];
}
/*──────────────────────── Wallet Functions */
/**
 * گرفتن موجودی کاربر
 */
function get_user_balance($user_id): int {
    global $pdo;
    try {
        $stmt = $pdo->prepare("SELECT balance FROM users WHERE id = :id");
        $stmt->execute([':id' => $user_id]);
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        
        return $row ? (int)$row['balance'] : 0;
    } catch (Exception $e) {
        error_log("Error in get_user_balance: " . $e->getMessage());
        return 0;
    }
}

/**
 * گرفتن تعداد سرویس‌های کاربر
 */
function get_user_services_count($user_id): int {
    global $pdo;
    $stmt = $pdo->prepare("SELECT COUNT(*) as count FROM sales WHERE user_id = :id");
    $stmt->execute([':id' => $user_id]);
    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    return $row ? (int)$row['count'] : 0;
}

/**
 * ایجاد تراکنش جدید برای افزایش موجودی
 */
function create_deposit_transaction($user_id, $amount, $receipt_file_id = null, $receipt_text = null): int {
  global $pdo;
  
  try {
      $stmt = $pdo->prepare("
          INSERT INTO wallet_transactions (user_id, amount, type, status, description, receipt_file_id, receipt_text) 
          VALUES (:user_id, :amount, 'DEPOSIT', 'PENDING', 'افزایش موجودی کیف پول', :file_id, :text)
      ");
      $stmt->execute([
          ':user_id' => $user_id,
          ':amount' => (int)$amount, // 🔥
          ':file_id' => $receipt_file_id,
          ':text' => $receipt_text
      ]);
      return (int)$pdo->lastInsertId();
  } catch (Exception $e) {
      error_log("Error in create_deposit_transaction: " . $e->getMessage());
      return 0;
  }
}
/**
 * اطلاع‌رسانی به ادمین‌ها درباره کمبود کانفیگ
 */
function notify_admins_no_config($order_id, array $order, array $user): void {
    global $pdo;
    
    // 🔥 تبدیل order_id به integer برای اطمینان
    $order_id = (int)$order_id;
    
    $admins_raw = ADMIN_IDS;
    if (!$admins_raw) return;
    
    $admins = array_filter(array_map('trim', explode(',', $admins_raw)));
    if (!$admins) return;

    $full_name = trim(($user['first_name'] ?? '') . ' ' . ($user['last_name'] ?? ''));
    if ($full_name === '') {
        $full_name = 'نامشخص';
    }

    $text = "⚠️ **کمبود کانفیگ برای سفارش جدید**\n\n";
    $text .= "👤 کاربر: {$full_name}\n";
    $text .= "🆔 آیدی عددی: {$user['id']}\n";
    $text .= "📦 پلن: {$order['plan_title']}\n";
    $text .= "💰 مبلغ: " . money((int)$order['price']) . "\n";
    $text .= "🆔 شماره سفارش: #{$order_id}\n";
    $text .= "📅 زمان ثبت: " . date('Y-m-d H:i:s') . "\n\n";
    $text .= "❌ **کانفیگ برای این پلن موجود نیست!**";

    $keyboard = [
        'inline_keyboard' => [
            [
                ['text' => '➕ شارژ این پلن', 'callback_data' => "ADMIN_ADD_PLAN__{$order['plan_code']}"],
                ['text' => '📋 مشاهده سفارش', 'callback_data' => "ADMIN_ORDER__{$order_id}"],
            ],
        ],
    ];

    foreach ($admins as $admin_id) {
        tg('sendMessage', [
            'chat_id'      => $admin_id,
            'text'         => $text,
            'parse_mode'   => 'Markdown',
            'reply_markup' => json_encode($keyboard, JSON_UNESCAPED_UNICODE),
        ]);
    }
}
/**
 * اطلاع‌رسانی به ادمین‌ها درباره درخواست افزایش موجودی جدید
 */
function notify_admins_new_deposit(int $tx_id, array $tx, array $user): void {
    global $pdo;
    
    // ۱) لیست ادمین‌ها
    $admins_raw = ADMIN_IDS;
    if (!$admins_raw) {
        error_log("NO ADMIN_IDS defined, cannot notify deposit #{$tx_id}");
        return;
    }

    $admins = array_filter(array_map('trim', explode(',', $admins_raw)));
    if (!$admins) {
        error_log("ADMIN_IDS parsed empty, cannot notify deposit #{$tx_id}");
        return;
    }

    // ۲) متن پیام برای ادمین
    $full_name = trim(($user['first_name'] ?? '') . ' ' . ($user['last_name'] ?? ''));
    if ($full_name === '') {
        $full_name = 'نامشخص';
    }

    // تبدیل amount به عدد برای جلوگیری از خطای number_format
    $amount = (float)$tx['amount'];
    
    $text =
        "🔔 درخواست افزایش موجودی جدید\n\n" .
        "👤 کاربر: {$full_name}\n" .
        "🆔 آیدی عددی: {$user['id']}\n" .
        "💰 مبلغ: " . number_format($amount) . " تومان\n" .
        "🆔 کد تراکنش: #{$tx_id}\n" .
        "📅 زمان ثبت: " . date('Y-m-d H:i:s') . "\n\n" .
        "ℹ️ توضیحات کاربر:\n" .
        ($tx['receipt_text'] ?: '—');

    // ۳) دکمه‌های تأیید / رد
    $keyboard = [
        'inline_keyboard' => [
            [
                ['text' => '✅ تأیید', 'callback_data' => "ADMIN_APPROVE_DEPOSIT__{$tx_id}"],
                ['text' => '❌ رد ', 'callback_data' => "ADMIN_REJECT_DEPOSIT__{$tx_id}"],
            ],
        ],
    ];

    // 🔥 لاگ برای دیباگ
    error_log("📤 Sending admin notification:");
    error_log("📝 Callback data 1: ADMIN_APPROVE_DEPOSIT__{$tx_id}");
    error_log("📝 Callback data 2: ADMIN_REJECT_DEPOSIT__{$tx_id}");
    error_log("👥 Admins to notify: " . implode(', ', $admins));

    foreach ($admins as $admin_id) {
        error_log("📨 Sending to admin: {$admin_id}");
        
        // اگر عکس دارد، اول عکس را بفرست
        if (!empty($tx['receipt_file_id'])) {
            $result = tg('sendPhoto', [
                'chat_id'      => $admin_id,
                'photo'        => $tx['receipt_file_id'],
                'caption'      => $text,
                'reply_markup' => json_encode($keyboard, JSON_UNESCAPED_UNICODE),
            ]);
        } else {
            // بدون عکس
            $result = tg('sendMessage', [
                'chat_id'      => $admin_id,
                'text'         => $text,
                'reply_markup' => json_encode($keyboard, JSON_UNESCAPED_UNICODE),
            ]);
        }
        
        // 🔥 لاگ نتیجه ارسال
        error_log("📨 Send result for admin {$admin_id}: " . json_encode($result));
    }
}

/**
 * افزایش موجودی کاربر
 */
function add_user_balance($user_id, $amount): bool {
    global $pdo;
    try {
        $stmt = $pdo->prepare("UPDATE users SET balance = balance + :amount WHERE id = :id");
        return $stmt->execute([':amount' => $amount, ':id' => $user_id]);
    } catch (Exception $e) {
        error_log("Error in add_user_balance: " . $e->getMessage());
        return false;
    }
}
/*──────────────────────── Auto Config Delivery Queue */
/**
 * اضافه کردن سفارش به صف انتظار
 */
function add_to_config_waiting_queue($order_id, $user_id, $plan_code): void {
    global $pdo;
    
    $stmt = $pdo->prepare("
        INSERT INTO config_waiting_queue (order_id, user_id, plan_code, created_at) 
        VALUES (:order_id, :user_id, :plan_code, NOW())
    ");
    $stmt->execute([
        ':order_id' => $order_id,
        ':user_id' => $user_id,
        ':plan_code' => $plan_code
    ]);
}

/**
 * حذف از صف انتظار
 */
function remove_from_config_waiting_queue($order_id): void {
    global $pdo;
    
    $stmt = $pdo->prepare("DELETE FROM config_waiting_queue WHERE order_id = :order_id");
    $stmt->execute([':order_id' => $order_id]);
}

/**
 * گرفتن موقعیت کاربر در صف انتظار
 */
function get_waiting_position($order_id, $plan_code): int {
    global $pdo;
    
    $stmt = $pdo->prepare("
        SELECT COUNT(*) as position 
        FROM config_waiting_queue 
        WHERE plan_code = :plan_code 
        AND created_at <= (SELECT created_at FROM config_waiting_queue WHERE order_id = :order_id)
    ");
    $stmt->execute([':plan_code' => $plan_code, ':order_id' => $order_id]);
    $result = $stmt->fetch();
    
    return $result ? (int)$result['position'] : 1;
}

/**
 * ارسال کانفیگ به اولین نفر در صف انتظار
 */
function deliver_config_to_waiting_users($plan_code): void {
    global $pdo;
    
    error_log("🚀 START deliver_config_to_waiting_users for plan_code: {$plan_code}");
    
    // دریافت اولین سفارش در صف برای این پلن (قدیمی‌ترین)
    $stmt = $pdo->prepare("
        SELECT cwq.*, o.user_id, o.plan_title, o.price 
        FROM config_waiting_queue cwq 
        JOIN orders o ON cwq.order_id = o.id 
        WHERE cwq.plan_code = :plan_code 
        ORDER BY cwq.created_at ASC 
        LIMIT 1
    ");
    $stmt->execute([':plan_code' => $plan_code]);
    $waiting_order = $stmt->fetch();
    
    if (!$waiting_order) {
        error_log("🔍 No waiting users for plan_code: {$plan_code}");
        return;
    }
    
    $order_id = $waiting_order['order_id'];
    $user_id = $waiting_order['user_id'];
    
    error_log("🎯 Found waiting order #{$order_id} for user {$user_id}, plan {$plan_code}");
    
    // ارسال کانفیگ
    $config_data = deliver_config_after_wallet_payment($order_id, $user_id);
    
    if ($config_data) {
        // حذف از صف انتظار
        remove_from_config_waiting_queue($order_id);
        error_log("✅ Successfully delivered config for order #{$order_id}");
        
        // اطلاع به کاربر
        tg('sendMessage', [
            'chat_id' => $user_id,
            'text' => "🎉 **کانفیگ شما آماده شد!**\n\n" .
                     "📦 پلن: {$waiting_order['plan_title']}\n" .
                     "💰 مبلغ: " . money((int)$waiting_order['price']) . "\n" .
                     "🆔 شماره سفارش: #{$order_id}\n\n" .
                     "✅ کانفیگ با موفقیت ارسال شد.",
            'parse_mode' => 'Markdown',
            'reply_markup' => [
                'inline_keyboard' => [
                    [['text' => '📦 سرویس‌های من', 'callback_data' => 'MY_SERVICES']],
                    [['text' => '🛒 خرید مجدد', 'callback_data' => 'BUY']]
                ]
            ]
        ]);
        
        // بررسی اگر کاربران بیشتری در صف هستند
        deliver_config_to_waiting_users($plan_code);
    } else {
        error_log("❌ Failed to deliver config for order #{$order_id}");
        
        // اطلاع به ادمین در صورت شکست
        $admins_raw = ADMIN_IDS;
        if ($admins_raw) {
            $admins = array_filter(array_map('trim', explode(',', $admins_raw)));
            foreach ($admins as $admin_id) {
                tg('sendMessage', [
                    'chat_id' => $admin_id,
                    'text' => "⚠️ خطا در ارسال خودکار کانفیگ\n\nسفارش: #{$order_id}\nکاربر: {$user_id}\nپلن: {$plan_code}\n\nلطفاً به صورت دستی اقدام کنید.",
                    'parse_mode' => 'Markdown',
                    'reply_markup' => [
                        'inline_keyboard' => [
                            [['text' => '🔧 ارسال دستی کانفیگ', 'callback_data' => 'ADMIN_GETCFG__' . $order_id]]
                        ]
                    ]
                ]);
            }
        }
    }
}
/**
 * ساخت متن اطلاعات کیف پول کاربر (نسخه بسیار ساده برای تست)
 */
function build_wallet_info_text($user_id): string {
    global $pdo;
    
    try {
        // اطلاعات کاربر
        $user_stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
        $user_stmt->execute([':id' => $user_id]);
        $user = $user_stmt->fetch(PDO::FETCH_ASSOC);
        
        if (!$user) {
            return "❌ کاربر یافت نشد";
        }
        
        // تعداد سرویس‌ها
        $services_count = get_user_services_count($user_id);
        
        // موجودی
        $balance = isset($user['balance']) ? (int)$user['balance'] : 0;
        $total_cashback = isset($user['total_cashback']) ? (int)$user['total_cashback'] : 0;
        $has_wallet_bonus = isset($user['has_wallet_bonus']) ? (int)$user['has_wallet_bonus'] : 0;
        
        $text = "💰 **کیف پول و حساب کاربری**\n\n";
        $text .= "👤 **آیدی عددی:** `{$user_id}`\n";
        $text .= "📛 **نام:** " . ($user['first_name'] ?? 'نامشخص') . "\n";
        $text .= "💵 **موجودی فعلی:** " . money($balance) . "\n";
        $text .= "📦 **تعداد سرویس‌ها:** {$services_count} عدد\n";
        
        // 🎁 نمایش اطلاعات جوایز
        if ($total_cashback > 0) {
            $text .= "\n🎁 **مجموع جوایز خرید:** " . money($total_cashback) . "\n";
        }
        
        $text .= "\n━━━━━━━━━━━━━━━━━━━━\n";
        $text .= "✨ **جوایز ویژه** ✨\n\n";
        
        if ($has_wallet_bonus) {
            $text .= "🔥 شما بونوس شارژ کیف پول دریافت کرده‌اید!\n";
        } else {
            $text .= "💎 **بونوس شارژ:**\n";
            $text .= "   • ۵۰۰+ هزار تومان → **۲۱٪ هدیه**\n";
            $text .= "   • ۲۰۰+ هزار تومان → **۱۰٪ هدیه**\n\n";
            $text .= "🎁 **جایزه خرید:**\n";
            $text .= "   • ۱۰٪ مبلغ خرید (کارت به کارت) به کیف پول!\n";
        }
        
        return $text;
        
    } catch (Exception $e) {
        error_log("Error in build_wallet_info_text: " . $e->getMessage());
        return "✅ اطلاعات کیف پول:\n\nموجودی: ۰ تومان\n\nبرای افزایش موجودی از دکمه زیر استفاده کنید.";
    }
}

/**
 * کیبورد کیف پول
 */
function kb_wallet(): array {
    return [
        'inline_keyboard' => [
            [
                ['text' => '💰 افزایش موجودی', 'callback_data' => 'ADD_BALANCE'],
                ['text' => '📊 تاریخچه تراکنش‌ها', 'callback_data' => 'WALLET_HISTORY'],
            ],
            [
                ['text' => '🔄 بروزرسانی', 'callback_data' => 'WALLET_REFRESH'],
            ],
            [
                ['text' => '◀️ بازگشت', 'callback_data' => 'BACK_MAIN'],
            ],
        ]
    ];
}

/**
 * کیبورد افزایش موجودی
 */
function kb_add_balance(): array {
    return [
        'inline_keyboard' => [
            [
                ['text' => '۵۰,۰۰۰ تومان', 'callback_data' => 'DEPOSIT_50000'],
                ['text' => '۱۰۰,۰۰۰ تومان', 'callback_data' => 'DEPOSIT_100000'],
            ],
            [
                ['text' => '۲۰۰,۰۰۰ تومان', 'callback_data' => 'DEPOSIT_200000'],
                ['text' => '۵۰۰,۰۰۰ تومان', 'callback_data' => 'DEPOSIT_500000'],
            ],
            [
                ['text' => '💰 مبلغ دلخواه', 'callback_data' => 'DEPOSIT_CUSTOM'],
            ],
            [
                ['text' => '◀️ بازگشت', 'callback_data' => 'WALLET'],
            ],
        ]
    ];
}
/**
 * ساخت متن فارسی آمار فروش برای نمایش به ادمین
 */
function build_sales_stats_text(array $s): string {
  $txt  = "📊 آمار فروش ربات\n\n";
  $txt .= "🧾 تعداد فروش:\n";
  $txt .= "— کل اشتراک‌ها: {$s['total_count']} عدد\n";
  $txt .= "— این ماه: {$s['month_count']} عدد\n";
  $txt .= "— این هفته: {$s['week_count']} عدد\n";
  $txt .= "— امروز: {$s['today_count']} عدد\n\n";

  // فرض بر این است که تابع money() خودش جداکننده هزارگان را اعمال می‌کند
  $txt .= "💰 درآمد (تومان):\n";
  $txt .= "— مجموع کل: ".money($s['total_amount'])."\n";
  $txt .= "— این ماه: ".money($s['month_amount'])."\n";
  $txt .= "— این هفته: ".money($s['week_amount'])."\n";
  $txt .= "— امروز: ".money($s['today_amount'])."\n";

  return $txt;
}

/**
 * کیبورد اینلاین زیر پیام آمار فروش
 */
function kb_admin_stats(): array {
  return [
    'inline_keyboard' => [
      [
        ['text' => '🔄 بروزرسانی آمار',      'callback_data' => 'ADMIN_STATS_REFRESH'],
      ],
      [
        ['text' => '⬅️ بازگشت به پنل ادمین', 'callback_data' => 'ADMIN'],
      ],
    ]
  ];
}
/*──────────────────────── Plan Management Helpers (مدیریت داینامیک پلن‌ها) */

/**
 * عنوان فارسی دسته پلن
 */
function plan_category_label(string $cat): string {
  switch ($cat) {
    case 'VIP_1M': return '👑 VIP یک‌ماهه (نامحدود)';
    case 'VIP_3M': return '⏳ VIP سه‌ماهه (نامحدود)';
    case 'VOL_1M': return '📦 حجمی یک‌ماهه';
    default:       return $cat;
  }
}

/**
 * گرفتن پلن از دیتابیس بر اساس plan_code
 * 🔧 جستجوی انعطاف‌پذیر
 */
function db_get_plan_by_code(string $code) {
  global $pdo;
  $code = strtoupper(trim($code));
  
  // ابتدا جستجوی دقیق
  $stmt = $pdo->prepare("SELECT * FROM plans WHERE plan_code = :c LIMIT 1");
  $stmt->execute([':c'=>$code]);
  $row = $stmt->fetch(PDO::FETCH_ASSOC);
  if ($row) return $row;
  
  // جستجوی case-insensitive
  $stmt = $pdo->prepare("SELECT * FROM plans WHERE UPPER(TRIM(plan_code)) = :c LIMIT 1");
  $stmt->execute([':c'=>$code]);
  $row = $stmt->fetch(PDO::FETCH_ASSOC);
  return $row ?: null;
}

/**
 * لیست پلن‌های یک دسته از دیتابیس
 */
function db_get_plans_by_category(string $category): array {
  global $pdo;
  
  // لاگ برای دیباگ
  error_log("🔄 DEBUG db_get_plans_by_category: category = {$category}");
  
  $stmt = $pdo->prepare("SELECT * FROM plans WHERE category = :c AND is_active = 1 ORDER BY price ASC, id ASC");
  $stmt->execute([':c' => $category]);
  $result = $stmt->fetchAll(PDO::FETCH_ASSOC) ?: [];
  
  error_log("🔍 DEBUG: Found " . count($result) . " plans for category {$category}");
  return $result;
}

/**
 * تبدیل ورودی ادمین به اجزای duration|users|price
 * فرمت: 1m|3user|320000
 */
function parse_plan_input(string $input): ?array {
  $input = trim($input);
  error_log("🔄 DEBUG parse_plan_input: input = '{$input}'");
  
  // جایگزین کردن regex در parse_plan_input
if (!preg_match('/^(\d+[a-z]+)\|(\d+)user\|(\d+)$/i', $input, $m)) {
    error_log("❌ DEBUG: regex failed for input: {$input}");
    return null;
}
  
  error_log("✅ DEBUG: regex matches: " . print_r($m, true));
  
  return [
    'duration_raw' => strtolower($m[1]),
    'users'        => (int)$m[2],
    'price'        => (int)$m[3],
  ];
}

/**
 * ساختن اطلاعات پلن از روی دسته + ورودی ادمین
 * خروجی شامل category, duration_label, users, price, plan_code, title
 */
function build_plan_from_input(string $category, string $input): ?array {
  error_log("🔄 DEBUG build_plan_from_input START: category = {$category}, input = {$input}");
  
  $parsed = parse_plan_input($input);
  if (!$parsed) {
    error_log("❌ DEBUG: parse_plan_input returned null");
    
    // پیام خطای مفید برای ادمین
    tg('sendMessage', [
      'chat_id' => $GLOBALS['update']['callback_query']['from']['id'] ?? $GLOBALS['update']['message']['from']['id'],
      'text' => "❌ فرمت ورودی اشتباه است!\n\nفرمت صحیح: `duration|users|price`\nمثال: `1m|3user|320000`",
      'parse_mode' => 'Markdown'
    ]);
    return null;
  }
  
  error_log("✅ DEBUG: parsed data = " . print_r($parsed, true));
  
  $duration = $parsed['duration_raw'];
  $users    = $parsed['users'];
  $price    = $parsed['price'];

  $plan_code = null;
  $title     = null;

  if (strpos($category, 'VIP_') === 0) {
    error_log("🔵 DEBUG: Processing VIP category");
    
    if (!preg_match('/VIP_(\d+)M/', $category, $m)) {
      error_log("❌ DEBUG: VIP category regex failed");
      return null;
    }
    
    $months = (int)$m[1];
    error_log("🔵 DEBUG: VIP months = {$months}");

    // کد: VIP_{users}U_{months}M
    $plan_code = 'VIP_'.$users.'U_'.$months.'M';
    $title = "اشتراک VIP {$months}ماهه | {$users} کاربر";

  } elseif ($category === 'VOL_1M') {
    error_log("🟢 DEBUG: Processing VOL category");
    
    if (!preg_match('/^(\d+)[gG]$/', $duration, $m)) {
      error_log("❌ DEBUG: VOL duration regex failed for: {$duration}");
      
      tg('sendMessage', [
        'chat_id' => $GLOBALS['update']['callback_query']['from']['id'] ?? $GLOBALS['update']['message']['from']['id'],
        'text' => "❌ فرمت حجم اشتباه است!\n\nفرمت صحیح حجم: `10g` یا `50g` یا `100g`",
        'parse_mode' => 'Markdown'
      ]);
      return null;
    }
    
    $gb = (int)$m[1];
    error_log("🟢 DEBUG: VOL GB = {$gb}");

    $plan_code = 'VOL_'.$gb.'G_1M';
    $title = "پلن حجمی {$gb} گیگ | 1 ماهه";

  } else {
    error_log("❌ DEBUG: Unknown category: {$category}");
    return null;
  }

  $result = [
    'category'       => $category,
    'duration_label' => $duration,
    'users'          => $users,
    'price'          => $price,
    'plan_code'      => $plan_code,
    'title'          => $title,
  ];
  
  error_log("✅ DEBUG: Final result = " . print_r($result, true));
  return $result;
}

/**
 * درج/آپدیت پلن در دیتابیس (ON DUPLICATE KEY)
 * اگر plan_code تکراری باشد، قیمت و مشخصاتش آپدیت می‌شود.
 */
function db_upsert_plan(array $plan): int {
  global $pdo;
  $stmt = $pdo->prepare("
    INSERT INTO plans (category,duration_label,users,price,plan_code,title,is_active)
    VALUES (:cat,:dur,:u,:pr,:code,:title,1)
    ON DUPLICATE KEY UPDATE
      category = VALUES(category),
      duration_label = VALUES(duration_label),
      users = VALUES(users),
      price = VALUES(price),
      title = VALUES(title),
      is_active = 1,
      updated_at = NOW()
  ");
  $stmt->execute([
    ':cat'   => $plan['category'],
    ':dur'   => $plan['duration_label'],
    ':u'     => $plan['users'],
    ':pr'    => $plan['price'],
    ':code'  => $plan['plan_code'],
    ':title' => $plan['title'],
  ]);

  // گرفتن id
  $id = (int)$pdo->lastInsertId();
  if ($id > 0) return $id;

  // اگر آپدیت شده بود، دوباره id را از روی plan_code می‌گیریم
  $row = db_get_plan_by_code($plan['plan_code']);
  return $row ? (int)$row['id'] : 0;
}

/**
 * تغییر قیمت پلن
 */
function db_update_plan_price(int $id, int $price): bool {
  global $pdo;
  $stmt = $pdo->prepare("UPDATE plans SET price = :p, updated_at = NOW() WHERE id = :id");
  return $stmt->execute([':p'=>$price, ':id'=>$id]);
}

/**
 * حذف پلن (فیزیکی)
 */
function db_delete_plan(int $id): bool {
  global $pdo;
  // حذف نرم: فقط غیرفعال کردن پلن
  $stmt = $pdo->prepare("UPDATE plans SET is_active = 0 WHERE id = :id");
  return $stmt->execute([':id' => $id]);
}

/**
 * گرفتن کدهای پلن یک دسته برای استفاده در BUY / کانفیگ پلاس
 */
function get_plan_codes_by_category(string $category): array {
  global $pdo;

  error_log("🔄 DEBUG get_plan_codes_by_category: category = {$category}");
  
  $stmt = $pdo->prepare("SELECT UPPER(TRIM(plan_code)) as plan_code FROM plans WHERE category = :c AND is_active = 1 ORDER BY price ASC, id ASC");
  $stmt->execute([':c' => $category]);
  $codes = $stmt->fetchAll(PDO::FETCH_COLUMN);
  
  error_log("🔍 DEBUG: Found codes: " . implode(', ', $codes));
  
  if ($codes) return $codes;

  // 🔧 fallback - باید با فرمت دیتابیس یکسان باشد
  error_log("⚠️ WARNING: Using fallback codes for category {$category} - no DB plans found!");
  switch ($category) {
    case 'VIP_1M': return ['VIP_1U_1M','VIP_2U_1M','VIP_3U_1M'];
    case 'VIP_3M': return ['VIP_1U_3M','VIP_2U_3M'];
    case 'VOL_1M': return ['VOL_10G_1M','VOL_20G_1M','VOL_30G_1M'];
    default: return [];
  }
}

/**
 * گرفتن اطلاعات پلن برای کل ربات:
 * 1) اول از plans (DB) می‌خواند
 * 2) اگر نبود و تابع plans() تعریف شده بود، از آن استفاده می‌کند (سازگاری با گذشته)
 */
function bot_get_plan(string $code): ?array {
  // 🔧 یکسان‌سازی
  $code = strtoupper(trim($code));
  
  // 1) دیتابیس
  $row = db_get_plan_by_code($code);
  if ($row) {
    return [
      'title'          => $row['title'],
      'price'          => (int)$row['price'],
      'category'       => $row['category'],
      'duration_label' => $row['duration_label'],
      'users'          => $row['users'],
    ];
  }

  // 2) سازگاری با plans() قدیمی اگر در config.php تعریف شده باشد
  if (function_exists('plans')) {
    $all = plans();
    if (isset($all[$code])) return $all[$code];
  }

  error_log("⚠️ bot_get_plan: Plan not found for code='{$code}'");
  return null;
}

/**
 * کیبورد ریشه مدیریت پلن‌ها در پنل ادمین
 */
function kb_admin_plans_root(): array {
  return [
    'inline_keyboard' => [
      [
        ['text'=>'👑 VIP یک‌ماهه','callback_data'=>'ADMIN_PLANS_CAT__VIP_1M'],
        ['text'=>'⏳ VIP سه‌ماهه','callback_data'=>'ADMIN_PLANS_CAT__VIP_3M'],
      ],
      [
        ['text'=>'📦 حجمی یک‌ماهه','callback_data'=>'ADMIN_PLANS_CAT__VOL_1M'],
      ],
      [
        ['text'=>'◀️ بازگشت','callback_data'=>'ADMIN'],
      ],
    ]
  ];
}

/**
 * کیبورد لیست پلن‌های یک دسته برای مدیریت
 */
function kb_admin_plans_category(string $category): array {
  $plans = db_get_plans_by_category($category);
  $rows  = [];

  foreach ($plans as $p) {
    if ($category === 'VOL_1M') {
      // نمایش پلن‌های حجمی: 10G | 150,000 تومان
      $gb = preg_match('/VOL_(\d+)G_1M/', $p['plan_code'], $m) ? $m[1] : '?';
      $label = "{$gb} گیگ | ".money((int)$p['price']);
    } else {
      // نمایش پلن‌های VIP: 1ماهه | 3 کاربر | 320,000 تومان
      $months = preg_match('/VIP_\d+U_(\d+)M/', $p['plan_code'], $m) ? $m[1] : '1';
      $users = $p['users'] ?? 1;
      $label = "{$months}ماه | {$users} کاربر | ".money((int)$p['price']);
    }
    
    $rows[] = [
      ['text'=>$label, 'callback_data'=>'ADMIN_PLAN_INFO__'.$p['id']]
    ];
  }

  $rows[] = [
    ['text'=>'➕ افزودن پلن جدید','callback_data'=>'ADMIN_PLANS_ADD__'.$category],
  ];
  $rows[] = [
    ['text'=>'◀️ بازگشت','callback_data'=>'ADMIN_PLANS'],
  ];

  return ['inline_keyboard'=>$rows];
}
/**
 * بررسی و پاکسازی وضعیت تراکنش‌ها
 */
function ensureCleanTransactionState(): void {
    global $pdo;
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
        error_log("⚠️ Cleaned up stray transaction");
    }
}
/*──────────────────────── Wallet Payment Functions */
/**
 * بررسی امکان پرداخت با کیف پول
 */
function can_pay_with_wallet($user_id, $amount): array {
    global $pdo;
    
    try {
        $balance = get_user_balance($user_id);
        $can_pay = $balance >= $amount;
        
        error_log("🔄 DEBUG can_pay_with_wallet: user_id={$user_id}, balance={$balance}, amount={$amount}, can_pay=" . ($can_pay ? 'YES' : 'NO'));
        
        return [
            'can_pay' => $can_pay,
            'balance' => $balance,
            'required' => $amount,
            'shortage' => $can_pay ? 0 : ($amount - $balance)
        ];
    } catch (Exception $e) {
        error_log("❌ ERROR in can_pay_with_wallet: " . $e->getMessage());
        return ['can_pay' => false, 'balance' => 0, 'required' => $amount, 'shortage' => $amount];
    }
}

/**
 * پرداخت با کیف پول
 */
function process_wallet_payment($user_id, $plan_code, $amount): array {
    global $pdo;
    
    error_log("🔄 DEBUG process_wallet_payment START: user_id={$user_id}, plan_code={$plan_code}, amount={$amount}");
    
    // بررسی اینکه آیا تراکنش فعالی وجود دارد
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
        error_log("⚠️ DEBUG: Active transaction found and rolled back");
    }
    
    $pdo->beginTransaction();
    
    try {
        // بررسی موجودی
        $wallet_check = can_pay_with_wallet($user_id, $amount);
        if (!$wallet_check['can_pay']) {
            $pdo->rollBack();
            error_log("❌ DEBUG: Insufficient balance - balance={$wallet_check['balance']}, required={$amount}");
            return ['success' => false, 'message' => 'موجودی کیف پول شما کافی نیست.'];
        }
        
        // کسر از کیف پول
        $update_balance = $pdo->prepare("UPDATE users SET balance = balance - :amount WHERE id = :id");
        $balance_result = $update_balance->execute([':amount' => $amount, ':id' => $user_id]);
        
        if (!$balance_result) {
            $pdo->rollBack();
            error_log("❌ DEBUG: Failed to update balance");
            return ['success' => false, 'message' => 'خطا در کسر از کیف پول.'];
        }
        
        // ثبت تراکنش کیف پول
        $tx_stmt = $pdo->prepare("
            INSERT INTO wallet_transactions (user_id, amount, type, status, description) 
            VALUES (:user_id, :amount, 'PURCHASE', 'COMPLETED', :description)
        ");
        $tx_result = $tx_stmt->execute([
            ':user_id' => $user_id,
            ':amount' => $amount,
            ':description' => 'خرید پلن ' . $plan_code
        ]);
        
        if (!$tx_result) {
            $pdo->rollBack();
            error_log("❌ DEBUG: Failed to insert wallet transaction");
            return ['success' => false, 'message' => 'خطا در ثبت تراکنش.'];
        }
        
        // ایجاد سفارش
        $plan = bot_get_plan($plan_code);
        if (!$plan) {
            $pdo->rollBack();
            error_log("❌ DEBUG: Plan not found - plan_code={$plan_code}");
            return ['success' => false, 'message' => 'پلن مورد نظر یافت نشد.'];
        }

        $order_stmt = $pdo->prepare("
            INSERT INTO orders (user_id, plan_code, plan_title, price, status, payment_method) 
            VALUES (:user_id, :plan_code, :plan_title, :price, 'APPROVED', 'WALLET')
        ");
        $order_result = $order_stmt->execute([
            ':user_id' => $user_id,
            ':plan_code' => $plan_code,
            ':plan_title' => $plan['title'],
            ':price' => $amount
        ]);

        if (!$order_result) {
            $pdo->rollBack();
            error_log("❌ DEBUG: Failed to create order");
            return ['success' => false, 'message' => 'خطا در ایجاد سفارش.'];
        }

        $order_id = $pdo->lastInsertId();
        error_log("✅ DEBUG: Order created - order_id={$order_id}");
        
        // 🔧 بررسی موجودی کانفیگ با جستجوی انعطاف‌پذیر
        $plan_code_clean = trim($plan_code);
        $config_check = $pdo->prepare("SELECT COUNT(*) as count FROM configs WHERE (plan_code = :plan_code OR LOWER(TRIM(plan_code)) = LOWER(:plan_code2)) AND is_used = 0");
        $config_check->execute([':plan_code' => $plan_code_clean, ':plan_code2' => $plan_code_clean]);
        $config_count = $config_check->fetch()['count'];

        if ($config_count == 0) {
            error_log("❌ DEBUG: No configs available for plan_code={$plan_code}");
            
            // اضافه کردن به صف انتظار قبل از کامیت
            add_to_config_waiting_queue((int)$order_id, $user_id, $plan_code);
            error_log("📥 Added order #{$order_id} to waiting queue for plan {$plan_code}");
            
            $pdo->commit();
            
            // اطلاع به ادمین و کاربر بعد از کامیت موفق
            $user_info = $pdo->prepare("SELECT * FROM users WHERE id = :id");
            $user_info->execute([':id' => $user_id]);
            $user = $user_info->fetch();
            
            notify_admins_no_config((int)$order_id, [
                'plan_title' => $plan['title'],
                'plan_code' => $plan_code,
                'price' => $amount
            ], $user);

            // اطلاع به کاربر
            tg('sendMessage', [
                'chat_id' => $user_id,
                'text' => "⏳ **سفارش شما ثبت شد!**\n\n" .
                         "📦 پلن: {$plan['title']}\n" .
                         "💰 مبلغ: " . money($amount) . "\n" .
                         "🆔 شماره سفارش: #{$order_id}\n\n" .
                         "✅ موجودی شما کسر شد.\n" .
                         "🔄 کانفیگ شما تا دقایقی دیگر ارسال خواهد شد.",
                'parse_mode' => 'Markdown',
                'reply_markup' => kb_wallet()
            ]);
            
            return [
                'success' => false, 
                'message' => 'کانفیگ برای این پلن در حال حاضر موجود نیست. تا دقایقی دیگر ارسال خواهد شد.',
                'order_id' => $order_id,
                'no_config' => true
            ];
        }

        $pdo->commit();
        
        return [
            'success' => true, 
            'order_id' => $order_id,
            'message' => 'پرداخت با موفقیت انجام شد.',
            'new_balance' => get_user_balance($user_id)
        ];
        
    } catch (Exception $e) {
        // فقط اگر تراکنش فعال است، rollback کن
        if ($pdo->inTransaction()) {
            $pdo->rollBack();
        }
        error_log("❌ ERROR in process_wallet_payment: " . $e->getMessage());
        return ['success' => false, 'message' => 'خطای سیستمی در پردازش پرداخت.'];
    }
}

/**
 * ارسال مستقیم کانفیگ بعد از پرداخت با کیف پول
 */
function deliver_config_after_wallet_payment($order_id, $user_id) {
    global $pdo;
    
    error_log("🔄 DEBUG deliver_config_after_wallet_payment START: order_id={$order_id}, user_id={$user_id}");
    
    // بررسی وجود تراکنش فعال
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
        error_log("⚠️ DEBUG: Active transaction found and rolled back in deliver_config");
    }
    
    try {
        // دریافت اطلاعات سفارش
        $order_stmt = $pdo->prepare("SELECT * FROM orders WHERE id = :id AND user_id = :user_id");
        $order_stmt->execute([':id' => $order_id, ':user_id' => $user_id]);
        $order = $order_stmt->fetch();
        
        if (!$order) {
            error_log("❌ DEBUG: Order not found");
            return false;
        }
        
        // 🔧 جستجوی بهبود یافته کانفیگ
        $plan_code_clean = trim($order['plan_code']);
        error_log("🔍 deliver_config: Looking for config with plan_code = '{$plan_code_clean}'");
        
        // ابتدا جستجوی دقیق
        $config_stmt = $pdo->prepare("SELECT * FROM configs WHERE plan_code = :plan_code AND is_used = 0 ORDER BY id ASC LIMIT 1");
        $config_stmt->execute([':plan_code' => $plan_code_clean]);
        $config = $config_stmt->fetch();
        
        // اگر پیدا نشد، جستجوی case-insensitive
        if (!$config) {
            $config_stmt = $pdo->prepare("SELECT * FROM configs WHERE LOWER(TRIM(plan_code)) = LOWER(:plan_code) AND is_used = 0 ORDER BY id ASC LIMIT 1");
            $config_stmt->execute([':plan_code' => $plan_code_clean]);
            $config = $config_stmt->fetch();
        }
        
        if (!$config) {
            // لاگ کانفیگ‌های موجود
            $available = $pdo->query("SELECT plan_code, COUNT(*) as cnt FROM configs WHERE is_used = 0 GROUP BY plan_code")->fetchAll(PDO::FETCH_ASSOC);
            error_log("❌ DEBUG: Config not found for plan_code={$plan_code_clean}. Available: " . json_encode($available));
            return false;
        }
        
        error_log("✅ deliver_config: Found config #{$config['id']} for plan_code = '{$plan_code_clean}'");
        
        // شروع تراکنش جدید
        $pdo->beginTransaction();
        
        // علامت‌گذاری کانفیگ به عنوان استفاده شده
        $mark_used_stmt = $pdo->prepare("UPDATE configs SET is_used = 1, used_by = :user_id, used_at = NOW() WHERE id = :id");
        $mark_used_stmt->execute([':id' => $config['id'], ':user_id' => $user_id]);
        
        // ذخیره اطلاعات کانفیگ
        $config_data = [
            'title' => $config['title'],
            'plan_code' => $config['plan_code'],
            'config_link' => $config['config_link'] ?? null,
            'config_text' => $config['config_text'] ?? null,
            'config_file_id' => $config['config_file_id'] ?? null,
            'photo_file_id' => $config['photo_file_id'] ?? null
        ];
        
        // محاسبه تاریخ انقضا
        $expiresAt = null;
        if (strpos($order['plan_code'], 'VIP_') === 0) {
            if (preg_match('/VIP_\d+U_(\d+)M/', $order['plan_code'], $m)) {
                $months = (int)$m[1];
                $expiresAt = date('Y-m-d H:i:s', strtotime("+{$months} month"));
            }
        } elseif (strpos($order['plan_code'], 'VOL_') === 0) {
            $expiresAt = date('Y-m-d H:i:s', strtotime('+1 month'));
        }
        
        // ثبت در sales
        $sales_stmt = $pdo->prepare("
            INSERT INTO sales (order_id, user_id, plan_code, plan_title, price, config_data, expires_at) 
            VALUES (:order_id, :user_id, :plan_code, :plan_title, :price, :config_data, :expires_at)
        ");
        $sales_result = $sales_stmt->execute([
            ':order_id' => $order_id,
            ':user_id' => $user_id,
            ':plan_code' => $order['plan_code'],
            ':plan_title' => $order['plan_title'],
            ':price' => $order['price'],
            ':config_data' => json_encode($config_data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),
            ':expires_at' => $expiresAt
        ]);
        
        if (!$sales_result) {
            $pdo->rollBack();
            error_log("❌ DEBUG: Failed to insert into sales");
            return false;
        }
        
        $pdo->commit();
        error_log("✅ DEBUG: Config delivered successfully");
        return $config_data;
        
    } catch (Exception $e) {
        // فقط اگر تراکنش فعال است، rollback کن
        if ($pdo->inTransaction()) {
            $pdo->rollBack();
        }
        error_log("❌ ERROR in deliver_config_after_wallet_payment: " . $e->getMessage());
        return false;
    }
}

/**
 * ساخت کیبورد پرداخت با نمایش موجودی
 */
function kb_payment_with_wallet($plan_code, $amount, $user_id): array {
    $wallet_check = can_pay_with_wallet($user_id, $amount);
    $balance = $wallet_check['balance'];
    
    $keyboard = [
        'inline_keyboard' => []
    ];
    
    // دکمه پرداخت با کیف پول (فقط اگر موجودی کافی باشد)
    if ($wallet_check['can_pay']) {
        $keyboard['inline_keyboard'][] = [
            ['text' => "💰 پرداخت با کیف پول (موجودی: " . money($balance) . ")", 'callback_data' => 'WALLET_PAY__' . $plan_code]
        ];
    } else {
        $keyboard['inline_keyboard'][] = [
            ['text' => "❌ موجودی کافی نیست (نیاز: " . money($amount) . ")", 'callback_data' => 'SHOW_WALLET']
        ];
    }
    
    // دکمه پرداخت معمولی
    $keyboard['inline_keyboard'][] = [
        ['text' => '💳 پرداخت کارت به کارت', 'callback_data' => 'SEND_RECEIPT__' . $plan_code]
    ];
    
    $keyboard['inline_keyboard'][] = [
        ['text' => '◀️ بازگشت', 'callback_data' => 'BUY']
    ];
    
    return $keyboard;
}
/*──────────────────────── Broadcast System */
/**
 * سیستم پیام عمومی با لاگ حرفه‌ای
 */

// تابع لاگ‌گیری پیشرفته
function log_broadcast($admin_id, $message, $total_users, $success_count, $failed_count, $message_type = 'text') {
    global $pdo;
    
    $stmt = $pdo->prepare("
        INSERT INTO broadcast_logs 
        (admin_id, message, total_users, success_count, failed_count, message_type, created_at) 
        VALUES (:admin_id, :message, :total_users, :success_count, :failed_count, :message_type, NOW())
    ");
    
    $stmt->execute([
        ':admin_id' => $admin_id,
        ':message' => $message,
        ':total_users' => $total_users,
        ':success_count' => $success_count,
        ':failed_count' => $failed_count,
        ':message_type' => $message_type
    ]);
    
    return $pdo->lastInsertId();
}

// تابع گرفتن تعداد کل کاربران
function get_total_users_count() {
    global $pdo;
    $stmt = $pdo->prepare("SELECT COUNT(*) as count FROM users");
    $stmt->execute();
    $result = $stmt->fetch();
    return $result ? (int)$result['count'] : 0;
}

// تابع ارسال پیام به کاربر
function send_broadcast_message($user_id, $message_data, $message_type) {
    try {
        if ($message_type === 'text') {
            $result = tg('sendMessage', [
                'chat_id' => $user_id,
                'text' => $message_data,
                'parse_mode' => 'HTML',
                'disable_web_page_preview' => true
            ]);
        } elseif ($message_type === 'photo') {
            $result = tg('sendPhoto', [
                'chat_id' => $user_id,
                'photo' => $message_data['photo_file_id'],
                'caption' => $message_data['caption'] ?? '',
                'parse_mode' => 'HTML'
            ]);
        } elseif ($message_type === 'document') {
            $result = tg('sendDocument', [
                'chat_id' => $user_id,
                'document' => $message_data['document_file_id'],
                'caption' => $message_data['caption'] ?? '',
                'parse_mode' => 'HTML'
            ]);
        }
        
        return ['success' => true, 'result' => $result];
    } catch (Exception $e) {
        return ['success' => false, 'error' => $e->getMessage()];
    }
}

// کیبورد پیام عمومی
function kb_admin_broadcast(): array {
    return [
        'inline_keyboard' => [
            [
                ['text' => '📝 پیام متنی', 'callback_data' => 'ADMIN_BROADCAST_TEXT'],
                ['text' => '🖼️ پیام با عکس', 'callback_data' => 'ADMIN_BROADCAST_PHOTO'],
            ],
            [
                ['text' => '📎 پیام با فایل', 'callback_data' => 'ADMIN_BROADCAST_DOCUMENT'],
            ],
            [
                ['text' => '📊 مشاهده گزارش‌ها', 'callback_data' => 'ADMIN_BROADCAST_LOGS'],
            ],
            [
                ['text' => '◀️ بازگشت', 'callback_data' => 'ADMIN'],
            ],
        ]
    ];
}
/*──────────────────────── Advanced Broadcast System */
/**
 * سیستم پیام عمومی پیشرفته با لاگ‌گیری کامل و مدیریت خطا
 */

// تابع پیشرفته برای ارسال پیام عمومی
function advanced_broadcast_message($admin_id, $message_data, $message_type) {
    global $pdo;
    
    try {
        // شروع تراکنش برای اطمینان از یکپارچگی داده‌ها
        $pdo->beginTransaction();
        
        // 1. دریافت لیست تمام کاربران
        $users_stmt = $pdo->prepare("SELECT id FROM users WHERE id != ? ORDER BY id ASC");
        $users_stmt->execute([$admin_id]);
        $users = $users_stmt->fetchAll(PDO::FETCH_COLUMN);
        
        $total_users = count($users);
        $success_count = 0;
        $failed_count = 0;
        $failed_users = [];
        
        // 2. ثبت لاگ اولیه
        $log_id = log_broadcast_start($admin_id, $message_data, $total_users, $message_type);
        
        // 3. ارسال پیام به کاربران
        foreach ($users as $index => $user_id) {
            try {
                $result = send_single_broadcast($user_id, $message_data, $message_type);
                
                if ($result['success']) {
                    $success_count++;
                    
                    // آپدیت لاگ هر 10 کاربر
                    if ($success_count % 10 === 0) {
                        update_broadcast_progress($log_id, $success_count, $failed_count);
                    }
                } else {
                    $failed_count++;
                    $failed_users[] = [
                        'user_id' => $user_id,
                        'error' => $result['error']
                    ];
                    
                    error_log("❌ Broadcast failed for user {$user_id}: " . $result['error']);
                }
                
                // تاخیر برای رعایت محدودیت‌های تلگرام
                usleep(100000); // 0.1 ثانیه
                
            } catch (Exception $e) {
                $failed_count++;
                $failed_users[] = [
                    'user_id' => $user_id,
                    'error' => $e->getMessage()
                ];
                error_log("❌ Broadcast exception for user {$user_id}: " . $e->getMessage());
            }
        }
        
        // 4. ثبت نتایج نهایی
        $final_log = update_broadcast_completion($log_id, $success_count, $failed_count, $failed_users);
        
        // کامیت تراکنش
        $pdo->commit();
        
        return [
            'success' => true,
            'log_id' => $log_id,
            'total_users' => $total_users,
            'success_count' => $success_count,
            'failed_count' => $failed_count,
            'failed_users' => $failed_users,
            'success_rate' => $total_users > 0 ? round(($success_count / $total_users) * 100, 2) : 0
        ];
        
    } catch (Exception $e) {
        $pdo->rollBack();
        error_log("❌ Broadcast system error: " . $e->getMessage());
        
        return [
            'success' => false,
            'error' => $e->getMessage()
        ];
    }
}

// تابع ثبت شروع ارسال
function log_broadcast_start($admin_id, $message_data, $total_users, $message_type) {
    global $pdo;
    
    $message_content = '';
    if ($message_type === 'text') {
        $message_content = $message_data;
    } elseif (in_array($message_type, ['photo', 'document'])) {
        $message_content = $message_data['caption'] ?? '';
    }
    
    $stmt = $pdo->prepare("
        INSERT INTO broadcast_logs 
        (admin_id, message, total_users, success_count, failed_count, message_type, status, created_at) 
        VALUES (:admin_id, :message, :total_users, 0, 0, :message_type, 'PROCESSING', NOW())
    ");
    
    $stmt->execute([
        ':admin_id' => $admin_id,
        ':message' => $message_content,
        ':total_users' => $total_users,
        ':message_type' => $message_type
    ]);
    
    return $pdo->lastInsertId();
}

// تابع آپدیت پیشرفت
function update_broadcast_progress($log_id, $success_count, $failed_count) {
    global $pdo;
    
    $stmt = $pdo->prepare("
        UPDATE broadcast_logs 
        SET success_count = :success, failed_count = :failed, updated_at = NOW() 
        WHERE id = :id
    ");
    
    $stmt->execute([
        ':success' => $success_count,
        ':failed' => $failed_count,
        ':id' => $log_id
    ]);
}

// تابع ثبت اتمام ارسال
function update_broadcast_completion($log_id, $success_count, $failed_count, $failed_users = []) {
    global $pdo;
    
    $status = $failed_count > 0 ? 'COMPLETED_WITH_ERRORS' : 'COMPLETED';
    
    $stmt = $pdo->prepare("
        UPDATE broadcast_logs 
        SET success_count = :success, failed_count = :failed, status = :status, 
            failed_users = :failed_users, completed_at = NOW() 
        WHERE id = :id
    ");
    
    $stmt->execute([
        ':success' => $success_count,
        ':failed' => $failed_count,
        ':status' => $status,
        ':failed_users' => json_encode($failed_users, JSON_UNESCAPED_UNICODE),
        ':id' => $log_id
    ]);
    
    return $stmt->rowCount();
}
// تابع ارسال تک پیام - نسخه اصلاح شده
function send_single_broadcast($user_id, $message_data, $message_type) {
    try {
        $params = [
            'chat_id' => $user_id,
            'parse_mode' => 'HTML',
            'disable_web_page_preview' => true
        ];
        
        switch ($message_type) {
            case 'text':
                $method = 'sendMessage';
                $params['text'] = $message_data;
                break;
                
            case 'photo':
                $method = 'sendPhoto';
                $params['photo'] = $message_data['photo_file_id'];
                if (!empty($message_data['caption'])) {
                    $params['caption'] = $message_data['caption'];
                    $params['parse_mode'] = 'HTML';
                }
                break;
                
            case 'document':
                $method = 'sendDocument';
                $params['document'] = $message_data['document_file_id'];
                if (!empty($message_data['caption'])) {
                    $params['caption'] = $message_data['caption'];
                    $params['parse_mode'] = 'HTML';
                }
                break;
                
            default:
                throw new Exception("نوع پیام نامعتبر: {$message_type}");
        }
        
        $result = tg($method, $params);
        
        if ($result && isset($result['ok']) && $result['ok'] === true) {
            return ['success' => true, 'message_id' => $result['result']['message_id']];
        } else {
            $error = $result['description'] ?? 'خطای نامشخص از تلگرام';
            return ['success' => false, 'error' => $error];
        }
        
    } catch (Exception $e) {
        return ['success' => false, 'error' => $e->getMessage()];
    }
}

// تابع ایجاد گزارش پیشرفته
function create_advanced_broadcast_report($broadcast_result, $admin_id) {
    $report = "📊 **گزارش پیشرفته ارسال پیام عمومی**\n\n";
    
    $report .= "👥 **آمار کلی:**\n";
    $report .= "• کاربران کل: {$broadcast_result['total_users']} نفر\n";
    $report .= "• ✅ ارسال موفق: {$broadcast_result['success_count']} نفر\n";
    $report .= "• ❌ ارسال ناموفق: {$broadcast_result['failed_count']} نفر\n";
    $report .= "• 📈 نرخ موفقیت: {$broadcast_result['success_rate']}%\n\n";
    
    if ($broadcast_result['failed_count'] > 0) {
        $report .= "⚠️ **کاربران با خطا:**\n";
        $sample_errors = array_slice($broadcast_result['failed_users'], 0, 5);
        foreach ($sample_errors as $failed) {
            $report .= "• کاربر {$failed['user_id']}: {$failed['error']}\n";
        }
        
        if (count($broadcast_result['failed_users']) > 5) {
            $report .= "• ... و " . (count($broadcast_result['failed_users']) - 5) . " کاربر دیگر\n";
        }
        $report .= "\n";
    }
    
    $report .= "🆔 **کد پیگیری:** #{$broadcast_result['log_id']}\n";
    $report .= "⏰ **زمان اتمام:** " . date('Y/m/d H:i:s') . "\n";
    $report .= "👤 **ارسال کننده:** " . ($admin_id ?? 'سیستم');
    
    return $report;
}

// تابع نمایش لاگ‌های قبلی
function get_broadcast_logs($page = 1, $limit = 10) {
    global $pdo;
    
    $offset = ($page - 1) * $limit;
    
    $stmt = $pdo->prepare("
        SELECT bl.*, u.first_name, u.last_name 
        FROM broadcast_logs bl 
        LEFT JOIN users u ON bl.admin_id = u.id 
        ORDER BY bl.created_at DESC 
        LIMIT :limit OFFSET :offset
    ");
    
    $stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
    $stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
    $stmt->execute();
    
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

// کیبورد پیشرفته پیام عمومی
function kb_advanced_broadcast(): array {
    return [
        'inline_keyboard' => [
            [
                ['text' => '📝 پیام متنی', 'callback_data' => 'ADMIN_BROADCAST_TEXT'],
                ['text' => '🖼️ پیام با عکس', 'callback_data' => 'ADMIN_BROADCAST_PHOTO'],
            ],
            [
                ['text' => '📎 پیام با فایل', 'callback_data' => 'ADMIN_BROADCAST_DOCUMENT'],
            ],
            [
                ['text' => '📊 مشاهده گزارش‌ها', 'callback_data' => 'ADMIN_BROADCAST_LOGS'],
                ['text' => '🔄 آمار کاربران', 'callback_data' => 'ADMIN_BROADCAST_STATS'],
            ],
            [
                ['text' => '◀️ بازگشت', 'callback_data' => 'ADMIN'],
            ],
        ]
    ];
}

// کیبورد گزارش‌ها
function kb_broadcast_logs($current_page = 1, $total_pages = 1): array {
    $keyboard = [
        'inline_keyboard' => []
    ];
    
    // دکمه‌های صفحه‌بندی
    $pagination_buttons = [];
    if ($current_page > 1) {
        $pagination_buttons[] = ['text' => '◀️ صفحه قبل', 'callback_data' => 'ADMIN_BROADCAST_LOGS_PAGE__' . ($current_page - 1)];
    }
    
    $pagination_buttons[] = ['text' => "📄 صفحه {$current_page}", 'callback_data' => 'ADMIN_BROADCAST_LOGS_CURRENT'];
    
    if ($current_page < $total_pages) {
        $pagination_buttons[] = ['text' => 'صفحه بعد ▶️', 'callback_data' => 'ADMIN_BROADCAST_LOGS_PAGE__' . ($current_page + 1)];
    }
    
    if (!empty($pagination_buttons)) {
        $keyboard['inline_keyboard'][] = $pagination_buttons;
    }
    
    $keyboard['inline_keyboard'][] = [
        ['text' => '🔄 بروزرسانی', 'callback_data' => 'ADMIN_BROADCAST_LOGS'],
        ['text' => '◀️ بازگشت', 'callback_data' => 'ADMIN_BROADCAST'],
    ];
    
    return $keyboard;
}
/*──────────────────────── Keyboards */
function kb_main_user(bool $is_admin=false): array {
  $rows = [
    [
      ['text'=>'🧪 اکانت تست',   'callback_data'=>'TEST'],
      ['text'=>'🛒 خرید اشتراک', 'callback_data'=>'BUY'],
    ],
    [
      ['text'=>'📦 سرویس‌های من', 'callback_data'=>'MY_SERVICES'],
      ['text'=>'💰 کیف پول + حساب من', 'callback_data'=>'WALLET'],
    ],
    [
      ['text'=>'📚 راهنمای اتصال', 'callback_data'=>'GUIDE'],
      ['text'=>'🆘 پشتیبانی',     'url'=>SUPPORT_LINK],
    ],
    [
      ['text'=>'ℹ️ درباره فروشگاه', 'callback_data'=>'ABOUT'],
    ]
  ];
  if ($is_admin) {
    $rows[] = [
      ['text'=>'🛠️ پنل ادمین', 'callback_data'=>'ADMIN'],
    ];
  }
  return ['inline_keyboard'=>$rows];
}

function reply_main_kb(): array {
  return [
    'keyboard' => [
      [ ['text'=>'🧪 اکانت تست'], ['text'=>'🛒 خرید اشتراک'] ],
      [ ['text'=>'📦 سرویس‌های من'], ['text'=>'💰 کیف پول + حساب من'] ],
      [ ['text'=>'📚 راهنمای اتصال'], ['text'=>'🆘 پشتیبانی'] ],
      [ ['text'=>'ℹ️ درباره فروشگاه'], ['text'=>'🏠 منو اصلی'] ],
    ],
    'resize_keyboard' => true,
    'is_persistent'   => false  // 🔧 حالا کاربر می‌تونه کیبورد رو جمع کنه
  ];
}

function kb_back(string $data='BACK_MAIN'): array {
  return ['inline_keyboard'=>[[['text'=>'◀️ بازگشت','callback_data'=>$data]]]];
}

function kb_buy_root(): array {
  return [
    'inline_keyboard'=>[
      [
        ['text'=>'👑 نامحدود VIP | یک‌ماهه', 'callback_data'=>'BUY_CAT_VIP_1M'],
      ],
      [
        ['text'=>'⏳ نامحدود VIP | سه‌ماهه', 'callback_data'=>'BUY_CAT_VIP_3M'],
      ],
      [
        ['text'=>'📦 حجمی | یک‌ماهه', 'callback_data'=>'BUY_CAT_VOL_1M'],
      ],
      [
        ['text'=>'◀️ بازگشت', 'callback_data'=>'BACK_MAIN'],
      ],
    ]
  ];
}

function plan_button_label(string $code, array $p): string {
  if (preg_match('/^VIP_(\d+)U_(\d+)M$/', $code, $m)) {
    return (int)$m[1].' کاربر — '.money((int)$p['price']);
  }
  if (preg_match('/^VOL_(\d+)G_1M$/', $code, $m)) {
    return (int)$m[1].' گیگ — '.money((int)$p['price']);
  }
  return $p['title'].' — '.money((int)$p['price']);
}

function kb_plans_by_codes(array $codes): array {
  $btns=[];
  foreach ($codes as $code) {
    $p = bot_get_plan($code);
    if (!$p) continue;
    $btns[] = ['text'=>plan_button_label($code,$p),'callback_data'=>'BUY_PLAN__'.$code];
  }
  $rows=[];
  for ($i=0;$i<count($btns);$i+=1){ 
    $rows[] = [$btns[$i]]; // هر دکمه در یک ردیف جدا
  }
  $rows[] = [['text'=>'◀️ بازگشت','callback_data'=>'BUY']];
  return ['inline_keyboard'=>$rows];
}


function kb_admin_main(): array {
  return [
    'inline_keyboard'=>[
      [
        ['text'=>'🔧 کانفیگ پلاس','callback_data'=>'ADMIN_ADD_ROOT'],
        ['text'=>'📋 سفارش‌ها/گزارش','callback_data'=>'ADMIN_ORDERS'],
      ],
      [
        ['text'=>'⚙️ مدیریت پلن‌ها','callback_data'=>'ADMIN_PLANS'],
        ['text'=>'📊 آمار فروش','callback_data'=>'ADMIN_STATS'],
      ],
      [
        ['text'=>'📢 پیام عمومی','callback_data'=>'ADMIN_BROADCAST'],
      ],
      [['text'=>'◀️ خروج','callback_data'=>'BACK_MAIN']],
    ]
  ];
}

function kb_admin_add_root(): array {
  return [
    'inline_keyboard'=>[
      [
        ['text'=>'👑 VIP 1ماهه','callback_data'=>'ADMIN_ADD_CAT_VIP_1M'],
        ['text'=>'⏳ VIP 3ماهه','callback_data'=>'ADMIN_ADD_CAT_VIP_3M'],
      ],
      [
        ['text'=>'📦 حجمی 1ماهه','callback_data'=>'ADMIN_ADD_CAT_VOL_1M'],
        ['text'=>'🧪 تست','callback_data'=>'ADMIN_ADD_CAT_TEST'],
      ],
      [['text'=>'◀️ بازگشت','callback_data'=>'ADMIN']],
    ]
  ];
}

function kb_admin_plans_by_codes(array $codes): array {
  $btns=[];
  foreach ($codes as $code) {
    $p = bot_get_plan($code);
    if (!$p) continue;
    $btns[] = ['text'=>'➕ '.$p['title'].' — '.money((int)$p['price']), 'callback_data'=>'ADMIN_ADD_PLAN__'.$code];
  }
  $rows=[];
  for ($i=0;$i<count($btns);$i+=1){ 
    $rows[] = [$btns[$i]]; // هر دکمه در یک ردیف جدا
  }
  $rows[]=[['text'=>'◀️ بازگشت','callback_data'=>'ADMIN_ADD_ROOT']];
  return ['inline_keyboard'=>$rows];
}


function kb_connection_guide(): array {
  return [
    'inline_keyboard'=>[
      [['text'=>'📱 اندروید', 'callback_data'=>'GUIDE_ANDROID']],
      [['text'=>'🍎 آیفون', 'callback_data'=>'GUIDE_IOS']],
      [['text'=>'💻 ویندوز', 'callback_data'=>'GUIDE_WINDOWS']],
      [['text'=>'◀️ بازگشت', 'callback_data'=>'BACK_MAIN']],
    ]
  ];
}

/*──────────────────────── MESSAGE HANDLER */
if (isset($update['message'])) {
  $m = $update['message'];
  $chat_id = $m['chat']['id'];
  $from = $m['from'];
  ensureUser($from);

  // حالت‌های پیام عمومی - این بخش را اضافه کنید
  $mode = getUserMode($from['id']);
  
  // پیام متنی عمومی
  if ($mode && $mode['mode'] === 'ADMIN_BROADCAST_TEXT') {
      if (empty($m['text'])) {
          tg('sendMessage', [
              'chat_id' => $chat_id,
              'text' => '❌ لطفاً یک متن معتبر ارسال کنید.'
          ]);
          exit;
      }
      
      $message_text = $m['text'];
      
      // اطلاع شروع ارسال
      $progress_msg = tg('sendMessage', [
          'chat_id' => $chat_id,
          'text' => "🚀 **شروع ارسال پیام عمومی**\n\n⏳ در حال آماده‌سازی...",
          'parse_mode' => 'Markdown'
      ]);
      
      $progress_msg_id = $progress_msg['result']['message_id'];
      
      // ارسال با سیستم جدید
      $broadcast_result = advanced_broadcast_message($from['id'], $message_text, 'text');
      
      if ($broadcast_result['success']) {
          $report = create_advanced_broadcast_report($broadcast_result, $from['id']);
          
          // آپدیت پیام پیشرفت
          tg('editMessageText', [
              'chat_id' => $chat_id,
              'message_id' => $progress_msg_id,
              'text' => $report,
              'parse_mode' => 'Markdown',
              'reply_markup' => kb_advanced_broadcast()
          ]);
      } else {
          tg('editMessageText', [
              'chat_id' => $chat_id,
              'message_id' => $progress_msg_id,
              'text' => "❌ **خطا در ارسال پیام عمومی**\n\nخطا: {$broadcast_result['error']}",
              'parse_mode' => 'Markdown',
              'reply_markup' => kb_advanced_broadcast()
          ]);
      }
      
      clearUserMode($from['id']);
      exit;
  }

  // پیام با عکس عمومی
  if ($mode && $mode['mode'] === 'ADMIN_BROADCAST_PHOTO') {
      if (empty($m['photo'])) {
          tg('sendMessage', [
              'chat_id' => $chat_id,
              'text' => '❌ لطفاً یک عکس معتبر ارسال کنید.'
          ]);
          exit;
      }
      
      $photo = end($m['photo']);
      $photo_file_id = $photo['file_id'];
      $caption = $m['caption'] ?? '';
      
      $message_data = [
          'photo_file_id' => $photo_file_id,
          'caption' => $caption
      ];
      
      $progress_msg = tg('sendMessage', [
          'chat_id' => $chat_id,
          'text' => "🚀 **شروع ارسال عکس عمومی**\n\n⏳ در حال آماده‌سازی...",
          'parse_mode' => 'Markdown'
      ]);
      
      $progress_msg_id = $progress_msg['result']['message_id'];
      
      $broadcast_result = advanced_broadcast_message($from['id'], $message_data, 'photo');
      
      if ($broadcast_result['success']) {
          $report = create_advanced_broadcast_report($broadcast_result, $from['id']);
          
          tg('editMessageText', [
              'chat_id' => $chat_id,
              'message_id' => $progress_msg_id,
              'text' => $report,
              'parse_mode' => 'Markdown',
              'reply_markup' => kb_advanced_broadcast()
          ]);
      } else {
          tg('editMessageText', [
              'chat_id' => $chat_id,
              'message_id' => $progress_msg_id,
              'text' => "❌ **خطا در ارسال عکس عمومی**\n\nخطا: {$broadcast_result['error']}",
              'parse_mode' => 'Markdown',
              'reply_markup' => kb_advanced_broadcast()
          ]);
      }
      
      clearUserMode($from['id']);
      exit;
  }

  // پیام با فایل عمومی
  if ($mode && $mode['mode'] === 'ADMIN_BROADCAST_DOCUMENT') {
      if (empty($m['document'])) {
          tg('sendMessage', [
              'chat_id' => $chat_id,
              'text' => '❌ لطفاً یک فایل معتبر ارسال کنید.'
          ]);
          exit;
      }
      
      $document_file_id = $m['document']['file_id'];
      $caption = $m['caption'] ?? '';
      
      $message_data = [
          'document_file_id' => $document_file_id,
          'caption' => $caption
      ];
      
      $progress_msg = tg('sendMessage', [
          'chat_id' => $chat_id,
          'text' => "🚀 **شروع ارسال فایل عمومی**\n\n⏳ در حال آماده‌سازی...",
          'parse_mode' => 'Markdown'
      ]);
      
      $progress_msg_id = $progress_msg['result']['message_id'];
      
      $broadcast_result = advanced_broadcast_message($from['id'], $message_data, 'document');
      
      if ($broadcast_result['success']) {
          $report = create_advanced_broadcast_report($broadcast_result, $from['id']);
          
          tg('editMessageText', [
              'chat_id' => $chat_id,
              'message_id' => $progress_msg_id,
              'text' => $report,
              'parse_mode' => 'Markdown',
              'reply_markup' => kb_advanced_broadcast()
          ]);
      } else {
          tg('editMessageText', [
              'chat_id' => $chat_id,
              'message_id' => $progress_msg_id,
              'text' => "❌ **خطا در ارسال فایل عمومی**\n\nخطا: {$broadcast_result['error']}",
              'parse_mode' => 'Markdown',
              'reply_markup' => kb_advanced_broadcast()
          ]);
      }
      
      clearUserMode($from['id']);
      exit;
  }

  // /start
  if (!empty($m['text']) && strpos($m['text'], '/start')===0) {
      
    // ریست کردن مودهای گیرکرده مثل ADMIN_BROADCAST_DOCUMENT
    clearUserMode($from['id']);

    // بررسی عضویت در کانال
    if (!isMember($from['id'])) {
      $welcome = "👋 به ".SHOP_NAME." خوش آمدید.\n\n";
      $welcome .= "📢 برای استفاده از ربات، ابتدا باید در کانال ما عضو شوید:\n";
      $welcome .= "https://t.me/anyconnect_iran\n\n";
      $welcome .= "پس از عضویت، دوباره /start را بفرستید.";
      
      $kb = [
        'inline_keyboard' => [
          [['text'=>'📢 عضویت در کانال', 'url'=>'https://t.me/anyconnect_iran']],
          [['text'=>'✅ بررسی عضویت', 'callback_data'=>'CHECK_MEMBERSHIP']]
        ]
      ];
      
      tg('sendMessage', [
        'chat_id'=>$chat_id,
        'text'=>$welcome,
        'reply_markup'=>$kb,
        'disable_web_page_preview'=>true
      ]);
      exit;
    }
    
    $welcome = "🛍️ فروشگاه اکانت‌های پریمیوم، VPN و سرویس‌های دیجیتال با پشتیبانی سریع\n📢 @anyconnect_iran | 📢 @GEM_ACC\n\n👋 به ".SHOP_NAME." خوش آمدید.\nفقط V2Ray".(V2_ONLY?' ✅':'')."\n@anyconnect_iran";
    tg('sendMessage', ['chat_id'=>$chat_id,'text'=>$welcome,'reply_markup'=>reply_main_kb()]);
    tg('sendMessage', ['chat_id'=>$chat_id,'text'=>'منوی اصلی:','reply_markup'=>kb_main_user(isAdmin($from['id']))]);
    exit;
  }

  // /admin
  if (!empty($m['text']) && trim($m['text'])==='/admin' && isAdmin($from['id'])) {
    tg('sendMessage', ['chat_id'=>$chat_id,'text'=>'🛠️ پنل ادمین','reply_markup'=>kb_admin_main()]);
    exit;
  }

  // شورتکات‌های ReplyKeyboard
  if (!empty($m['text'])) {
    $t = trim($m['text']);
    if ($t==='🛒 خرید اشتراک') { 
      tg('sendMessage',['chat_id'=>$chat_id,'text'=>'یک دسته را انتخاب کنید:','reply_markup'=>kb_buy_root()]); 
      exit; 
    }
    if ($t==='🧪 اکانت تست') {
      $r=$pdo->prepare("SELECT test_claimed FROM users WHERE id=:id"); $r->execute([':id'=>$from['id']]); $row=$r->fetch();
      if ($row && (int)$row['test_claimed']===1) { 
        tg('sendMessage',[
          'chat_id'=>$chat_id,
          'text'=>'⏳ قبلاً تست دریافت کرده‌اید.',
          'reply_markup'=>reply_main_kb()
        ]); 
        exit; 
      }
      $cfg=$pdo->query("SELECT * FROM configs WHERE plan_code LIKE 'TEST_%' AND is_used = 0 ORDER BY id DESC LIMIT 1")->fetch();
      if (!$cfg) { 
        $msg = "🤷‍♂️ فعلاً تست در ربات موجود نیست!\n\n";
        $msg .= "💡 اما می‌تونی از پشتیبانی تست دریافت کنی:\n";
        $msg .= SUPPORT_LINK."\n\n";
        $msg .= "✅ اعتبار تستت محفوظ می‌مونه برای وقتی که تست تو ربات فعال شد.";
        tg('sendMessage',[
          'chat_id'=>$chat_id,
          'text'=>$msg,
          'reply_markup'=>reply_main_kb(),
          'disable_web_page_preview'=>true
        ]);
        exit; 
      }
      tg('sendMessage',[
        'chat_id'=>$chat_id,
        'text'=>"برای دریافت تست، شماره تماس خود را ارسال کنید.",
        'reply_markup'=>kb_back('BACK_MAIN')
      ]);
      tg('sendMessage',[
        'chat_id'=>$chat_id,
        'text'=>'📱 روی دکمه زیر بزنید تا شماره‌تان ارسال شود:',
        'reply_markup'=>[
          'keyboard'=>[[['text'=>'ارسال شماره 📱','request_contact'=>true]]],
          'resize_keyboard'=>true,
          'one_time_keyboard'=>true
        ]
      ]);
      setUserMode($from['id'],'AWAIT_TEST_PHONE',[]); 
      exit;
    }
    if ($t==='📦 سرویس‌های من') {
    $q=$pdo->prepare("SELECT * FROM sales WHERE user_id=:u ORDER BY id DESC LIMIT 20"); 
    $q->execute([':u'=>$from['id']]); 
    $rows=$q->fetchAll();
    
    if (!$rows) {
        tg('sendMessage',[
            'chat_id'=>$chat_id,
            'text'=>'📭 هنوز سرویسی ندارید.',
            'reply_markup'=>reply_main_kb()
        ]);
    } else { 
        $ik = [];
        foreach ($rows as $s) {
            // استخراج اطلاعات از plan_code
            $duration = '';
            $user_count = '';
            
            if (strpos($s['plan_code'], 'VIP_') === 0) {
                if (preg_match('/VIP_(\d+)U_(\d+)M/', $s['plan_code'], $matches)) {
                    $user_count = $matches[1] . 'کاربر';
                    $months = (int)$matches[2];
                    $duration = $months == 1 ? '1ماه' : ($months == 3 ? '3ماه' : $months . 'ماه');
                }
            } elseif (strpos($s['plan_code'], 'VOL_') === 0) {
                if (preg_match('/VOL_(\d+)G_1M/', $s['plan_code'], $matches)) {
                    $user_count = '1کاربر';
                    $duration = '1ماه';
                }
            } elseif (strpos($s['plan_code'], 'TEST_') === 0) {
                $user_count = '1کاربر';
                $duration = '1روز';
            } else {
                // برای پلن‌های دیگر
                $user_count = '1کاربر';
                $duration = '1ماه';
            }
            
            // تاریخ شمسی تحویل
            $jdate = '';
            if (!empty($s['delivered_at'])) {
                $jdate = jdate('d/m', strtotime($s['delivered_at']));
            } else {
                $jdate = 'نامشخص';
            }
            
            // ساخت متن دکمه با فرمت جدید
            $button_text = "{$jdate}|{$duration}|{$user_count}";
            
            $ik[] = [['text'=>$button_text, 'callback_data'=>'SERVICE_INFO__'.$s['id']]];
        }
        $ik[] = [['text'=>'◀️ بازگشت', 'callback_data'=>'BACK_MAIN']];
        
        tg('sendMessage',[
            'chat_id'=>$chat_id,
            'text'=>"📦 سرویس‌های فعال شما:\n\nبرای مشاهده جزئیات هر سرویس، روی آن کلیک کنید:",
            'reply_markup'=>['inline_keyboard'=>$ik]
        ]);
    }
    exit;
}
    if ($t === '💰 کیف پول + حساب من') {
    $text = build_wallet_info_text($from['id']);
    
    tg('sendMessage', [
        'chat_id' => $chat_id,
        'text' => $text,
        'parse_mode' => 'Markdown',
        'reply_markup' => kb_wallet()
    ]);
    exit;
}

    if ($t==='📚 راهنمای اتصال') {
      tg('sendMessage', [
        'chat_id'=>$chat_id,
        'text'=>'📚 راهنمای اتصال\n\nلطفاً دستگاه خود را انتخاب کنید:',
        'reply_markup'=>kb_connection_guide()
      ]);
      exit;
    }
    if ($t==='ℹ️ درباره فروشگاه') {
      $about = "ℹ️ درباره فروشگاه\n\n";
      $about .= "🛍️ پیشگام سرور\n";
      $about .= "https://t.me/anyconnect_iran\n\n";
      $about .= "🛍️ جم اکانت\n";
      $about .= "https://t.me/GEM_ACC\n\n";
      $about .= "📝 شرح فعالیت:\n";
      $about .= "فروش اکانت‌های پریمیوم (V2Ray، Windscribe، ExpressVPN و …)\n";
      $about .= "اکانت‌های هوش مصنوعی (ChatGPT، Midjourney، Claude، Gemini)\n";
      $about .= "اشتراک‌های موزیک/ویدیو (Spotify، Apple Music، SoundCloud، YouTube Premium، Netflix)\n\n";
      $about .= "👨‍💻 پشتیبانی:\n";
      $about .= "@anyconnect_admin\n";
      $about .= "@GEMacc_admin";
      
      tg('sendMessage', [
        'chat_id'=>$chat_id,
        'text'=>$about,
        'disable_web_page_preview'=>true,
        'reply_markup'=>kb_back('BACK_MAIN')
      ]);
      exit;
    }
    if ($t==='🆘 پشتیبانی') { 
      tg('sendMessage',[
        'chat_id'=>$chat_id,
        'text'=>'💬 برای پشتیبانی: '.SUPPORT_LINK,
        'disable_web_page_preview'=>true,
        'reply_markup'=>reply_main_kb()
      ]); 
      exit; 
    }
    if ($t==='🏠 منو اصلی') { 
      tg('sendMessage',[
        'chat_id'=>$chat_id,
        'text'=>'🏠 منوی اصلی:',
        'reply_markup'=>kb_main_user(isAdmin($from['id']))
      ]); 
      exit; 
    }
  }

  // حالت‌ها
  $mode = getUserMode($from['id']);
  // افزایش موجودی - مرحله مبلغ دلخواه
  if ($mode && $mode['mode'] === 'AWAIT_CUSTOM_AMOUNT') {
    if (empty($m['text']) || !ctype_digit(trim($m['text']))) {
      tg('sendMessage', [
        'chat_id' => $chat_id,
        'text'    => "❌ لطفاً مبلغ را فقط به صورت عدد (بدون کاما) وارد کنید.\nمثال: 75000",
      ]);
      exit;
    }

    $amount = (int)trim($m['text']);

    // حداقل مبلغ اختیاری
    if ($amount < 10000) {
      tg('sendMessage', [
        'chat_id' => $chat_id,
        'text'    => "❌ مبلغ وارد شده خیلی کم است.\nحداقل مبلغ: ۱۰,۰۰۰ تومان",
      ]);
      exit;
    }

    // ست کردن مود برای دریافت رسید این مبلغ
    setUserMode($from['id'], 'AWAIT_DEPOSIT_RECEIPT', ['amount' => $amount]);

    $text  = "💰 **افزایش موجودی به مبلغ " . money($amount) . "**\n\n";
    $text .= "📋 **مراحل افزایش موجودی:**\n";
    $text .= "1️⃣ مبلغ " . money($amount) . " به شماره کارت زیر واریز کنید\n";
    $text .= "2️⃣ رسید پرداخت را برای ما ارسال کنید (عکس، فایل یا متن)\n";
    $text .= "3️⃣ پس از تایید ادمین، موجودی شما اضافه خواهد شد\n\n";
    $text .= "💳 **شماره کارت:**\n";
    $text .= "`" . CARD_NUMBER . "`\n\n";
    $text .= "📤 حالا رسید واریزی خود را ارسال کنید.";

    tg('sendMessage', [
      'chat_id' => $chat_id,
      'text'    => $text,
      'parse_mode' => 'Markdown',
      'reply_markup' => [
        'inline_keyboard' => [
          [ ['text' => '◀️ بازگشت', 'callback_data' => 'ADD_BALANCE'] ]
        ]
      ]
    ]);
    exit;
  }// افزایش موجودی - دریافت رسید و ساخت تراکنش
if ($mode && $mode['mode'] === 'AWAIT_DEPOSIT_RECEIPT' && isset($mode['payload']['amount'])) {
    $amount = (int)$mode['payload']['amount'];

    $file_id = null;
    $text    = null;

    if (!empty($m['photo'])) {
      $photo   = end($m['photo']);
      $file_id = $photo['file_id'];
    } elseif (!empty($m['document']['file_id'])) {
      $file_id = $m['document']['file_id'];
    } elseif (!empty($m['text'])) {
      $text = $m['text'];
    }

    if (!$file_id && !$text) {
      tg('sendMessage', [
        'chat_id' => $chat_id,
        'text'    => "❌ لطفاً یک عکس، فایل یا متنِ رسید ارسال کنید."
      ]);
      exit;
    }

    // ساخت رکورد تراکنش
    $tx_id = create_deposit_transaction($from['id'], $amount, $file_id, $text);

    if (!$tx_id) {
      tg('sendMessage', [
        'chat_id' => $chat_id,
        'text'    => "❌ خطا در ثبت تراکنش. لطفاً دوباره تلاش کنید یا به پشتیبانی پیام دهید."
      ]);
      exit;
    }
   // دریافت اطلاعات تراکنش و کاربر برای اطلاع‌رسانی به ادمین
    $tx_stmt = $pdo->prepare("SELECT * FROM wallet_transactions WHERE id = :id");
    $tx_stmt->execute([':id' => $tx_id]);
    $transaction = $tx_stmt->fetch(PDO::FETCH_ASSOC);

    $user_stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
    $user_stmt->execute([':id' => $from['id']]);
    $user = $user_stmt->fetch(PDO::FETCH_ASSOC);

    // استفاده از تابع استاندارد برای اطلاع‌رسانی به ادمین
    notify_admins_new_deposit($tx_id, $transaction, $user);

    // 🔥 این دو خط را اضافه کنید:
    clearUserMode($from['id']);

    // پیام به کاربر
    tg('sendMessage', [
        'chat_id' => $chat_id,
        'text'    => "✅ رسید افزایش موجودی شما دریافت شد.\n⏳ پس از بررسی ادمین، موجودی شما شارژ خواهد شد.",
        'reply_markup' => kb_wallet()
    ]);

    exit;
}

  // انتظار رسید خرید
  if ($mode && $mode['mode']==='AWAIT_RECEIPT' && isset($mode['payload']['order_id'])) {
    $oid = (int)$mode['payload']['order_id'];
    $q=$pdo->prepare("SELECT * FROM orders WHERE id=:id AND user_id=:u AND status='PENDING'");
    $q->execute([':id'=>$oid, ':u'=>$from['id']]);
    $ord=$q->fetch();
    if (!$ord) {
      tg('sendMessage',[
        'chat_id'=>$chat_id,
        'text'=>'❌ سفارشی برای ارسال رسید یافت نشد.',
        'reply_markup'=>reply_main_kb()
      ]);
      clearUserMode($from['id']); exit;
    }
    $file_id=null; $text=null;
    if (!empty($m['photo'])) { $photo=end($m['photo']); $file_id=$photo['file_id']; }
    elseif (!empty($m['document']['file_id'])) { $file_id=$m['document']['file_id']; }
    elseif (!empty($m['text'])) { $text=$m['text']; }

    $pdo->prepare("UPDATE orders SET receipt_file_id=:f, receipt_text=:t WHERE id=:id")
        ->execute([':f'=>$file_id, ':t'=>$text, ':id'=>$oid]);

    clearUserMode($from['id']);
    tg('sendMessage',[
      'chat_id'=>$chat_id,
      'text'=>"✅ رسید شما دریافت شد.\n⏳ منتظر تایید ادمین بمانید.",
      'reply_markup'=>reply_main_kb()
    ]);

    // اطلاع به ادمین‌ها با نمایش زیبا
    $user_info = $pdo->prepare("SELECT * FROM users WHERE id=:id");
    $user_info->execute([':id'=>$from['id']]);
    $user = $user_info->fetch();
    
    foreach (array_map('trim', explode(',', ADMIN_IDS)) as $aid) {
      $msg = "📥 رسید جدید\n\n";
      $msg .= "🛒 پلن: {$ord['plan_title']}\n";
      $msg .= "💳 مبلغ: ".money((int)$ord['price'])."\n";
      $msg .= "👤 آیدی عددی کاربر: {$from['id']}\n";
      $msg .= "📛 نام: ".($user['first_name'] ?? 'نامشخص')." ".($user['last_name'] ?? '')."\n";
      $msg .= "🔗 آیدی: @".($user['username'] ?? 'بدون یوزرنیم')."\n";
      $msg .= "📅 شماره سفارش: #{$ord['id']}";
      
      $k=['inline_keyboard'=>[
        [['text'=>'✅ تایید','callback_data'=>'ADMIN_APPROVE__'.$oid],['text'=>'❌ رد','callback_data'=>'ADMIN_REJECT__'.$oid]],
        [['text'=>'🔧 دریافت کانفیگ','callback_data'=>'ADMIN_GETCFG__'.$oid]],
      ]];
      
      if ($file_id) {
        tg('sendPhoto',[
          'chat_id'=>$aid,
          'photo'=>$file_id,
          'caption'=>$msg,
          'reply_markup'=>$k
        ]);
      } else {
        tg('sendMessage',[
          'chat_id'=>$aid,
          'text'=>$msg,
          'reply_markup'=>$k
        ]);
        if ($text) {
          tg('sendMessage',[
            'chat_id'=>$aid,
            'text'=>'📝 متن رسید: '.$text
          ]);
        }
      }
    }
    exit;
  }
// حالت انتظار شماره برای تست
if ($mode && $mode['mode']==='AWAIT_TEST_PHONE') {
    $phone='';
    if (!empty($m['contact']['phone_number'])) $phone=$m['contact']['phone_number'];
    elseif (!empty($m['text'])) $phone=trim($m['text']);
    
    if ($phone==='') { 
        tg('sendMessage',[
            'chat_id'=>$chat_id,
            'text'=>'❌ شماره معتبر ارسال کنید یا از دکمه «ارسال شماره» استفاده کنید.'
        ]); 
        exit; 
    }
    $pdo->prepare("UPDATE users SET test_phone=:p WHERE id=:id")->execute([':p'=>$phone, ':id'=>$from['id']]);
    $row=$pdo->prepare("SELECT test_claimed FROM users WHERE id=:id"); $row->execute([':id'=>$from['id']]); $r=$row->fetch();
    if ($r && (int)$r['test_claimed']===1) { 
      tg('sendMessage',[
        'chat_id'=>$chat_id,
        'text'=>'⚠️ قبلاً تست دریافت کرده‌اید.',
        'reply_markup'=>reply_main_kb()
      ]); 
      clearUserMode($from['id']); 
      exit; 
    }

    $cfg=$pdo->query("SELECT * FROM configs WHERE plan_code LIKE 'TEST_%' AND is_used = 0 ORDER BY id DESC LIMIT 1")->fetch();
    if (!$cfg) { 
      tg('sendMessage',[
        'chat_id'=>$chat_id,
        'text'=>'❌ فعلاً کانفیگ تست موجود نیست.',
        'reply_markup'=>reply_main_kb()
      ]); 
      clearUserMode($from['id']); 
      exit; 
    }

    // علامت‌گذاری کانفیگ تست به عنوان استفاده شده
    $pdo->prepare("UPDATE configs SET is_used=1, used_by=:uid, used_at=NOW() WHERE id=:id")->execute([':id'=>$cfg['id'], ':uid'=>$from['id']]);
    $pdo->prepare("UPDATE users SET test_claimed=1 WHERE id=:id")->execute([':id'=>$from['id']]);

    // ارسال کانفیگ تست
    $caption = "🎉 اکانت تست شما فعال شد!\n\n";
    $caption .= "📱 شماره ثبت شده: $phone\n";
    $caption .= "⏰ مدت تست: 24 ساعت\n\n";
    $caption .= "✅ از سرویس لذت ببرید!";
    
    if (!empty($cfg['photo_file_id'])) {
        $photo_caption = $caption;
        if (!empty($cfg['config_text'])) {
            $photo_caption .= "\n\n📝 کانفیگ:\n".$cfg['config_text'];
        }
        tg('sendPhoto',[
          'chat_id'=>$chat_id,
          'photo'=>$cfg['photo_file_id'],
          'caption'=>$photo_caption
        ]);
    } else {
        tg('sendMessage',['chat_id'=>$chat_id,'text'=>$caption]);
    }
    
    if (!empty($cfg['config_link'])) {
        tg('sendMessage',[
          'chat_id'=>$chat_id,
          'text'=>"🔗 لینک تست:\n".$cfg['config_link']
        ]);
    }
    if (!empty($cfg['config_text']) && empty($cfg['photo_file_id'])) {
        tg('sendMessage',[
          'chat_id'=>$chat_id,
          'text'=>"📝 کانفیگ تست:\n".$cfg['config_text']
        ]);
    }
    if (!empty($cfg['config_file_id'])) {
        tg('sendDocument',[
          'chat_id'=>$chat_id,
          'document'=>$cfg['config_file_id'],
          'caption'=>'📁 فایل کانفیگ تست'
        ]);
    }

    // کیبورد اصلی بازگردانده می‌شود
    tg('sendMessage',[
      'chat_id'=>$chat_id,
      'text'=>'✅ اکانت تست با موفقیت فعال شد!',
      'reply_markup'=>reply_main_kb()
    ]);
    
    clearUserMode($from['id']); 
    exit;
  }
  // ادمین: حالت‌های مختلف (افزودن کانفیگ، افزودن پلن، تغییر قیمت)
  if (isAdmin($from['id'])) {
    $mode = getUserMode($from['id']);

    /* 1) افزودن آزاد کانفیگ برای یک plan_code (ADMIN_ADD_CONTENT) */
    if ($mode && $mode['mode'] === 'ADMIN_ADD_CONTENT' && !empty($mode['payload']['plan_code'])) {

      $plan_code  = $mode['payload']['plan_code'];
      $plan_title = $mode['payload']['plan_title'] ?? $plan_code;

      // متن از text یا caption
      $text = '';
      if (!empty($m['text']))    $text = $m['text'];
      if (!empty($m['caption'])) $text = $m['caption'];

      // عکس
      $photo_id = null;
      if (!empty($m['photo'])) {
        $p = end($m['photo']);
        $photo_id = $p['file_id'];
      }

      // فایل
      $file_id = !empty($m['document']['file_id']) ? $m['document']['file_id'] : null;

      // عنوان
      $title = $plan_title;
      if ($text !== '') {
        $first = trim(preg_split('/\R/', $text, 2)[0]);
        if ($first !== '') {
          $title = mb_substr($first, 0, 120);
        }
      }

      // هیچ‌چی نداد؟
      if ($text === '' && !$photo_id && !$file_id) {
        tg('sendMessage', [
          'chat_id' => $chat_id,
          'text'    => '❌ چیزی برای ذخیره نیامد. متن یا عکس یا فایل بفرست.'
        ]);
        exit;
      }

      // چک تکراری بودن
      $check_stmt = $pdo->prepare("
        SELECT id FROM configs
        WHERE config_text = :txt
           OR config_file_id = :fid
           OR photo_file_id  = :ph
        LIMIT 1
      ");
      $check_stmt->execute([
        ':txt' => $text !== '' ? $text : null,
        ':fid' => $file_id ?: null,
        ':ph'  => $photo_id ?: null,
      ]);
      $existing = $check_stmt->fetch();

      if ($existing) {
        $plan_info = '📊 اطلاعات پلن: ';
        if (strpos($plan_code, 'VIP_') === 0) {
          if (preg_match('/VIP_(\d+)U_(\d+)M/', $plan_code, $matches)) {
            $plan_info .= "👑 VIP | {$matches[1]} کاربر | {$matches[2]} ماه";
          } else {
            $plan_info .= $plan_title;
          }
        } elseif (strpos($plan_code, 'VOL_') === 0) {
          if (preg_match('/VOL_(\d+)G_1M/', $plan_code, $matches)) {
            $plan_info .= "📦 حجمی | {$matches[1]} گیگ | 1 ماه";
          } else {
            $plan_info .= $plan_title;
          }
        } elseif (strpos($plan_code, 'TEST_') === 0) {
          $plan_info .= "🧪 تست | 24 ساعت";
        } else {
          $plan_info .= $plan_title;
        }

        tg('sendMessage', [
          'chat_id' => $chat_id,
          'text'    => "⚠️ این کانفیگ تکراری است و ثبت نشد!\n\n{$plan_info}",
          'reply_markup' => [
            'inline_keyboard' => [
              [
                ['text' => '➕ اضافه کردن از همین دسته', 'callback_data' => 'ADMIN_ADD_PLAN__'.$plan_code],
                ['text' => '📂 اضافه کردن در دسته دیگر', 'callback_data' => 'ADMIN_ADD_ROOT'],
              ],
              [
                ['text' => '◀️ برگشت', 'callback_data' => 'ADMIN'],
              ],
            ]
          ]
        ]);
        exit;
      }

      // اگر تکراری نبود، ذخیره در configs
      try {
        $stmt = $pdo->prepare("
          INSERT INTO configs (plan_code,title,config_link,config_text,config_file_id,photo_file_id,created_by)
          VALUES (:pc,:tt,NULL,:txt,:fid,:ph,:by)
        ");
        $stmt->execute([
          ':pc' => $plan_code,
          ':tt' => $title,
          ':txt'=> ($text !== '' ? $text : null),
          ':fid'=> $file_id ?: null,
          ':ph' => $photo_id ?: null,
          ':by' => $from['id'],
        ]);
        
// 🔥 ارسال کانفیگ به کاربران در صف انتظار
deliver_config_to_waiting_users($plan_code);
      } catch (Throwable $e) {
        error_log('CFG_INSERT_FREE_ERR: '.$e->getMessage());
        tg('sendMessage', [
          'chat_id' => $chat_id,
          'text'    => '❌ خطای ذخیره: '.$e->getMessage(),
        ]);
        exit;
      }
// 🔥 ارسال کانفیگ به کاربران در صف انتظار
deliver_config_to_waiting_users($plan_code);

clearUserMode($from['id']);
      // بعد از ذخیره موفق
      $plan_info = "📊 اطلاعات پلن: ";
      if (strpos($plan_code, 'VIP_') === 0) {
        if (preg_match('/VIP_(\d+)U_(\d+)M/', $plan_code, $matches)) {
          $plan_info .= "👑 VIP | {$matches[1]} کاربر | {$matches[2]} ماه";
        } else {
          $plan_info .= $plan_title;
        }
      } elseif (strpos($plan_code, 'VOL_') === 0) {
        if (preg_match('/VOL_(\d+)G_1M/', $plan_code, $matches)) {
          $plan_info .= "📦 حجمی | {$matches[1]} گیگ | 1 ماه";
        } else {
          $plan_info .= $plan_title;
        }
      } elseif (strpos($plan_code, 'TEST_') === 0) {
        $plan_info .= "🧪 تست | 24 ساعت";
      } else {
        $plan_info .= $plan_title;
      }

      tg('sendMessage', [
        'chat_id' => $chat_id,
        'text'    => "✅ کانفیگ با موفقیت ثبت شد\n\n{$plan_info}",
        'reply_markup' => [
          'inline_keyboard' => [
            [
              ['text' => '➕ اضافه کردن از همین دسته', 'callback_data' => 'ADMIN_ADD_PLAN__'.$plan_code],
              ['text' => '📂 اضافه کردن در دسته دیگر', 'callback_data' => 'ADMIN_ADD_ROOT'],
            ],
            [
              ['text' => '◀️ برگشت', 'callback_data' => 'ADMIN'],
            ],
          ]
        ]
      ]);

      clearUserMode($from['id']);
      exit;
    }

    /* 2) افزودن پلن جدید در مدیریت پلن‌ها (ADMIN_PLANS_ADD) */
    
/* 2) افزودن پلن جدید در مدیریت پلن‌ها (ADMIN_PLANS_ADD) */
if ($mode && $mode['mode'] === 'ADMIN_PLANS_ADD' && !empty($mode['payload']['category'])) {

  $category = $mode['payload']['category'];

  if (empty($m['text'])) {
    tg('sendMessage', [
      'chat_id' => $chat_id,
      'text'    => '❌ لطفاً مقدار را در قالب duration|number_of_users|price ارسال کنید.'
    ]);
    exit;
  }

  $input = trim($m['text']);
  error_log("🔄 ADMIN_PLANS_ADD: input = '{$input}', category = '{$category}'");
  
  $plan = build_plan_from_input($category, $input);

  if (!$plan) {
    // پیام خطا قبلاً در تابع build_plan_from_input ارسال شده
    exit;
  }

  $id = db_upsert_plan($plan);
  $label = plan_category_label($category);

  if ($id > 0) {
    tg('sendMessage', [
      'chat_id' => $chat_id,
      'text'    => "✅ پلن با موفقیت ثبت شد!\n\n📋 اطلاعات پلن:\n• دسته: {$label}\n• کد: {$plan['plan_code']}\n• عنوان: {$plan['title']}\n• قیمت: ".money($plan['price']),
      'reply_markup' => kb_admin_plans_category($category),
    ]);
  } else {
    tg('sendMessage', [
      'chat_id' => $chat_id,
      'text'    => "❌ خطا در ثبت پلن! لطفاً دوباره تلاش کنید."
    ]);
  }

  clearUserMode($from['id']);
  exit;
}

    /* 3) تغییر قیمت پلن (ADMIN_PLANS_EDIT_PRICE) */
    if ($mode && $mode['mode'] === 'ADMIN_PLANS_EDIT_PRICE' && !empty($mode['payload']['plan_id'])) {
      $pid = (int)$mode['payload']['plan_id'];

      if (empty($m['text']) || !ctype_digit(trim($m['text']))) {
        tg('sendMessage', [
          'chat_id' => $chat_id,
          'text'    => '❌ لطفاً قیمت را فقط به صورت عدد (بدون کاما) ارسال کنید.'
        ]);
        exit;
      }

      $price = (int)trim($m['text']);
      db_update_plan_price($pid, $price);

      $stmt = $pdo->prepare("SELECT * FROM plans WHERE id = :id");
      $stmt->execute([':id' => $pid]);
      $plan = $stmt->fetch(PDO::FETCH_ASSOC);

      if ($plan) {
        $cat = $plan['category'];
        tg('sendMessage', [
          'chat_id' => $chat_id,
          'text'    => "✅ قیمت پلن با موفقیت به ".money($price)." به‌روزرسانی شد.",
          'reply_markup' => kb_admin_plans_category($cat),
        ]);
      }

      clearUserMode($from['id']);
      exit;
    }
  }
  // انتهای message handler
  exit;
}

/*──────────────────────── CALLBACK HANDLER */
if (isset($update['callback_query'])) {
  $cq = $update['callback_query'];
  $from = $cq['from']; ensureUser($from);
  $chat_id = $cq['message']['chat']['id'];
  $mid = $cq['message']['message_id'];
  $data = $cq['data'];
    error_log("🎯 CALLBACK RECEIVED: data = {$data}, user_id = {$from['id']}, chat_id = {$chat_id}");
  // 🔥 این لاگ را اضافه کنید
  error_log("=== CALLBACK START ===");
  error_log("Callback data: " . $data);
  error_log("User ID: " . $from['id']);
  error_log("Is admin: " . (isAdmin($from['id']) ? 'YES' : 'NO'));
  error_log("Chat ID: " . $chat_id);
  error_log("Message ID: " . $mid);

  // بررسی عضویت
  if ($data==='CHECK_MEMBERSHIP') {
    if (isMember($from['id'])) {
      tg('editMessageText',[
        'chat_id'=>$chat_id,
        'message_id'=>$mid,
        'text'=>'✅ شما در کانال عضو هستید. اکنون می‌توانید از ربات استفاده کنید.',
        'reply_markup'=>kb_main_user(isAdmin($from['id']))
      ]);
    } else {
      tg('answerCallbackQuery',[
        'callback_query_id'=>$cq['id'],
        'text'=>'❌ هنوز در کانال عضو نشده‌اید!',
        'show_alert'=>true
      ]);
    }
    exit;
  }

  if ($data==='BACK_MAIN') {
    tg('editMessageText',[
      'chat_id'=>$chat_id,
      'message_id'=>$mid,
      'text'=>'🏠 منوی اصلی:',
      'reply_markup'=>kb_main_user(isAdmin($from['id']))
    ]);
    exit;
  }
  /*──────────────────────── Wallet Callbacks */
if ($data==='WALLET') {
    $text = build_wallet_info_text($from['id']);
    tg('editMessageText', [
        'chat_id' => $chat_id,
        'message_id' => $mid,
        'text' => $text,
        'parse_mode' => 'Markdown',
        'reply_markup' => kb_wallet()
    ]);
    exit;
}

if ($data === 'WALLET_REFRESH') {
    $text = build_wallet_info_text($from['id']);
    tg('editMessageText', [
        'chat_id' => $chat_id,
        'message_id' => $mid,
        'text' => $text,
        'parse_mode' => 'Markdown',
        'reply_markup' => kb_wallet()
    ]);
    
    tg('answerCallbackQuery', [
        'callback_query_id' => $cq['id'],
        'text' => '💰 اطلاعات بروزرسانی شد'
    ]);
    exit;
}

if ($data === 'ADD_BALANCE') {
    $text = "💰 **افزایش موجودی کیف پول**\n\n";
    $text .= "لطفاً مبلغ مورد نظر برای افزایش موجودی را انتخاب کنید:\n\n";
    $text .= "💡 پس از انتخاب مبلغ، شماره کارت برای واریز نمایش داده می‌شود.";
    
    tg('editMessageText', [
        'chat_id' => $chat_id,
        'message_id' => $mid,
        'text' => $text,
        'parse_mode' => 'Markdown',
        'reply_markup' => kb_add_balance()
    ]);
    exit;
}

// هندلرهای مبالغ پیش‌فرض
if (strpos($data, 'DEPOSIT_') === 0 && $data !== 'DEPOSIT_CUSTOM') {
    $amount = (int)substr($data, strlen('DEPOSIT_'));
    
    $text = "💰 **افزایش موجودی به مبلغ " . money($amount) . "**\n\n";
    $text .= "📋 **مراحل افزایش موجودی:**\n";
    $text .= "1️⃣ مبلغ " . money($amount) . " به شماره کارت زیر واریز کنید\n";
    $text .= "2️⃣ رسید پرداخت را برای ما ارسال کنید\n";
    $text .= "3️⃣ پس از تایید ادمین، موجودی شما اضافه خواهد شد\n\n";
    $text .= "💳 **شماره کارت:**\n";
    $text .= "`" . CARD_NUMBER . "`\n\n";
    $text .= "📤 **رسید واریزی خود را ارسال کنید:**\n";
    $text .= "(عکس، فایل یا متن رسید)";
    
    setUserMode($from['id'], 'AWAIT_DEPOSIT_RECEIPT', ['amount' => $amount]);
    
    tg('editMessageText', [
        'chat_id' => $chat_id,
        'message_id' => $mid,
        'text' => $text,
        'parse_mode' => 'Markdown',
        'reply_markup' => ['inline_keyboard' => [[['text' => '◀️ انصراف', 'callback_data' => 'ADD_BALANCE']]]]
    ]);
    exit;
}

if ($data === 'DEPOSIT_CUSTOM') {
    $text = "💰 **افزایش موجودی - مبلغ دلخواه**\n\n";
    $text .= "لطفاً مبلغ مورد نظر خود را به **تومان** وارد کنید:\n";
    $text .= "(فقط عدد وارد کنید، مثال: 75000)";
    
    setUserMode($from['id'], 'AWAIT_CUSTOM_AMOUNT', []);
    
    tg('editMessageText', [
        'chat_id' => $chat_id,
        'message_id' => $mid,
        'text' => $text,
        'parse_mode' => 'Markdown',
        'reply_markup' => ['inline_keyboard' => [[['text' => '◀️ انصراف', 'callback_data' => 'ADD_BALANCE']]]]
    ]);
    exit;
}

if ($data === 'WALLET_HISTORY') {
    global $pdo;
    
    $stmt = $pdo->prepare("
        SELECT * FROM wallet_transactions 
        WHERE user_id = :user_id 
        ORDER BY created_at DESC 
        LIMIT 10
    ");
    $stmt->execute([':user_id' => $from['id']]);
    $transactions = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    if (!$transactions) {
        $text = "📊 **تاریخچه تراکنش‌ها**\n\n";
        $text .= "هنوز هیچ تراکنشی ثبت نشده است.";
    } else {
        $text = "📊 **تاریخچه تراکنش‌ها**\n\n";
        
        foreach ($transactions as $tx) {
            $type_icon = $tx['type'] === 'DEPOSIT' ? '💰' : ($tx['type'] === 'WITHDRAW' ? '💸' : '🛒');
            $status_icon = $tx['status'] === 'COMPLETED' ? '✅' : ($tx['status'] === 'PENDING' ? '⏳' : '❌');
            $amount_sign = $tx['type'] === 'DEPOSIT' ? '+' : '-';
            
            $text .= "{$type_icon} {$status_icon} **" . money((int)$tx['amount']) . "**\n";
            $text .= "📅 " . jdate('Y/m/d H:i', strtotime($tx['created_at'])) . "\n";
            $text .= "📝 " . ($tx['description'] ?? 'بدون توضیح') . "\n\n";
        }
    }
    
    tg('editMessageText', [
        'chat_id' => $chat_id,
        'message_id' => $mid,
        'text' => $text,
        'parse_mode' => 'Markdown',
        'reply_markup' => kb_wallet()
    ]);
    exit;
}
  // ادمین
  if ($data==='ADMIN' && isAdmin($from['id'])) {
    tg('editMessageText',[
      'chat_id'=>$chat_id,
      'message_id'=>$mid,
      'text'=>'🛠️ پنل ادمین',
      'reply_markup'=>kb_admin_main()
    ]);
    exit;
  }
  // تأیید افزایش موجودی توسط ادمین
if (isAdmin($from['id']) && strpos($data, 'ADMIN_APPROVE_DEPOSIT__') === 0) {
    error_log("🟢 ADMIN_APPROVE_DEPOSIT__ HANDLER TRIGGERED");
    $tx_id = (int)str_replace('ADMIN_APPROVE_DEPOSIT__', '', $data);
    error_log("Transaction ID: " . $tx_id);
    
    // شروع تراکنش دیتابیس
    $pdo->beginTransaction();
    
    try {
        // دریافت تراکنش
        $stmt = $pdo->prepare("SELECT * FROM wallet_transactions WHERE id = :id AND status = 'PENDING'");
        $stmt->execute([':id' => $tx_id]);
        $transaction = $stmt->fetch(PDO::FETCH_ASSOC);
        
        if (!$transaction) {
            $pdo->rollBack();
            tg('answerCallbackQuery', [
                'callback_query_id' => $cq['id'],
                'text' => 'تراکنش یافت نشد یا قبلاً پردازش شده',
                'show_alert' => true
            ]);
            exit;
        }
        
        $amount = (int)$transaction['amount'];
        $user_id = $transaction['user_id'];
        
        // 🎁 محاسبه بونوس شارژ کیف پول
        $bonus_amount = 0;
        $bonus_percent = 0;
        if ($amount >= 500000) {
            $bonus_percent = 21;
            $bonus_amount = (int)($amount * 0.21);
        } elseif ($amount >= 200000) {
            $bonus_percent = 10;
            $bonus_amount = (int)($amount * 0.10);
        }
        
        $total_add = $amount + $bonus_amount;
        
        // افزایش موجودی کاربر (مبلغ + بونوس)
        $update_balance = $pdo->prepare("UPDATE users SET balance = balance + :amount, has_wallet_bonus = CASE WHEN :bonus > 0 THEN 1 ELSE has_wallet_bonus END WHERE id = :id");
        $success = $update_balance->execute([':amount' => $total_add, ':bonus' => $bonus_amount, ':id' => $user_id]);
        
        if (!$success) {
            $pdo->rollBack();
            tg('answerCallbackQuery', [
                'callback_query_id' => $cq['id'],
                'text' => 'خطا در افزایش موجودی',
                'show_alert' => true
            ]);
            exit;
        }
        
        // آپدیت وضعیت تراکنش
        $update_stmt = $pdo->prepare("
            UPDATE wallet_transactions 
            SET status = 'COMPLETED', processed_at = NOW(), processed_by = :admin_id 
            WHERE id = :id
        ");
        $update_stmt->execute([':admin_id' => $from['id'], ':id' => $tx_id]);
        
        // کامیت تراکنش
        $pdo->commit();
        
        // اطلاع به کاربر
        $new_balance = get_user_balance($user_id);
        
        // 🎊 ارسال استیکر جشن
        tg('sendSticker', [
            'chat_id' => $user_id,
            'sticker' => 'CAACAgIAAxkBAAEKZxZlRxQAAXJpAAE4WdBxgzOHqMhC1wYAAl0AA1advQoq6bOPz9BwzTME' // استیکر جشن
        ]);
        
        $user_msg = "🎉✨ **موجودی کیف پول شما افزایش یافت!** ✨🎉\n\n";
        $user_msg .= "💵 **مبلغ واریزی:** " . money($amount) . "\n";
        
        if ($bonus_amount > 0) {
            $user_msg .= "🎁 **بونوس {$bonus_percent}%:** +" . money($bonus_amount) . " 🔥\n";
            $user_msg .= "━━━━━━━━━━━━━━━━━━━━\n";
            $user_msg .= "💰 **مجموع افزایش:** " . money($total_add) . "\n";
        }
        
        $user_msg .= "💳 **موجودی جدید:** " . money($new_balance) . "\n";
        $user_msg .= "📅 **زمان:** " . date('Y/m/d H:i') . "\n\n";
        
        if ($bonus_amount > 0) {
            $user_msg .= "🌟 تبریک! شما بونوس ویژه شارژ کیف پول دریافت کردید! 🌟";
        } else {
            $user_msg .= "💡 شارژ بالای ۲۰۰ هزار تومان بونوس ۱۰٪ و بالای ۵۰۰ هزار تومان بونوس ۲۱٪ دارد!";
        }
        
        tg('sendMessage', [
            'chat_id' => $user_id,
            'text' => $user_msg,
            'parse_mode' => 'Markdown',
            'reply_markup' => [
                'inline_keyboard' => [
                    [['text' => '💰 مشاهده کیف پول', 'callback_data' => 'WALLET']],
                    [['text' => '🛒 خرید اشتراک', 'callback_data' => 'BUY']]
                ]
            ]
        ]);
        
        tg('answerCallbackQuery', [
            'callback_query_id' => $cq['id'],
            'text' => $bonus_amount > 0 ? "✅ موجودی + بونوس {$bonus_percent}% اضافه شد" : 'موجودی کاربر افزایش یافت ✅'
        ]);
        
        // 🔥 آپدیت پیام ادمین
        $admin_msg = "✅ **تراکنش تایید شد**\n\n";
        $admin_msg .= "👤 کاربر: " . $user_id . "\n";
        $admin_msg .= "💰 مبلغ: " . money($amount) . "\n";
        if ($bonus_amount > 0) {
            $admin_msg .= "🎁 بونوس {$bonus_percent}%: " . money($bonus_amount) . "\n";
        }
        $admin_msg .= "✅ توسط: " . ($from['first_name'] ?? 'ادمین') . "\n";
        $admin_msg .= "🕒 زمان: " . date('Y/m/d H:i');
        
        tg('editMessageText', [
            'chat_id' => $chat_id,
            'message_id' => $mid,
            'text' => $admin_msg,
            'parse_mode' => 'Markdown'
        ]);
        
    } catch (Exception $e) {
        $pdo->rollBack();
        error_log("Error in ADMIN_APPROVE_DEPOSIT: " . $e->getMessage());
        tg('answerCallbackQuery', [
            'callback_query_id' => $cq['id'],
            'text' => 'خطا در پردازش تراکنش',
            'show_alert' => true
        ]);
    }
    exit;
}
// رد افزایش موجودی توسط ادمین  
if (isAdmin($from['id']) && strpos($data, 'ADMIN_REJECT_DEPOSIT__') === 0) {
    error_log("🔴 ADMIN_REJECT_DEPOSIT__ HANDLER TRIGGERED");
    $tx_id = (int)str_replace('ADMIN_REJECT_DEPOSIT__', '', $data);
    error_log("Transaction ID: " . $tx_id);
    
    try {
        $stmt = $pdo->prepare("SELECT * FROM wallet_transactions WHERE id = :id AND status = 'PENDING'");
        $stmt->execute([':id' => $tx_id]);
        $transaction = $stmt->fetch(PDO::FETCH_ASSOC);
        
        if (!$transaction) {
            tg('answerCallbackQuery', [
                'callback_query_id' => $cq['id'],
                'text' => 'تراکنش یافت نشد یا قبلاً پردازش شده',
                'show_alert' => true
            ]);
            exit;
        }
        
        // رد تراکنش
        $update_stmt = $pdo->prepare("
            UPDATE wallet_transactions 
            SET status = 'REJECTED', processed_at = NOW(), processed_by = :admin_id 
            WHERE id = :id
        ");
        $update_stmt->execute([':admin_id' => $from['id'], ':id' => $tx_id]);
        
        // اطلاع به کاربر
        tg('sendMessage', [
            'chat_id' => $transaction['user_id'],
            'text' => "❌ **درخواست افزایش موجودی شما رد شد**\n\n" .
                     "💰 **مبلغ درخواستی:** " . money((int)$transaction['amount']) . "\n" .
                     "📅 **زمان:** " . date('Y/m/d H:i') . "\n\n" .
                     "💬 **دلیل:** ممکن است رسید واریز نامعتبر باشد یا مشکلی در پرداخت وجود داشته باشد.\n\n" .
                     "📞 برای اطلاعات بیشتر با پشتیبانی تماس بگیرید.",
            'parse_mode' => 'Markdown',
            'reply_markup' => kb_wallet()
        ]);
        
        tg('answerCallbackQuery', [
            'callback_query_id' => $cq['id'],
            'text' => 'درخواست کاربر رد شد'
        ]);
        
        // 🔥 آپدیت پیام ادمین - استفاده از editMessageText
        tg('editMessageText', [
            'chat_id' => $chat_id,
            'message_id' => $mid,
            'text' => "❌ **تراکنش رد شد**\n\n" .
                     "👤 کاربر: " . $transaction['user_id'] . "\n" .
                     "💰 مبلغ: " . money((int)$transaction['amount']) . "\n" .
                     "❌ توسط: " . ($from['first_name'] ?? 'ادمین') . "\n" .
                     "🕒 زمان: " . date('Y/m/d H:i'),
            'parse_mode' => 'Markdown'
        ]);
        
    } catch (Exception $e) {
        error_log("Error in ADMIN_REJECT_DEPOSIT: " . $e->getMessage());
        tg('answerCallbackQuery', [
            'callback_query_id' => $cq['id'],
            'text' => 'خطا در پردازش تراکنش',
            'show_alert' => true
        ]);
    }
    exit;
}
  // مدیریت پلن‌ها - صفحه‌ی اصلی
  if ($data==='ADMIN_PLANS' && isAdmin($from['id'])) {
    tg('editMessageText',[
      'chat_id'=>$chat_id,
      'message_id'=>$mid,
      'text'=>'⚙️ مدیریت پلن‌ها\n\nیک دسته را انتخاب کنید:',
      'reply_markup'=>kb_admin_plans_root()
    ]);
    exit;
  }

  // نمایش پلن‌های یک دسته در مدیریت پلن‌ها
  if (isAdmin($from['id']) && strpos($data,'ADMIN_PLANS_CAT__')===0) {
    $category = substr($data, strlen('ADMIN_PLANS_CAT__'));
    $label    = plan_category_label($category);
    $plans    = db_get_plans_by_category($category);

    $text  = "⚙️ مدیریت پلن‌ها\n\n";
    $text .= "دسته: {$label}\n\n";
    if (!$plans) {
      $text .= "هنوز پلنی برای این دسته ثبت نشده است.\n\n";
    } else {
      $text .= "برای مدیریت هر پلن روی دکمه‌ی آن بزنید.\n\n";
    }

    tg('editMessageText',[
      'chat_id'=>$chat_id,
      'message_id'=>$mid,
      'text'=>$text,
      'reply_markup'=>kb_admin_plans_category($category)
    ]);
    exit;
  }
  
// شروع افزودن پلن جدید در یک دسته
// در قسمت ADMIN_PLANS_ADD__ بهبود دهید:
// در قسمت ADMIN_PLANS_ADD این بخش را جایگزین کنید:
if (isAdmin($from['id']) && strpos($data,'ADMIN_PLANS_ADD__')===0) {
  $category = substr($data, strlen('ADMIN_PLANS_ADD__'));
  $label    = plan_category_label($category);

  $msg  = "➕ افزودن پلن جدید\n";
  $msg .= "دسته: {$label}\n\n";
  
  if (strpos($category, 'VIP_') === 0) {
    $months = preg_match('/VIP_(\d+)M/', $category, $m) ? $m[1] : '1';
    $msg .= "📝 فرمت ورودی برای VIP {$months}ماهه:\n";
    $msg .= "`1m|تعداد_کاربر|قیمت`\n\n";
    $msg .= "📋 مثال‌ها:\n";
    $msg .= "• `1m|1user|250000` - یک کاربر\n";
    $msg .= "• `1m|3user|600000` - سه کاربر\n";
    $msg .= "• `1m|5user|900000` - پنج کاربر";
    
  } elseif ($category === 'VOL_1M') {
    $msg .= "📝 فرمت ورودی برای حجمی:\n";
    $msg .= "`حجم|1user|قیمت`\n\n";
    $msg .= "📋 مثال‌ها:\n";
    $msg .= "• `10g|1user|150000` - 10 گیگ\n";
    $msg .= "• `50g|1user|300000` - 50 گیگ\n";
    $msg .= "• `100g|1user|500000` - 100 گیگ";
  }
  
  $msg .= "\n\n⏺ لطفاً مقدار را دقیقاً در همین فرمت بفرستید.";

  setUserMode($from['id'], 'ADMIN_PLANS_ADD', ['category'=>$category]);

  tg('editMessageText',[
    'chat_id'=>$chat_id,
    'message_id'=>$mid,
    'text'=>$msg,
    'parse_mode'=>'Markdown',
    'reply_markup'=>kb_back('ADMIN_PLANS_CAT__'.$category)
  ]);
  exit;
}

  // جزئیات یک پلن
  if (isAdmin($from['id']) && strpos($data,'ADMIN_PLAN_INFO__')===0) {
    $pid = (int)substr($data, strlen('ADMIN_PLAN_INFO__'));
    global $pdo;
    $stmt = $pdo->prepare("SELECT * FROM plans WHERE id = :id");
    $stmt->execute([':id'=>$pid]);
    $plan = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$plan) {
      tg('answerCallbackQuery',[
        'callback_query_id'=>$cq['id'],
        'text'=>'پلن یافت نشد',
        'show_alert'=>true
      ]);
      exit;
    }

    $catLabel = plan_category_label($plan['category']);

    $text  = "📄 جزئیات پلن\n\n";
    $text .= "دسته: {$catLabel}\n";
    $text .= "کد پلن: `{$plan['plan_code']}`\n";
    $text .= "عنوان: {$plan['title']}\n";
    $text .= "مدت/برچسب: {$plan['duration_label']}\n";
    if ($plan['category'] !== 'VOL_1M') {
      $text .= "تعداد کاربر: ".($plan['users'] ?: 1)." نفر\n";
    }
    $text .= "قیمت: ".money((int)$plan['price'])."\n";
    $text .= "وضعیت: ".($plan['is_active'] ? 'فعال ✅' : 'غیرفعال ⛔')."\n";

    $kb = [
      'inline_keyboard'=>[
        [
          ['text'=>'💵 تغییر قیمت','callback_data'=>'ADMIN_PLAN_CHANGE_PRICE__'.$plan['id']],
          ['text'=>'🗑 حذف پلن','callback_data'=>'ADMIN_PLAN_DELETE__'.$plan['id']],
        ],
        [
          ['text'=>'◀️ بازگشت','callback_data'=>'ADMIN_PLANS_CAT__'.$plan['category']],
        ]
      ]
    ];

    tg('editMessageText',[
      'chat_id'=>$chat_id,
      'message_id'=>$mid,
      'text'=>$text,
      'parse_mode'=>'Markdown',
      'reply_markup'=>$kb
    ]);
    exit;
  }

  // شروع تغییر قیمت
  if (isAdmin($from['id']) && strpos($data,'ADMIN_PLAN_CHANGE_PRICE__')===0) {
    $pid = (int)substr($data, strlen('ADMIN_PLAN_CHANGE_PRICE__'));
    global $pdo;
    $stmt = $pdo->prepare("SELECT * FROM plans WHERE id = :id");
    $stmt->execute([':id'=>$pid]);
    $plan = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$plan) {
      tg('answerCallbackQuery',[
        'callback_query_id'=>$cq['id'],
        'text'=>'پلن یافت نشد',
        'show_alert'=>true
      ]);
      exit;
    }

    setUserMode($from['id'], 'ADMIN_PLANS_EDIT_PRICE', ['plan_id'=>$pid]);

    $msg  = "💵 تغییر قیمت پلن\n\n";
    $msg .= "پلن: {$plan['title']}\n";
    $msg .= "قیمت فعلی: ".money((int)$plan['price'])."\n\n";
    $msg .= "لطفاً قیمت جدید را فقط به صورت عدد (مثلاً 320000) بفرستید.";

    tg('editMessageText',[
      'chat_id'=>$chat_id,
      'message_id'=>$mid,
      'text'=>$msg,
      'reply_markup'=>kb_back('ADMIN_PLAN_INFO__'.$plan['id'])
    ]);
    exit;
  }

  // درخواست حذف پلن
  if (isAdmin($from['id']) && strpos($data,'ADMIN_PLAN_DELETE__')===0) {
    $pid = (int)substr($data, strlen('ADMIN_PLAN_DELETE__'));
    global $pdo;
    $stmt = $pdo->prepare("SELECT * FROM plans WHERE id = :id");
    $stmt->execute([':id'=>$pid]);
    $plan = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$plan) {
      tg('answerCallbackQuery',[
        'callback_query_id'=>$cq['id'],
        'text'=>'پلن یافت نشد',
        'show_alert'=>true
      ]);
      exit;
    }

    $msg  = "❗️ آیا از حذف این پلن مطمئن هستید؟\n\n";
    $msg .= "پلن: {$plan['title']}\n";
    $msg .= "کد: {$plan['plan_code']}\n";
    $msg .= "قیمت: ".money((int)$plan['price'])."\n";

    $kb = [
      'inline_keyboard'=>[
        [
          ['text'=>'✅ بله، حذف شود','callback_data'=>'ADMIN_PLAN_DELETE_YES__'.$plan['id']],
          ['text'=>'❌ خیر','callback_data'=>'ADMIN_PLAN_INFO__'.$plan['id']],
        ]
      ]
    ];

    tg('editMessageText',[
      'chat_id'=>$chat_id,
      'message_id'=>$mid,
      'text'=>$msg,
      'reply_markup'=>$kb
    ]);
    exit;
  }

  // تأیید حذف پلن
  if (isAdmin($from['id']) && strpos($data,'ADMIN_PLAN_DELETE_YES__')===0) {
    $pid = (int)substr($data, strlen('ADMIN_PLAN_DELETE_YES__'));
    global $pdo;
    $stmt = $pdo->prepare("SELECT * FROM plans WHERE id = :id");
    $stmt->execute([':id'=>$pid]);
    $plan = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($plan) {
      db_delete_plan($pid);
      $cat   = $plan['category'];
      $label = plan_category_label($cat);

      tg('editMessageText',[
        'chat_id'=>$chat_id,
        'message_id'=>$mid,
        'text'=>"✅ پلن غیرفعال شد و از لیست فروش حذف شد.\n\nدسته: {$label}",
        'reply_markup'=>kb_admin_plans_category($cat)
      ]);
    } else {
      tg('answerCallbackQuery',[
        'callback_query_id'=>$cq['id'],
        'text'=>'پلن قبلاً حذف شده است',
        'show_alert'=>true
      ]);
    }
    exit;
  }

  // آمار فروش - نمایش اولیه
  if (isAdmin($from['id']) && $data === 'ADMIN_STATS') {
    $stats = get_sales_stats($pdo);
    $text  = build_sales_stats_text($stats);

    tg('editMessageText', [
      'chat_id'      => $chat_id,
      'message_id'   => $mid,
      'text'         => $text,
      'reply_markup' => kb_admin_stats()
    ]);
    exit;
  }
// سیستم پیام عمومی
if (isAdmin($from['id']) && $data === 'ADMIN_BROADCAST') {
    $total_users = get_total_users_count();
    $text = "📢 **سیستم پیام عمومی**\n\n";
    $text .= "👥 تعداد کل کاربران: {$total_users} نفر\n\n";
    $text .= "✅ **ویژگی‌ها:**\n";
    $text .= "• ارسال پیام متنی، عکس و فایل\n";
    $text .= "• سیستم لاگ‌گیری کامل\n";
    $text .= "• گزارش موفقیت/شکست\n";
    $text .= "• مطابق با قوانین تلگرام\n\n";
    $text .= "📋 لطفاً نوع پیام را انتخاب کنید:";
    
    tg('editMessageText', [
        'chat_id' => $chat_id,
        'message_id' => $mid,
        'text' => $text,
        'parse_mode' => 'Markdown',
        'reply_markup' => kb_admin_broadcast()
    ]);
    exit;
}

if (isAdmin($from['id']) && $data === 'ADMIN_BROADCAST_TEXT') {
    setUserMode($from['id'], 'ADMIN_BROADCAST_TEXT', []);
    
    tg('editMessageText', [
        'chat_id' => $chat_id,
        'message_id' => $mid,
        'text' => "📝 **ارسال پیام متنی به همه کاربران**\n\n" .
                 "لطفاً متن پیام خود را ارسال کنید:\n\n" .
                 "💡 **نکات مهم:**\n" .
                 "• می‌توانید از HTML برای فرمت‌دهی استفاده کنید\n" .
                 "• از لینک‌های معتبر استفاده کنید\n" .
                 "• مطابق قوانین تلگرام عمل کنید\n" .
                 "• اسپم نکنید!",
        'parse_mode' => 'Markdown',
        'reply_markup' => ['inline_keyboard' => [[['text' => '❌ انصراف', 'callback_data' => 'ADMIN_BROADCAST']]]]
    ]);
    exit;
}

if (isAdmin($from['id']) && $data === 'ADMIN_BROADCAST_PHOTO') {
    setUserMode($from['id'], 'ADMIN_BROADCAST_PHOTO', []);
    
    tg('editMessageText', [
        'chat_id' => $chat_id,
        'message_id' => $mid,
        'text' => "🖼️ **ارسال عکس به همه کاربران**\n\n" .
                 "لطفاً عکس خود را ارسال کنید (با کپشن اختیاری):\n\n" .
                 "📸 ابتدا عکس را آپلود کنید\n" .
                 "📝 سپس کپشن را وارد کنید (اختیاری)",
        'parse_mode' => 'Markdown',
        'reply_markup' => ['inline_keyboard' => [[['text' => '❌ انصراف', 'callback_data' => 'ADMIN_BROADCAST']]]]
    ]);
    exit;
}

if (isAdmin($from['id']) && $data === 'ADMIN_BROADCAST_DOCUMENT') {
    setUserMode($from['id'], 'ADMIN_BROADCAST_DOCUMENT', []);
    
    tg('editMessageText', [
        'chat_id' => $chat_id,
        'message_id' => $mid,
        'text' => "📎 **ارسال فایل به همه کاربران**\n\n" .
                 "لطفاً فایل خود را ارسال کنید (با کپشن اختیاری):\n\n" .
                 "📁 ابتدا فایل را آپلود کنید\n" .
                 "📝 سپس کپشن را وارد کنید (اختیاری)",
        'parse_mode' => 'Markdown',
        'reply_markup' => ['inline_keyboard' => [[['text' => '❌ انصراف', 'callback_data' => 'ADMIN_BROADCAST']]]]
    ]);
    exit;
}
if (isAdmin($from['id']) && $data === 'ADMIN_BROADCAST_LOGS') {
    $logs = get_broadcast_logs(1, 10);
    $total_logs = count($logs);
    $total_pages = ceil($total_logs / 10);
    
    if (!$logs) {
        $text = "📋 **گزارش‌های پیام عمومی**\n\n";
        $text .= "هنوز هیچ گزارشی ثبت نشده است.";
    } else {
        $text = "📋 **گزارش‌های پیام عمومی**\n\n";
        $text .= "📊 **آخرین ارسال‌ها:**\n\n";
        
        foreach ($logs as $log) {
            $status_icons = [
                'PROCESSING' => '🔄',
                'COMPLETED' => '✅',
                'COMPLETED_WITH_ERRORS' => '⚠️',
                'FAILED' => '❌'
            ];
            
            $admin_name = $log['first_name'] ?? 'سیستم';
            $success_rate = $log['total_users'] > 0 ? round(($log['success_count'] / $log['total_users']) * 100, 2) : 0;
            
            $text .= "{$status_icons[$log['status']]} **لاگ #{$log['id']}**\n";
            $text .= "👤 ارسال کننده: {$admin_name}\n";
            $text .= "📊 موفق: {$log['success_count']}/{$log['total_users']} ({$success_rate}%)\n";
            $text .= "📅 تاریخ: " . jdate('Y/m/d H:i', strtotime($log['created_at'])) . "\n";
            $text .= "────────────────────\n";
        }
    }
    
    tg('editMessageText', [
        'chat_id' => $chat_id,
        'message_id' => $mid,
        'text' => $text,
        'parse_mode' => 'Markdown',
        'reply_markup' => kb_broadcast_logs(1, $total_pages)
    ]);
    exit;
}

if (isAdmin($from['id']) && $data === 'ADMIN_BROADCAST_STATS') {
    $total_users = get_total_users_count();
    $active_users = $pdo->query("SELECT COUNT(DISTINCT user_id) FROM sales WHERE is_active = 1")->fetchColumn();
    $today_users = $pdo->query("SELECT COUNT(*) FROM users WHERE DATE(created_at) = CURDATE()")->fetchColumn();
    
    $text = "📊 **آمار کاربران برای پیام عمومی**\n\n";
    $text .= "👥 **تعداد کل کاربران:** {$total_users} نفر\n";
    $text .= "✅ **کاربران فعال (دارای سرویس):** {$active_users} نفر\n";
    $text .= "🆕 **کاربران جدید امروز:** {$today_users} نفر\n\n";
    $text .= "💡 **نکات مهم:**\n";
    $text .= "• پیام‌ها به همه کاربران ارسال می‌شود\n";
    $text .= "• کاربران غیرفعال نیز پیام دریافت می‌کنند\n";
    $text .= "• محدودیت ارسال: 30 پیام در ثانیه\n";
    $text .= "• زمان تقریبی ارسال: " . ceil($total_users / 25) . " ثانیه";
    
    tg('editMessageText', [
        'chat_id' => $chat_id,
        'message_id' => $mid,
        'text' => $text,
        'parse_mode' => 'Markdown',
        'reply_markup' => kb_advanced_broadcast()
    ]);
    exit;
}
/* 4) سیستم پیام عمومی پیشرفته */
// پیام متنی
if ($mode && $mode['mode'] === 'ADMIN_BROADCAST_TEXT') {
    if (empty($m['text'])) {
        tg('sendMessage', [
            'chat_id' => $chat_id,
            'text' => '❌ لطفاً یک متن معتبر ارسال کنید.'
        ]);
        exit;
    }
    
    $message_text = $m['text'];
    
    // اطلاع شروع ارسال
    $progress_msg = tg('sendMessage', [
        'chat_id' => $chat_id,
        'text' => "🚀 **شروع ارسال پیام عمومی**\n\n⏳ در حال آماده‌سازی...",
        'parse_mode' => 'Markdown'
    ]);
    
    $progress_msg_id = $progress_msg['result']['message_id'];
    
    // ارسال با سیستم جدید
    $broadcast_result = advanced_broadcast_message($from['id'], $message_text, 'text');
    
    if ($broadcast_result['success']) {
        $report = create_advanced_broadcast_report($broadcast_result, $from['id']);
        
        // آپدیت پیام پیشرفت
        tg('editMessageText', [
            'chat_id' => $chat_id,
            'message_id' => $progress_msg_id,
            'text' => $report,
            'parse_mode' => 'Markdown',
            'reply_markup' => kb_advanced_broadcast()
        ]);
    } else {
        tg('editMessageText', [
            'chat_id' => $chat_id,
            'message_id' => $progress_msg_id,
            'text' => "❌ **خطا در ارسال پیام عمومی**\n\nخطا: {$broadcast_result['error']}",
            'parse_mode' => 'Markdown',
            'reply_markup' => kb_advanced_broadcast()
        ]);
    }
    
    clearUserMode($from['id']);
    exit;
}

// پیام با عکس
if ($mode && $mode['mode'] === 'ADMIN_BROADCAST_PHOTO') {
    if (empty($m['photo'])) {
        tg('sendMessage', [
            'chat_id' => $chat_id,
            'text' => '❌ لطفاً یک عکس معتبر ارسال کنید.'
        ]);
        exit;
    }
    
    $photo = end($m['photo']);
    $photo_file_id = $photo['file_id'];
    $caption = $m['caption'] ?? '';
    
    $message_data = [
        'photo_file_id' => $photo_file_id,
        'caption' => $caption
    ];
    
    $progress_msg = tg('sendMessage', [
        'chat_id' => $chat_id,
        'text' => "🚀 **شروع ارسال عکس عمومی**\n\n⏳ در حال آماده‌سازی...",
        'parse_mode' => 'Markdown'
    ]);
    
    $progress_msg_id = $progress_msg['result']['message_id'];
    
    $broadcast_result = advanced_broadcast_message($from['id'], $message_data, 'photo');
    
    if ($broadcast_result['success']) {
        $report = create_advanced_broadcast_report($broadcast_result, $from['id']);
        
        tg('editMessageText', [
            'chat_id' => $chat_id,
            'message_id' => $progress_msg_id,
            'text' => $report,
            'parse_mode' => 'Markdown',
            'reply_markup' => kb_advanced_broadcast()
        ]);
    } else {
        tg('editMessageText', [
            'chat_id' => $chat_id,
            'message_id' => $progress_msg_id,
            'text' => "❌ **خطا در ارسال عکس عمومی**\n\nخطا: {$broadcast_result['error']}",
            'parse_mode' => 'Markdown',
            'reply_markup' => kb_advanced_broadcast()
        ]);
    }
    
    clearUserMode($from['id']);
    exit;
}

// پیام با عکس
if ($mode && $mode['mode'] === 'ADMIN_BROADCAST_PHOTO') {
    if (empty($m['photo'])) {
        tg('sendMessage', [
            'chat_id' => $chat_id,
            'text' => '❌ لطفاً یک عکس معتبر ارسال کنید.'
        ]);
        exit;
    }
    
    $photo = end($m['photo']);
    $photo_file_id = $photo['file_id'];
    $caption = $m['caption'] ?? '';
    
    $total_users = get_total_users_count();
    
    tg('sendMessage', [
        'chat_id' => $chat_id,
        'text' => "🚀 شروع ارسال عکس به {$total_users} کاربر...\n\n⏳ لطفاً منتظر بمانید...",
        'reply_markup' => ['inline_keyboard' => [[['text' => '🔄 بروزرسانی', 'callback_data' => 'ADMIN_BROADCAST']]]]
    ]);
    
    $success_count = 0;
    $failed_count = 0;
    $message_data = ['photo_file_id' => $photo_file_id, 'caption' => $caption];
    
    $users_stmt = $pdo->prepare("SELECT id FROM users ORDER BY id ASC");
    $users_stmt->execute();
    $users = $users_stmt->fetchAll(PDO::FETCH_COLUMN);
    
    foreach ($users as $user_id) {
        $result = send_broadcast_message($user_id, $message_data, 'photo');
        if ($result['success']) {
            $success_count++;
        } else {
            $failed_count++;
        }
        
        usleep(50000);
    }
    
    $log_id = log_broadcast($from['id'], $caption, $total_users, $success_count, $failed_count, 'photo');
    
    $report = "✅ **ارسال عکس عمومی تکمیل شد**\n\n";
    $report .= "📊 **گزارش ارسال:**\n";
    $report .= "• 👥 کاربران کل: {$total_users} نفر\n";
    $report .= "• ✅ ارسال موفق: {$success_count} نفر\n";
    $report .= "• ❌ ارسال ناموفق: {$failed_count} نفر\n";
    $report .= "• 📈 نرخ موفقیت: " . round(($success_count / $total_users) * 100, 2) . "%\n\n";
    $report .= "🆔 کد لاگ: #{$log_id}";
    
    tg('sendMessage', [
        'chat_id' => $chat_id,
        'text' => $report,
        'parse_mode' => 'Markdown',
        'reply_markup' => kb_admin_broadcast()
    ]);
    
    clearUserMode($from['id']);
    exit;
}
  // آمار فروش - بروزرسانی با دکمه 🔄
  if (isAdmin($from['id']) && $data === 'ADMIN_STATS_REFRESH') {
    $stats = get_sales_stats($pdo);
    $text  = build_sales_stats_text($stats);

    tg('editMessageText', [
      'chat_id'      => $chat_id,
      'message_id'   => $mid,
      'text'         => $text,
      'reply_markup' => kb_admin_stats()
    ]);

    // نوتیف مقاومتی برای ادمین که بفهمه آپدیت شد :)
    tg('answerCallbackQuery', [
      'callback_query_id' => $cq['id'],
      'text'              => 'آمار بروزرسانی شد ✅'
    ]);

    exit;
  }

  // خرید
  if ($data==='BUY') {
    tg('editMessageText',[
      'chat_id'=>$chat_id,
      'message_id'=>$mid,
      'text'=>"🎯 یک دسته را انتخاب کنید:",
      'reply_markup'=>kb_buy_root()
    ]);
    exit;
  }

  if ($data==='TEST') {
    $r=$pdo->prepare("SELECT test_claimed FROM users WHERE id=:id"); $r->execute([':id'=>$from['id']]); $row=$r->fetch();
    if ($row && (int)$row['test_claimed']===1) { 
      tg('answerCallbackQuery',[
        'callback_query_id'=>$cq['id'],
        'text'=>'قبلاً تست دریافت کرده‌اید.',
        'show_alert'=>true
      ]); 
      exit; 
    }
    $cfg=$pdo->query("SELECT * FROM configs WHERE plan_code LIKE 'TEST_%' AND is_used = 0 ORDER BY id DESC LIMIT 1")->fetch();
    if (!$cfg) { 
      $msg = "🤷‍♂️ فعلاً تست در ربات موجود نیست!\n\n";
      $msg .= "💡 اما می‌تونی از پشتیبانی تست دریافت کنی:\n";
      $msg .= SUPPORT_LINK."\n\n";
      $msg .= "✅ اعتبار تستت محفوظ می‌مونه برای وقتی که تست تو ربات فعال شد.";
      tg('editMessageText',[
        'chat_id'=>$chat_id,
        'message_id'=>$mid,
        'text'=>$msg,
        'reply_markup'=>kb_back('BACK_MAIN'),
        'disable_web_page_preview'=>true
      ]);
      exit; 
    }
    tg('editMessageText',[
      'chat_id'=>$chat_id,
      'message_id'=>$mid,
      'text'=>"برای دریافت تست، شماره تماس خود را ارسال کنید.",
      'reply_markup'=>kb_back('BACK_MAIN')
    ]);
    tg('sendMessage',[
      'chat_id'=>$chat_id,
      'text'=>'📱 روی دکمه زیر بزنید تا شماره‌تان ارسال شود:',
      'reply_markup'=>[
        'keyboard'=>[[['text'=>'ارسال شماره 📱','request_contact'=>true]]],
        'resize_keyboard'=>true,
        'one_time_keyboard'=>true
      ]
    ]);
    setUserMode($from['id'],'AWAIT_TEST_PHONE',[]); 
    exit;
  }

if ($data==='MY_SERVICES') {
    $q=$pdo->prepare("SELECT * FROM sales WHERE user_id=:u ORDER BY id DESC LIMIT 20"); 
    $q->execute([':u'=>$from['id']]); 
    $rows=$q->fetchAll();
    
    if (!$rows) {
        tg('editMessageText',[
            'chat_id'=>$chat_id,
            'message_id'=>$mid,
            'text'=>'📭 هنوز سرویسی ندارید.',
            'reply_markup'=>kb_back()
        ]);
    } else { 
        $ik = [];
        foreach ($rows as $s) {
            // استخراج اطلاعات از plan_code
            $duration = '';
            $user_count = '';
            
            if (strpos($s['plan_code'], 'VIP_') === 0) {
                // فرمت: VIP_XU_YM
                if (preg_match('/VIP_(\d+)U_(\d+)M/', $s['plan_code'], $matches)) {
                    $user_count = $matches[1] . 'کاربر';
                    $months = (int)$matches[2];
                    $duration = $months == 1 ? '1ماه' : ($months == 3 ? '3ماه' : $months . 'ماه');
                }
            } elseif (strpos($s['plan_code'], 'VOL_') === 0) {
                // فرمت: VOL_XG_1M
                if (preg_match('/VOL_(\d+)G_1M/', $s['plan_code'], $matches)) {
                    $user_count = '1کاربر'; // پلن‌های حجمی معمولاً تک کاربر هستند
                    $duration = '1ماه';
                }
            } elseif (strpos($s['plan_code'], 'TEST_') === 0) {
                $user_count = '1کاربر';
                $duration = '1روز';
            } else {
                // برای پلن‌های دیگر
                $user_count = '1کاربر';
                $duration = '1ماه';
            }
            
            // تاریخ شمسی تحویل
            $jdate = '';
            if (!empty($s['delivered_at'])) {
                $jdate = jdate('d/m', strtotime($s['delivered_at']));
            } else {
                $jdate = 'نامشخص';
            }
            
            // ساخت متن دکمه با فرمت جدید
            $button_text = "{$jdate}|{$duration}|{$user_count}";
            
            $ik[] = [['text'=>$button_text, 'callback_data'=>'SERVICE_INFO__'.$s['id']]];
        }
        $ik[] = [['text'=>'◀️ بازگشت', 'callback_data'=>'BACK_MAIN']];
        
        tg('editMessageText',[
            'chat_id'=>$chat_id,
            'message_id'=>$mid,
            'text'=>"📦 سرویس‌های فعال شما:\n\nبرای مشاهده جزئیات هر سرویس، روی آن کلیک کنید:",
            'reply_markup'=>['inline_keyboard'=>$ik]
        ]);
    }
    exit;
}


  // راهنمای اتصال
  if ($data==='GUIDE') {
    tg('editMessageText', [
      'chat_id'=>$chat_id,
      'message_id'=>$mid,
      'text'=>'📚 راهنمای اتصال\n\nلطفاً دستگاه خود را انتخاب کنید:',
      'reply_markup'=>kb_connection_guide()
    ]);
    exit;
  }

  // درباره فروشگاه
  if ($data==='ABOUT') {
    $about = "ℹ️ درباره فروشگاه\n\n";
    $about .= "🛍️ پیشگام سرور\n";
    $about .= "https://t.me/anyconnect_iran\n\n";
    $about .= "🛍️ جم اکانت\n";
    $about .= "https://t.me/GEM_ACC\n\n";
    $about .= "📝 شرح فعالیت:\n";
    $about .= "فروش اکانت‌های پریمیوم (V2Ray، Windscribe، ExpressVPN و …)\n";
    $about .= "اکانت‌های هوش مصنوعی (ChatGPT، Midjourney، Claude، Gemini)\n";
    $about .= "اشتراک‌های موزیک/ویدیو (Spotify، Apple Music، SoundCloud، YouTube Premium، Netflix)\n\n";
    $about .= "👨‍💻 پشتیبانی:\n";
    $about .= "@anyconnect_admin\n";
    $about .= "@GEMacc_admin";
    
    tg('editMessageText', [
      'chat_id'=>$chat_id,
      'message_id'=>$mid,
      'text'=>$about,
      'disable_web_page_preview'=>true,
      'reply_markup'=>kb_back('BACK_MAIN')
    ]);
    exit;
  }

  // راهنمای دستگاه‌های مختلف
  if (in_array($data, ['GUIDE_ANDROID', 'GUIDE_IOS', 'GUIDE_WINDOWS'])) {
    $device_name = '';
    $guide_text = '';
    
    switch($data) {
      case 'GUIDE_ANDROID':
        $device_name = 'اندروید 📱';
        $guide_text = "📱 راهنمای اتصال برای اندروید:\n\n";
        $guide_text .= "1. اپلیکیشن HAPP را از بازار دانلود و نصب کنید\n";
        $guide_text .= "2. اپلیکیشن را باز کرده و روی علامت + بزنید\n";
        $guide_text .= "3. کانفیگ را کپی کرده و در اپ پیست کنید\n";
        $guide_text .= "4. روی دکمه اتصال بزنید\n";
        $guide_text .= "5. اگر پیام مجوز ظاهر شد، تایید کنید\n\n";
        $guide_text .= "✅ اکنون به اینترنت آزاد متصل هستید!";
        break;
        
      case 'GUIDE_IOS':
        $device_name = 'آیفون 🍎';
        $guide_text = "🍎 راهنمای اتصال برای آیفون:\n\n";
        $guide_text .= "1. از AppStore اپلیکیشن HAPP را دانلود کنید\n";
        $guide_text .= "2. اپلیکیشن را باز کرده و Allow را بزنید\n";
        $guide_text .= "3. روی Add Configuration کلیک کنید\n";
        $guide_text .= "4. کانفیگ را کپی و پیست کنید\n";
        $guide_text .= "5. روی دکمه connect بزنید\n";
        $guide_text .= "6. Allow را برای اضافه کردن VPN پروفایل بزنید\n\n";
        $guide_text .= "✅ اتصال برقرار شد!";
        break;
        
      case 'GUIDE_WINDOWS':
        $device_name = 'ویندوز 💻';
        $guide_text = "💻 راهنمای اتصال برای ویندوز:\n\n";
        $guide_text .= "1. نرم‌افزار HAPP را دانلود و نصب کنید\n";
        $guide_text .= "2. برنامه را اجرا کرده و روی Import from clipboard کلیک کنید\n";
        $guide_text .= "3. کانفیگ را کپی کرده و منتظر بمانید\n";
        $guide_text .= "4. روی دکمه Connect کلیک کنید\n";
        $guide_text .= "5. اگر پیام امنیتی ظاهر شد، Allow را بزنید\n\n";
        $guide_text .= "✅ اتصال موفقیت‌آمیز بود!";
        break;
    }
    
    tg('editMessageText', [
      'chat_id'=>$chat_id,
      'message_id'=>$mid,
      'text'=>$guide_text,
      'reply_markup'=>kb_back('GUIDE')
    ]);
    exit;
  }

  // نمایش اطلاعات سرویس
if (strpos($data,'SERVICE_INFO__')===0) {
    $sid=(int)substr($data,strlen('SERVICE_INFO__'));
    $s=$pdo->prepare("SELECT * FROM sales WHERE id=:id AND user_id=:uid"); 
    $s->execute([':id'=>$sid, ':uid'=>$from['id']]); 
    $service=$s->fetch();
    
    if (!$service) {
      tg('answerCallbackQuery',[
        'callback_query_id'=>$cq['id'],
        'text'=>'سرویس یافت نشد',
        'show_alert'=>true
      ]); 
      exit;
    }
    
    $cfg_data = !empty($service['config_data']) ? json_decode($service['config_data'], true) : null;
    
    // محاسبه تاریخ انقضای صحیح
    $expires_at = '';
    if (!empty($service['expires_at'])) {
        $expires_at = jdate('d/m', strtotime($service['expires_at']));
    } else {
        // اگر expires_at وجود ندارد، بر اساس plan_code محاسبه کن
        $delivered_timestamp = strtotime($service['delivered_at']);
        if (strpos($service['plan_code'], 'VIP_1U_3M') !== false || 
            strpos($service['plan_code'], 'VIP_2U_3M') !== false) {
            // پلن 3 ماهه
            $expires_timestamp = strtotime('+3 months', $delivered_timestamp);
        } elseif (strpos($service['plan_code'], 'VIP_1U_1M') !== false || 
                  strpos($service['plan_code'], 'VIP_2U_1M') !== false ||
                  strpos($service['plan_code'], 'VOL_') !== false) {
            // پلن 1 ماهه
            $expires_timestamp = strtotime('+1 month', $delivered_timestamp);
        } elseif (strpos($service['plan_code'], 'TEST_') !== false) {
            // پلن تست
            $expires_timestamp = strtotime('+1 day', $delivered_timestamp);
        } else {
            // پیش‌فرض 1 ماهه
            $expires_timestamp = strtotime('+1 month', $delivered_timestamp);
        }
        $expires_at = jdate('d/m', $expires_timestamp);
    }
    
    $text = "🛍️ سرویس #{$service['id']}\n";
    $text .= "📦 پلن: {$service['plan_title']}\n";
    $text .= "💳 مبلغ: ".money((int)$service['price'])."\n";
    $text .= "📅 تاریخ تحویل: ".jdate('d/m', strtotime($service['delivered_at']))."\n";
    $text .= "⏰ تاریخ انقضا: {$expires_at}\n\n";
    
    // محاسبه وضعیت سرویس
    $now = time();
    $expires_timestamp = !empty($service['expires_at']) ? strtotime($service['expires_at']) : $expires_timestamp;
    if ($expires_timestamp > $now) {
        $text .= "📊 وضعیت: فعال ✅\n";
    } else {
        $text .= "📊 وضعیت: منقضی ❌\n";
    }
    
    $ik = [
        [['text'=>'📥 دریافت کانفیگ', 'callback_data'=>'GET_CONFIG__'.$sid]],
        [['text'=>'◀️ بازگشت', 'callback_data'=>'MY_SERVICES']]
    ];
    
    if ($cfg_data) {
      if (!empty($cfg_data['photo_file_id'])) {
        tg('sendPhoto',[
          'chat_id'=>$chat_id,
          'photo'=>$cfg_data['photo_file_id'],
          'caption'=>$text.($cfg_data['config_text']??'')
        ]);
      } else {
        $text .= "📝 کانفیگ:\n".($cfg_data['config_text']??'');
        if (!empty($cfg_data['config_link'])) {
          $text .= "\n\n🔗 لینک: ".$cfg_data['config_link'];
        }
        tg('editMessageText',[
          'chat_id'=>$chat_id,
          'message_id'=>$mid,
          'text'=>$text,
          'reply_markup'=>['inline_keyboard'=>$ik]
        ]);
      }
      if (!empty($cfg_data['config_file_id'])) {
        tg('sendDocument',[
          'chat_id'=>$chat_id,
          'document'=>$cfg_data['config_file_id'],
          'caption'=>"📁 فایل کانفیگ سرویس #{$service['id']}"
        ]);
      }
    } else {
      $text .= "⚠️ اطلاعات کانفیگ در دسترس نیست. لطفاً با پشتیبانی تماس بگیرید.";
      tg('editMessageText',[
        'chat_id'=>$chat_id,
        'message_id'=>$mid,
        'text'=>$text,
        'reply_markup'=>['inline_keyboard'=>$ik]
      ]);
    }
    exit;
  }

  // دریافت کانفیگ سرویس
  if (strpos($data,'GET_CONFIG__')===0) {
    $sid=(int)substr($data,strlen('GET_CONFIG__'));
    $s=$pdo->prepare("SELECT * FROM sales WHERE id=:id AND user_id=:uid"); 
    $s->execute([':id'=>$sid, ':uid'=>$from['id']]); 
    $service=$s->fetch();
    
    if (!$service) {
      tg('answerCallbackQuery',[
        'callback_query_id'=>$cq['id'],
        'text'=>'سرویس یافت نشد',
        'show_alert'=>true
      ]); 
      exit;
    }
    
    $cfg_data = !empty($service['config_data']) ? json_decode($service['config_data'], true) : null;
    if (!$cfg_data) {
      tg('answerCallbackQuery',[
        'callback_query_id'=>$cq['id'],
        'text'=>'کانفیگ موجود نیست',
        'show_alert'=>true
      ]); 
      exit;
    }
    
    // ارسال کانفیگ
    $caption = "📦 کانفیگ سرویس #{$service['id']}\n{$service['plan_title']}";
    
    if (!empty($cfg_data['photo_file_id'])) {
        tg('sendPhoto',[
          'chat_id'=>$chat_id,
          'photo'=>$cfg_data['photo_file_id'],
          'caption'=>$caption.($cfg_data['config_text'] ? "\n\n".$cfg_data['config_text'] : '')
        ]);
    } else {
        tg('sendMessage',['chat_id'=>$chat_id,'text'=>$caption.($cfg_data['config_text'] ? "\n\n".$cfg_data['config_text'] : '')]);
    }
    
    if (!empty($cfg_data['config_link'])) {
        tg('sendMessage',[
          'chat_id'=>$chat_id,
          'text'=>"🔗 لینک کانفیگ:\n".$cfg_data['config_link']
        ]);
    }
    if (!empty($cfg_data['config_file_id'])) {
        tg('sendDocument',[
          'chat_id'=>$chat_id,
          'document'=>$cfg_data['config_file_id'],
          'caption'=>$caption
        ]);
    }
    
    tg('answerCallbackQuery',[
      'callback_query_id'=>$cq['id'],
      'text'=>'کانفیگ ارسال شد ✅'
    ]);
    exit;
  }

  // دسته‌های خرید
if ($data==='BUY_CAT_VIP_1M') {
  $codes = get_plan_codes_by_category('VIP_1M');
  tg('editMessageText',[
    'chat_id'=>$chat_id,
    'message_id'=>$mid,
    'text'=>'👑 نامحدود VIP | یک‌ماهه — پلن را انتخاب کنید:',
    'reply_markup'=>kb_plans_by_codes($codes)
  ]); 
  exit;
}
if ($data==='BUY_CAT_VIP_3M') {
  $codes = get_plan_codes_by_category('VIP_3M');
  tg('editMessageText',[
    'chat_id'=>$chat_id,
    'message_id'=>$mid,
    'text'=>'⏳ نامحدود VIP | سه‌ماهه — پلن را انتخاب کنید:',
    'reply_markup'=>kb_plans_by_codes($codes)
  ]); 
  exit;
}
if ($data==='BUY_CAT_VOL_1M') {
  $codes = get_plan_codes_by_category('VOL_1M');
  tg('editMessageText',[
    'chat_id'=>$chat_id,
    'message_id'=>$mid,
    'text'=>'📦 حجمی | یک‌ماهه — پلن را انتخاب کنید:',
    'reply_markup'=>kb_plans_by_codes($codes)
  ]); 
  exit;
}

  // انتخاب پلن
if (strpos($data,'BUY_PLAN__')===0) {
  $code = substr($data, strlen('BUY_PLAN__'));
  $p = bot_get_plan($code);
  if (!$p) { 
    tg('answerCallbackQuery',[
      'callback_query_id'=>$cq['id'],
      'text'=>'پلن یافت نشد',
      'show_alert'=>true
    ]); 
    exit; 
  }
  
  $amount = (int)$p['price'];
  $wallet_info = can_pay_with_wallet($from['id'], $amount);
  
  $txt = "🎯 پلن انتخابی:\n{$p['title']}\n💳 مبلغ: ".money($amount)."\n\n";
  $txt .= "💰 موجودی کیف پول شما: " . money($wallet_info['balance']) . "\n\n";
  
  if ($wallet_info['can_pay']) {
    $txt .= "✅ می‌توانید با کیف پول پرداخت کنید.\n\n";
  } else {
    $txt .= "❌ موجودی کافی نیست. نیاز: " . money($amount) . "\nکمبود: " . money($wallet_info['shortage']) . "\n\n";
  }
  
  $txt .= make_copyable_card();
  
  tg('editMessageText',[
    'chat_id'=>$chat_id,
    'message_id'=>$mid,
    'text'=>$txt,
    'parse_mode'=>'Markdown',
    'reply_markup'=>kb_payment_with_wallet($code, $amount, $from['id'])
  ]);
  exit;
}

  // شروع ارسال رسید
if (strpos($data,'SEND_RECEIPT__')===0) {
  $code = strtoupper(trim(substr($data, strlen('SEND_RECEIPT__')))); // 🔧 یکسان‌سازی
  error_log("📝 SEND_RECEIPT: Creating order for plan_code='{$code}'");
  
  $p = bot_get_plan($code);
  if (!$p) { 
    tg('answerCallbackQuery',[
      'callback_query_id'=>$cq['id'],
      'text'=>'پلن نامعتبر',
      'show_alert'=>true
    ]); 
    exit; 
  }

    $pdo->prepare("INSERT INTO orders (user_id,plan_code,plan_title,price) VALUES (:u,:c,:t,:pr)")
        ->execute([':u'=>$from['id'], ':c'=>$code, ':t'=>$p['title'], ':pr'=>$p['price']]);
    $oid = (int)$pdo->lastInsertId();
    error_log("✅ SEND_RECEIPT: Order #{$oid} created for plan_code='{$code}'");

    tg('editMessageText',[
      'chat_id'=>$chat_id,
      'message_id'=>$mid,
      'text'=>"📤 رسید واریزی خود را ارسال کنید و منتظر تایید ادمین باشید.\n(عکس/فایل/متن)\n🔢 شماره سفارش: #$oid",
      'reply_markup'=>kb_back('BUY')
    ]);
    setUserMode($from['id'],'AWAIT_RECEIPT',['order_id'=>$oid]);
    exit;
  }

// اضافه کردن هندلر جدید برای پرداخت با کیف پول
if (strpos($data, 'WALLET_PAY__') === 0) {
    ensureCleanTransactionState(); // این خط رو اضافه کن
    
    $code = strtoupper(trim(substr($data, strlen('WALLET_PAY__')))); // 🔧 یکسان‌سازی
    
    // 🔥 این لاگ رو اضافه کنید:
    error_log("💰 WALLET_PAY__ TRIGGERED: code = {$code}, user_id = {$from['id']}");
    
    $p = bot_get_plan($code);
    
    if (!$p) {
        error_log("❌ PLAN NOT FOUND: code = {$code}");
        tg('answerCallbackQuery',[
            'callback_query_id' => $cq['id'],
            'text' => 'پلن نامعتبر',
            'show_alert' => true
        ]);
        exit;
    }
    
    $amount = (int)$p['price'];
    
    // 🔥 این لاگ رو اضافه کنید:
    error_log("🔄 WALLET_PAY__ PROCESSING: plan = {$p['title']}, amount = {$amount}");
    
    // پردازش پرداخت
    $payment_result = process_wallet_payment($from['id'], $code, $amount);
    
    if ($payment_result['success']) {
        error_log("✅ DEBUG: Wallet payment successful, order_id={$payment_result['order_id']}");
        
        // ارسال کانفیگ
        $config_data = deliver_config_after_wallet_payment($payment_result['order_id'], $from['id']);
        
        if ($config_data) {
            error_log("✅ DEBUG: Config delivery successful");
            
            // ارسال پیام موفقیت به کاربر
            $success_text = "✅ **پرداخت با موفقیت انجام شد!**\n\n";
            $success_text .= "🛒 پلن: {$p['title']}\n";
            $success_text .= "💳 مبلغ: " . money($amount) . "\n";
            $success_text .= "💰 موجودی جدید: " . money($payment_result['new_balance']) . "\n";
            $success_text .= "📦 کانفیگ شما در حال ارسال است...";
            
            tg('editMessageText',[
                'chat_id' => $chat_id,
                'message_id' => $mid,
                'text' => $success_text,
                'parse_mode' => 'Markdown'
            ]);
            
            // ارسال کانفیگ (کدهای ارسال کانفیگ مثل قسمت ADMIN_APPROVE__)
            $config_details = "✅ سرویس با موفقیت ایجاد شد\n\n";
            
            // اطلاعات کاربر
            $user_info = $pdo->prepare("SELECT * FROM users WHERE id=:id");
            $user_info->execute([':id' => $from['id']]);
            $user = $user_info->fetch();
            $config_details .= "👤 نام کاربری: " . ($user['first_name'] ?? 'نامشخص') . "\n";
            
            // اطلاعات پلن
            if (strpos($code, 'VIP_') === 0) {
                preg_match('/VIP_(\d+)U_(\d+)M/', $code, $matches);
                $user_count = $matches[1];
                $month_count = $matches[2];
                $days = $month_count * 30;
                
                $config_details .= "🌿 نام سرویس: نامحدود - {$user_count} کاربر - " . money($amount) . "\n";
                $config_details .= "🇺🇳 لوکیشن: نامحدود چندلینک VIP 🔥\n";
                $config_details .= "⏳ مدت زمان: {$days} روز\n";
                $config_details .= "🗜 حجم سرویس: نامحدود\n\n";
                
            } elseif (strpos($code, 'VOL_') === 0) {
                preg_match('/VOL_(\d+)G_1M/', $code, $matches);
                $volume = $matches[1];
                
                $config_details .= "🌿 نام سرویس: حجمی - {$volume} گیگ - " . money($amount) . "\n";
                $config_details .= "🇺🇳 لوکیشن: چندلینک 🔥\n";
                $config_details .= "⏳ مدت زمان: 30 روز\n";
                $config_details .= "🗜 حجم سرویس: {$volume} گیگ\n\n";
                $config_details .= "👥 تعداد کاربر: نامحدود\n\n";
            }
            
            // لینک اتصال
            if (!empty($config_data['config_link'])) {
                $config_details .= "لینک اتصال:\n`" . $config_data['config_link'] . "`\n\n";
            } elseif (!empty($config_data['config_text'])) {
                $config_text_lines = explode("\n", $config_data['config_text']);
                foreach ($config_text_lines as $line) {
                    if (strpos($line, 'http') !== false || strpos($line, '://') !== false) {
                        $config_details .= "لینک اتصال:\n`" . trim($line) . "`\n\n";
                        break;
                    }
                }
            }
            
            $config_details .= "🧑‍🦯 شما می‌توانید شیوه اتصال را با فشردن دکمه زیر و انتخاب سیستم عامل خود دریافت کنید.";
            
            $guide_keyboard = [
                'inline_keyboard' => [
                    [['text' => '📚 مشاهده آموزش', 'callback_data' => 'GUIDE']],
                    [['text' => '📦 سرویس‌های من', 'callback_data' => 'MY_SERVICES']]
                ]
            ];
            
            // ارسال کانفیگ
            $sent_something = false;
            
            if (!empty($config_data['photo_file_id'])) {
                tg('sendPhoto',[
                    'chat_id' => $chat_id,
                    'photo' => $config_data['photo_file_id'],
                    'caption' => $config_details,
                    'parse_mode' => 'Markdown',
                    'reply_markup' => $guide_keyboard
                ]);
                $sent_something = true;
            } else {
                tg('sendMessage',[
                    'chat_id' => $chat_id,
                    'text' => $config_details,
                    'parse_mode' => 'Markdown',
                    'reply_markup' => $guide_keyboard
                ]);
                $sent_something = true;
            }
            
            // ارسال فایل اگر موجود باشد
            if (!empty($config_data['config_file_id'])) {
                tg('sendDocument',[
                    'chat_id' => $chat_id,
                    'document' => $config_data['config_file_id'],
                    'caption' => "📁 فایل کانفیگ - " . $p['title']
                ]);
            }
            
            if (!empty($config_data['config_text']) && empty($config_data['photo_file_id'])) {
                tg('sendMessage',[
                    'chat_id' => $chat_id,
                    'text' => "📝 متن کانفیگ:\n`" . $config_data['config_text'] . "`",
                    'parse_mode' => 'Markdown'
                ]);
            }
            
        } else {
            error_log("❌ DEBUG: Config delivery failed");
            
            $error_text = "✅ پرداخت موفق بود اما در ارسال کانفیگ مشکل پیش آمد.\n\n";
            $error_text .= "لطفاً با پشتیبانی تماس بگیرید:\n" . SUPPORT_LINK;
            
            tg('editMessageText',[
                'chat_id' => $chat_id,
                'message_id' => $mid,
                'text' => $error_text,
                'parse_mode' => 'Markdown'
            ]);
        }
        
        tg('answerCallbackQuery',[
            'callback_query_id' => $cq['id'],
            'text' => 'پرداخت موفق ✅'
        ]);
        
    } else {
        error_log("❌ DEBUG: Wallet payment failed - " . $payment_result['message']);
        
        tg('answerCallbackQuery',[
            'callback_query_id' => $cq['id'],
            'text' => $payment_result['message'],
            'show_alert' => true
        ]);
    }
    exit;
}

// هندلر برای نمایش کیف پول وقتی موجودی کافی نیست
if ($data === 'SHOW_WALLET') {
    $text = build_wallet_info_text($from['id']);
    
    tg('editMessageText', [
        'chat_id' => $chat_id,
        'message_id' => $mid,
        'text' => $text,
        'parse_mode' => 'Markdown',
        'reply_markup' => kb_wallet()
    ]);
    
    tg('answerCallbackQuery', [
        'callback_query_id' => $cq['id'],
        'text' => 'برای افزایش موجودی از اینجا اقدام کنید'
    ]);
    exit;
}
  /*──────── Admin: افزودن آزاد کانفیگ */
  if (isAdmin($from['id']) && ($data==='ADMIN_ADD_ROOT' || $data==='ADMIN')) {
    tg('editMessageText',[
      'chat_id'=>$chat_id,
      'message_id'=>$mid,
      'text'=>'🔧 افزودن سریع کانفیگ: اول دسته را انتخاب کن، بعد پلن را.',
      'reply_markup'=>kb_admin_add_root()
    ]);
    exit;
  }

if (isAdmin($from['id']) && $data==='ADMIN_ORDERS') {
    $page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
    $limit = 9; // 3 ردیف × 3 ستون
    $offset = ($page - 1) * $limit;
    
    // تعداد کل سفارش‌ها
    $total = $pdo->query("SELECT COUNT(*) as count FROM orders")->fetch()['count'];
    $total_pages = ceil($total / $limit);
    
    $rows = $pdo->query("SELECT o.*, u.first_name, u.last_name, u.username 
                         FROM orders o 
                         LEFT JOIN users u ON o.user_id = u.id 
                         ORDER BY o.id DESC 
                         LIMIT $limit OFFSET $offset")->fetchAll();
    
    if (!$rows) {
        tg('editMessageText',[
            'chat_id'=>$chat_id,
            'message_id'=>$mid,
            'text'=>'📭 هیچ سفارشی نیست.',
            'reply_markup'=>kb_admin_main()
        ]);
    } else {
        $txt = "📋 سفارش‌ها - صفحه {$page} از {$total_pages}\n\n";
        $txt .= "💡 برای مشاهده جزئیات روی هر سفارش کلیک کنید";
        
        $ik = [];
        $row_buttons = [];
        
        foreach ($rows as $index => $o) {
            // نام کاربر
            $user_name = $o['first_name'] ?? 'Unknown';
            if (!empty($o['last_name'])) {
                $user_name .= ' ' . $o['last_name'];
            }
            $user_name = mb_substr($user_name, 0, 10); // محدود کردن طول نام
            
            // اطلاعات پلن
            $plan_info = "";
            if (strpos($o['plan_code'], 'VIP_1U_1M') !== false) {
                $plan_info = "1m|1user";
            } elseif (strpos($o['plan_code'], 'VIP_2U_1M') !== false) {
                $plan_info = "1m|2user";
            } elseif (strpos($o['plan_code'], 'VIP_1U_3M') !== false) {
                $plan_info = "3m|1user";
            } elseif (strpos($o['plan_code'], 'VIP_2U_3M') !== false) {
                $plan_info = "3m|2user";
            } elseif (strpos($o['plan_code'], 'VOL_10G_1M') !== false) {
                $plan_info = "1m|10GB";
            } elseif (strpos($o['plan_code'], 'VOL_20G_1M') !== false) {
                $plan_info = "1m|20GB";
            } elseif (strpos($o['plan_code'], 'VOL_30G_1M') !== false) {
                $plan_info = "1m|30GB";
            } elseif (strpos($o['plan_code'], 'TEST_') !== false) {
                $plan_info = "TEST";
            } else {
                $plan_info = "Other";
            }
            
            $button_text = "{$user_name}|{$plan_info}";
            
            $row_buttons[] = ['text' => $button_text, 'callback_data' => 'ADMIN_ORDER__'.$o['id']];
            
            // هر 3 دکمه در یک ردیف
            if (count($row_buttons) === 3 || $index === count($rows) - 1) {
                $ik[] = $row_buttons;
                $row_buttons = [];
            }
        }
        
        // دکمه‌های صفحه‌بندی
        $pagination_buttons = [];
        if ($page > 1) {
            $pagination_buttons[] = ['text' => '◀️ صفحه قبل', 'callback_data' => 'ADMIN_ORDERS_PAGE__'.($page-1)];
        }
        if ($page < $total_pages) {
            $pagination_buttons[] = ['text' => 'صفحه بعد ▶️', 'callback_data' => 'ADMIN_ORDERS_PAGE__'.($page+1)];
        }
        
        if (!empty($pagination_buttons)) {
            $ik[] = $pagination_buttons;
        }
        
        $ik[] = [['text' => '◀️ بازگشت', 'callback_data' => 'ADMIN']];
        
        tg('editMessageText',[
            'chat_id' => $chat_id,
            'message_id' => $mid,
            'text' => $txt,
            'reply_markup' => ['inline_keyboard' => $ik]
        ]);
    }
    exit;
}

// هندلر جدید برای صفحه‌بندی
if (isAdmin($from['id']) && strpos($data, 'ADMIN_ORDERS_PAGE__') === 0) {
    $page = (int)substr($data, strlen('ADMIN_ORDERS_PAGE__'));
    
    $limit = 9;
    $offset = ($page - 1) * $limit;
    
    $total = $pdo->query("SELECT COUNT(*) as count FROM orders")->fetch()['count'];
    $total_pages = ceil($total / $limit);
    
    $rows = $pdo->query("SELECT o.*, u.first_name, u.last_name, u.username 
                         FROM orders o 
                         LEFT JOIN users u ON o.user_id = u.id 
                         ORDER BY o.id DESC 
                         LIMIT $limit OFFSET $offset")->fetchAll();
    
    $txt = "📋 سفارش‌ها - صفحه {$page} از {$total_pages}\n\n";
    $txt .= "💡 برای مشاهده جزئیات روی هر سفارش کلیک کنید";
    
    $ik = [];
    $row_buttons = [];
    
    foreach ($rows as $index => $o) {
        $user_name = $o['first_name'] ?? 'Unknown';
        if (!empty($o['last_name'])) {
            $user_name .= ' ' . $o['last_name'];
        }
        $user_name = mb_substr($user_name, 0, 10);
        
        $plan_info = "";
        if (strpos($o['plan_code'], 'VIP_1U_1M') !== false) {
            $plan_info = "1m|1user";
        } elseif (strpos($o['plan_code'], 'VIP_2U_1M') !== false) {
            $plan_info = "1m|2user";
        } elseif (strpos($o['plan_code'], 'VIP_1U_3M') !== false) {
            $plan_info = "3m|1user";
        } elseif (strpos($o['plan_code'], 'VIP_2U_3M') !== false) {
            $plan_info = "3m|2user";
        } elseif (strpos($o['plan_code'], 'VOL_10G_1M') !== false) {
            $plan_info = "1m|10GB";
        } elseif (strpos($o['plan_code'], 'VOL_20G_1M') !== false) {
            $plan_info = "1m|20GB";
        } elseif (strpos($o['plan_code'], 'VOL_30G_1M') !== false) {
            $plan_info = "1m|30GB";
        } elseif (strpos($o['plan_code'], 'TEST_') !== false) {
            $plan_info = "TEST";
        } else {
            $plan_info = "Other";
        }
        
        $button_text = "{$user_name}|{$plan_info}";
        $row_buttons[] = ['text' => $button_text, 'callback_data' => 'ADMIN_ORDER__'.$o['id']];
        
        if (count($row_buttons) === 3 || $index === count($rows) - 1) {
            $ik[] = $row_buttons;
            $row_buttons = [];
        }
    }
    
    $pagination_buttons = [];
    if ($page > 1) {
        $pagination_buttons[] = ['text' => '◀️ صفحه قبل', 'callback_data' => 'ADMIN_ORDERS_PAGE__'.($page-1)];
    }
    if ($page < $total_pages) {
        $pagination_buttons[] = ['text' => 'صفحه بعد ▶️', 'callback_data' => 'ADMIN_ORDERS_PAGE__'.($page+1)];
    }
    
    if (!empty($pagination_buttons)) {
        $ik[] = $pagination_buttons;
    }
    
    $ik[] = [['text' => '◀️ بازگشت', 'callback_data' => 'ADMIN']];
    
    tg('editMessageText',[
        'chat_id' => $chat_id,
        'message_id' => $mid,
        'text' => $txt,
        'reply_markup' => ['inline_keyboard' => $ik]
    ]);
    exit;
}

if (isAdmin($from['id']) && $data==='ADMIN_ADD_CAT_VIP_1M') {
  $codes = get_plan_codes_by_category('VIP_1M');
  tg('editMessageText',[
    'chat_id'=>$chat_id,
    'message_id'=>$mid,
    'text'=>'👑 پلن VIP 1ماهه را انتخاب کن:',
    'reply_markup'=>kb_admin_plans_by_codes($codes)
  ]); 
  exit;
}

if (isAdmin($from['id']) && $data==='ADMIN_ADD_CAT_VIP_3M') {
  $codes = get_plan_codes_by_category('VIP_3M');
  tg('editMessageText',[
    'chat_id'=>$chat_id,
    'message_id'=>$mid,
    'text'=>'⏳ پلن VIP 3ماهه را انتخاب کن:',
    'reply_markup'=>kb_admin_plans_by_codes($codes)
  ]); 
  exit;
}

if (isAdmin($from['id']) && $data==='ADMIN_ADD_CAT_VOL_1M') {
  $codes = get_plan_codes_by_category('VOL_1M');
  tg('editMessageText',[
    'chat_id'=>$chat_id,
    'message_id'=>$mid,
    'text'=>'📦 پلن حجمی 1ماهه را انتخاب کن:',
    'reply_markup'=>kb_admin_plans_by_codes($codes)
  ]); 
  exit;
}

  if (isAdmin($from['id']) && $data==='ADMIN_ADD_CAT_TEST') {
    tg('editMessageText',[
      'chat_id'=>$chat_id,
      'message_id'=>$mid,
      'text'=>'🧪 افزودن کانفیگ تست:',
      'reply_markup'=>[
        'inline_keyboard'=>[
          [['text'=>'➕ TEST_FREE','callback_data'=>'ADMIN_ADD_PLAN__TEST_FREE']],
          [['text'=>'◀️ بازگشت','callback_data'=>'ADMIN_ADD_ROOT']]
        ]
      ]
    ]); 
    exit;
  }

if (isAdmin($from['id']) && strpos($data,'ADMIN_ADD_PLAN__')===0) {
  $code = substr($data, strlen('ADMIN_ADD_PLAN__'));
  $p = bot_get_plan($code) ?? ['title'=>$code,'price'=>0];
    setUserMode($from['id'],'ADMIN_ADD_CONTENT',['plan_code'=>$code,'plan_title'=>$p['title']]);
    $hint="🎯 پلن انتخابی: «{$p['title']}»\n\n".
          "📝 هرچه بفرستی ذخیره می‌شود:\n".
          "• متن آزاد چندخطی (همان‌طور که می‌خواهی)\n".
          "• عکس (QR) با کپشن دلخواه\n".
          "• فایل کانفیگ (اختیاری) + متن\n\n".
          "❌ برای لغو، «◀️ بازگشت» را بزن.";
    tg('editMessageText',[
      'chat_id'=>$chat_id,
      'message_id'=>$mid,
      'text'=>$hint,
      'reply_markup'=>kb_back('ADMIN_ADD_ROOT')
    ]); 
    exit;
  }

  if (isAdmin($from['id']) && strpos($data,'ADMIN_ORDER__')===0) {
    $oid=(int)substr($data,strlen('ADMIN_ORDER__'));
    $o=$pdo->prepare("SELECT * FROM orders WHERE id=:id"); $o->execute([':id'=>$oid]); $ord=$o->fetch();
    if (!$ord){ 
      tg('answerCallbackQuery',[
        'callback_query_id'=>$cq['id'],
        'text'=>'یافت نشد',
        'show_alert'=>true
      ]); 
      exit; 
    }
    $txt="📋 جزئیات سفارش:\n".fmt_order($ord);
    $k=['inline_keyboard'=>[
      [['text'=>'🔧 دریافت کانفیگ','callback_data'=>'ADMIN_GETCFG__'.$oid]],
      [['text'=>'✅ تایید','callback_data'=>'ADMIN_APPROVE__'.$oid],['text'=>'❌ رد','callback_data'=>'ADMIN_REJECT__'.$oid]],
      [['text'=>'◀️ بازگشت','callback_data'=>'ADMIN_ORDERS']],
    ]];
    tg('editMessageText',[
      'chat_id'=>$chat_id,
      'message_id'=>$mid,
      'text'=>$txt,
      'reply_markup'=>$k
    ]); 
    exit;
  }

  if (isAdmin($from['id']) && strpos($data,'ADMIN_GETCFG__')===0) {
    $oid=(int)substr($data,strlen('ADMIN_GETCFG__'));
    $o=$pdo->prepare("SELECT * FROM orders WHERE id=:id"); $o->execute([':id'=>$oid]); $ord=$o->fetch();
    if (!$ord){ 
      tg('answerCallbackQuery',[
        'callback_query_id'=>$cq['id'],
        'text'=>'سفارش نیست',
        'show_alert'=>true
      ]); 
      exit; 
    }
    // 🔧 جستجوی بهبود یافته کانفیگ
    $plan_code_clean = trim($ord['plan_code']);
    $c=$pdo->prepare("SELECT * FROM configs WHERE (plan_code=:p OR LOWER(TRIM(plan_code))=LOWER(:p2)) AND is_used=0 ORDER BY id DESC LIMIT 5"); 
    $c->execute([':p'=>$plan_code_clean, ':p2'=>$plan_code_clean]); 
    $cfgs=$c->fetchAll();
    
    if (!$cfgs){ 
      // لاگ برای دیباگ
      $available = $pdo->query("SELECT plan_code, COUNT(*) as cnt FROM configs WHERE is_used = 0 GROUP BY plan_code")->fetchAll(PDO::FETCH_ASSOC);
      error_log("❌ ADMIN_GETCFG: No config for '{$plan_code_clean}'. Available: " . json_encode($available));
      
      tg('answerCallbackQuery',[
        'callback_query_id'=>$cq['id'],
        'text'=>"کانفیگی برای پلن «{$plan_code_clean}» موجود نیست!",
        'show_alert'=>true
      ]); 
      exit; 
    }
    foreach ($cfgs as $cfg){
      $cap="🔧 کانفیگ: {$cfg['title']} | {$cfg['plan_code']}";
      if (!empty($cfg['photo_file_id'])) tg('sendPhoto',[
        'chat_id'=>$chat_id,
        'photo'=>$cfg['photo_file_id'],
        'caption'=>$cap
      ]);
      if (!empty($cfg['config_link']))   tg('sendMessage',[
        'chat_id'=>$chat_id,
        'text'=>"🔗 لینک:\n".$cfg['config_link']
      ]);
      if (!empty($cfg['config_text']))   tg('sendMessage',[
        'chat_id'=>$chat_id,
        'text'=>"📝 متن:\n".$cfg['config_text']
      ]);
      if (!empty($cfg['config_file_id']))tg('sendDocument',[
        'chat_id'=>$chat_id,
        'document'=>$cfg['config_file_id'],
        'caption'=>$cap
      ]);
    }
    exit;
  }

if (isAdmin($from['id']) && strpos($data,'ADMIN_APPROVE__')===0) {
  $oid=(int)substr($data,strlen('ADMIN_APPROVE__'));
  $o=$pdo->prepare("SELECT * FROM orders WHERE id=:id"); $o->execute([':id'=>$oid]); $ord=$o->fetch();
  if (!$ord || $ord['status']!=='PENDING'){ 
    tg('answerCallbackQuery',[
      'callback_query_id'=>$cq['id'],
      'text'=>'نامعتبر',
      'show_alert'=>true
    ]); 
    exit; 
  }

  // 🔧 جستجوی بهبود یافته کانفیگ
  $plan_code_clean = trim($ord['plan_code']);
  error_log("🔍 ADMIN_APPROVE: Looking for config with plan_code = '{$plan_code_clean}'");
  
  // ابتدا جستجوی دقیق
  $c=$pdo->prepare("SELECT * FROM configs WHERE plan_code=:p AND is_used=0 ORDER BY id ASC LIMIT 1"); 
  $c->execute([':p'=>$plan_code_clean]); 
  $cfg=$c->fetch();
  
  // اگر پیدا نشد، جستجوی case-insensitive
  if (!$cfg) {
    $c=$pdo->prepare("SELECT * FROM configs WHERE LOWER(TRIM(plan_code))=LOWER(:p) AND is_used=0 ORDER BY id ASC LIMIT 1"); 
    $c->execute([':p'=>$plan_code_clean]); 
    $cfg=$c->fetch();
  }
  
  if (!$cfg){ 
    // 🔧 لاگ کانفیگ‌های موجود برای دیباگ
    $available = $pdo->query("SELECT plan_code, COUNT(*) as cnt FROM configs WHERE is_used = 0 GROUP BY plan_code")->fetchAll(PDO::FETCH_ASSOC);
    error_log("❌ ADMIN_APPROVE: No config for plan_code='{$plan_code_clean}'. Available: " . json_encode($available));
    
    tg('answerCallbackQuery',[
      'callback_query_id'=>$cq['id'],
      'text'=>"کانفیگ برای پلن «{$plan_code_clean}» موجود نیست! لطفا اول کانفیگ اضافه کنید.",
      'show_alert'=>true
    ]); 
    exit; 
  }
  
  error_log("✅ ADMIN_APPROVE: Found config #{$cfg['id']} for plan_code = '{$plan_code_clean}'");

  // ابتدا کانفیگ را ذخیره کنید
  $config_data = [
    'title' => $cfg['title'],
    'plan_code' => $cfg['plan_code'],
    'config_link' => $cfg['config_link'] ?? null,
    'config_text' => $cfg['config_text'] ?? null,
    'config_file_id' => $cfg['config_file_id'] ?? null,
    'photo_file_id' => $cfg['photo_file_id'] ?? null
  ];

  // علامت‌گذاری کانفیگ به عنوان استفاده شده
  $pdo->prepare("UPDATE configs SET is_used=1, used_by=:uid, used_at=NOW() WHERE id=:id")->execute([':id'=>$cfg['id'], ':uid'=>$ord['user_id']]);

  // آپدیت سفارش و ایجاد سیلز
  $pdo->prepare("UPDATE orders SET status='APPROVED', approved_at=NOW() WHERE id=:id")->execute([':id'=>$oid]);
    // محاسبه تاریخ انقضا بر اساس کد پلن
  $expiresAt = null;

  // VIP_XU_YM → Y ماه
  if (strpos($ord['plan_code'], 'VIP_') === 0) {
      if (preg_match('/VIP_\d+U_(\d+)M/', $ord['plan_code'], $m)) {
          $months = (int)$m[1];
          $expiresAt = date('Y-m-d H:i:s', strtotime("+{$months} month"));
      }
  }
  // پلن حجمی (1 ماهه)
  elseif (strpos($ord['plan_code'], 'VOL_') === 0) {
      $expiresAt = date('Y-m-d H:i:s', strtotime('+1 month'));
  }
  // پلن تست (1 روزه)
  elseif (strpos($ord['plan_code'], 'TEST_') === 0) {
      $expiresAt = date('Y-m-d H:i:s', strtotime('+1 day'));
  }

  // درج در جدول sales همراه با expires_at
  $insert_sales = $pdo->prepare("
      INSERT INTO sales (order_id,user_id,plan_code,plan_title,price,config_data,expires_at)
      VALUES (:o,:u,:pc,:pt,:pr,:cfg,:exp)
  ");
  $insert_sales->execute([
      ':o'   => $oid,
      ':u'   => $ord['user_id'],
      ':pc'  => $ord['plan_code'],
      ':pt'  => $ord['plan_title'],
      ':pr'  => $ord['price'],
      ':cfg' => json_encode($config_data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),
      ':exp' => $expiresAt
  ]);

// 🎁 محاسبه و اعمال جایزه ۱۰٪ خرید (فقط برای پرداخت کارت به کارت و کاربرانی که بونوس کیف پول نگرفته‌اند)
$cashback_amount = 0;
if ($ord['payment_method'] === 'CARD' || $ord['payment_method'] === null) {
    // چک کردن اینکه کاربر بونوس کیف پول نگرفته باشد
    $check_bonus = $pdo->prepare("SELECT has_wallet_bonus FROM users WHERE id = :id");
    $check_bonus->execute([':id' => $ord['user_id']]);
    $user_bonus_status = $check_bonus->fetch();
    
    if (!$user_bonus_status || $user_bonus_status['has_wallet_bonus'] == 0) {
        $cashback_amount = (int)($ord['price'] * 0.10);
        
        // افزودن به کیف پول کاربر
        $add_cashback = $pdo->prepare("UPDATE users SET balance = balance + :amount, total_cashback = total_cashback + :amount WHERE id = :id");
        $add_cashback->execute([':amount' => $cashback_amount, ':id' => $ord['user_id']]);
        
        error_log("🎁 Cashback added: " . $cashback_amount . " for user " . $ord['user_id']);
    }
}

// 🔥 ارسال کانفیگ به کاربران در صف انتظار
deliver_config_to_waiting_users($ord['plan_code']);

  $uid=$ord['user_id'];
  
  // 🎊 ارسال استیکر تایید
  tg('sendSticker', [
      'chat_id' => $uid,
      'sticker' => 'CAACAgIAAxkBAAEKZxplRxRYAAF1u9VqxLxgcmS3B4YxWgACXQADWp29CirpAAHz0HDJMzME' // استیکر موفقیت
  ]);
  
  // ارسال پیام تأیید به کاربر
  $confirm_text = "🎉✨ **سفارش شما تأیید شد!** ✨🎉\n\n";
  $confirm_text .= "🛒 پلن: {$ord['plan_title']}\n";
  $confirm_text .= "💳 مبلغ: ".money((int)$ord['price'])."\n\n";
  $confirm_text .= "📦 کانفیگ شما در حال ارسال است...";
  
  tg('sendMessage', [
    'chat_id'=>$uid,
    'text'=>$confirm_text,
    'parse_mode' => 'Markdown'
  ]);
  
  // 🎁 اطلاع‌رسانی جایزه خرید
  if ($cashback_amount > 0) {
      sleep(1); // کمی تاخیر برای خوانایی بهتر
      
      $cashback_msg = "🎁🔥 **جایزه خرید دریافت کردید!** 🔥🎁\n\n";
      $cashback_msg .= "━━━━━━━━━━━━━━━━━━━━\n";
      $cashback_msg .= "💰 **جایزه ۱۰٪ خرید:** +" . money($cashback_amount) . "\n";
      $cashback_msg .= "━━━━━━━━━━━━━━━━━━━━\n\n";
      $cashback_msg .= "🌟 این مبلغ به کیف پول شما اضافه شد!\n";
      $cashback_msg .= "💳 موجودی جدید: " . money(get_user_balance($uid)) . "\n\n";
      $cashback_msg .= "✨ از خرید شما متشکریم! ✨";
      
      tg('sendMessage', [
          'chat_id' => $uid,
          'text' => $cashback_msg,
          'parse_mode' => 'Markdown',
          'reply_markup' => [
              'inline_keyboard' => [
                  [['text' => '💰 مشاهده کیف پول', 'callback_data' => 'WALLET']]
              ]
          ]
      ]);
  }
// ارسال کانفیگ به کاربر با فرمت جدید
$config_details = "✅ سرویس با موفقیت ایجاد شد\n\n";

// اطلاعات کاربر
$user_info = $pdo->prepare("SELECT * FROM users WHERE id=:id");
$user_info->execute([':id'=>$uid]);
$user = $user_info->fetch();
$config_details .= "👤 نام کاربری: " . ($user['first_name'] ?? 'نامشخص') . "\n";

// اطلاعات پلن
if (strpos($ord['plan_code'], 'VIP_') === 0) {
    preg_match('/VIP_(\d+)U_(\d+)M/', $ord['plan_code'], $matches);
    $user_count = $matches[1];
    $month_count = $matches[2];
    $days = $month_count * 30;
    
    $config_details .= "🌿 نام سرویس: نامحدود - {$user_count} کاربر - " . money((int)$ord['price']) . "\n";
    $config_details .= "🇺🇳 لوکیشن: نامحدود چندلینک VIP 🔥\n";
    $config_details .= "⏳ مدت زمان: {$days} روز\n";
    $config_details .= "🗜 حجم سرویس: نامحدود\n\n";
    
} elseif (strpos($ord['plan_code'], 'VOL_') === 0) {
    preg_match('/VOL_(\d+)G_1M/', $ord['plan_code'], $matches);
    $volume = $matches[1];
    
    $config_details .= "🌿 نام سرویس: حجمی - {$volume} گیگ - " . money((int)$ord['price']) . "\n";
    $config_details .= "🇺🇳 لوکیشن: چندلینک 🔥\n";
    $config_details .= "⏳ مدت زمان: 30 روز\n";
    $config_details .= "🗜 حجم سرویس: {$volume} گیگ\n\n";
    $config_details .= "👥 تعداد کاربر: نامحدود\n\n";
    
} elseif (strpos($ord['plan_code'], 'TEST_') === 0) {
    $config_details .= "🌿 نام سرویس: تست رایگان\n";
    $config_details .= "🇺🇳 لوکیشن: چندلینک تست 🔥\n";
    $config_details .= "⏳ مدت زمان: 1 روز\n";
    $config_details .= "🗜 حجم سرویس: 2 گیگ\n\n";
    $config_details .= "👥 تعداد کاربر: 1\n\n";
}

// لینک اتصال (اگر موجود باشد)
if (!empty($config_data['config_link'])) {
    $config_details .= "لینک اتصال:\n`" . $config_data['config_link'] . "`\n\n";
} elseif (!empty($config_data['config_text'])) {
    // اگر لینک مستقیم نداریم، از متن کانفیگ استفاده می‌کنیم
    $config_text_lines = explode("\n", $config_data['config_text']);
    foreach ($config_text_lines as $line) {
        if (strpos($line, 'http') !== false || strpos($line, '://') !== false) {
            $config_details .= "لینک اتصال:\n`" . trim($line) . "`\n\n";
            break;
        }
    }
}

$config_details .= "🧑‍🦯 شما می‌توانید شیوه اتصال را با فشردن دکمه زیر و انتخاب سیستم عامل خود دریافت کنید.";

// کیبورد با دکمه آموزش
$guide_keyboard = [
    'inline_keyboard' => [
        [['text' => '📚 مشاهده آموزش', 'callback_data' => 'GUIDE']],
        [['text' => '📦 سرویس‌های من', 'callback_data' => 'MY_SERVICES']]
    ]
];

// ارسال کانفیگ به کاربر
$sent_something = false;

if (!empty($config_data['photo_file_id'])) {
    tg('sendPhoto',[
        'chat_id' => $uid,
        'photo' => $config_data['photo_file_id'],
        'caption' => $config_details,
        'parse_mode' => 'Markdown',
        'reply_markup' => $guide_keyboard
    ]);
    $sent_something = true;
} else {
    tg('sendMessage',[
        'chat_id' => $uid,
        'text' => $config_details,
        'parse_mode' => 'Markdown',
        'reply_markup' => $guide_keyboard
    ]);
    $sent_something = true;
}

// ارسال فایل اگر موجود باشد
if (!empty($config_data['config_file_id'])) {
    tg('sendDocument',[
        'chat_id' => $uid,
        'document' => $config_data['config_file_id'],
        'caption' => "📁 فایل کانفیگ - " . $ord['plan_title']
    ]);
}

// اگر متن کانفیگ جداگانه داریم و در عکس نبوده
if (!empty($config_data['config_text']) && empty($config_data['photo_file_id'])) {
    tg('sendMessage',[
        'chat_id' => $uid,
        'text' => "📝 متن کانفیگ:\n`" . $config_data['config_text'] . "`",
        'parse_mode' => 'Markdown'
    ]);
}

  // اگر هیچ کانفیگی ارسال نشد
  if (!$sent_something) {
      tg('sendMessage',[
        'chat_id'=>$uid,
        'text'=>"⚠️ کانفیگ موجود نیست. لطفاً با پشتیبانی تماس بگیرید:\n".SUPPORT_LINK
      ]);
  }

  tg('answerCallbackQuery',[
    'callback_query_id'=>$cq['id'],
    'text'=>'تایید و ارسال شد ✅'
  ]); 
  
  // آپدیت پیام ادمین
  $txt="✅ سفارش تایید و کانفیگ ارسال شد\n".fmt_order($ord);
  tg('editMessageText',[
    'chat_id'=>$chat_id,
    'message_id'=>$mid,
    'text'=>$txt,
    'reply_markup'=>['inline_keyboard'=>[[['text'=>'◀️ بازگشت','callback_data'=>'ADMIN_ORDERS']]]]
  ]);
  exit;
}

  if (isAdmin($from['id']) && strpos($data,'ADMIN_REJECT__')===0) {
    $oid=(int)substr($data,strlen('ADMIN_REJECT__'));
    $o=$pdo->prepare("SELECT * FROM orders WHERE id=:id"); $o->execute([':id'=>$oid]); $ord=$o->fetch();
    if (!$ord || $ord['status']!=='PENDING'){ 
      tg('answerCallbackQuery',[
        'callback_query_id'=>$cq['id'],
        'text'=>'نامعتبر',
        'show_alert'=>true
      ]); 
      exit; 
    }
    $pdo->prepare("UPDATE orders SET status='REJECTED', rejected_at=NOW() WHERE id=:id")->execute([':id'=>$oid]);
    tg('sendMessage',[
      'chat_id'=>$ord['user_id'],
      'text'=>"❌ تراکنش شما رد شد.\n💬 در صورت سوال: ".ADMIN_TAG,
      'reply_markup'=>reply_main_kb()
    ]);
    tg('answerCallbackQuery',[
      'callback_query_id'=>$cq['id'],
      'text'=>'رد شد'
    ]); 
    exit;
  }
/*──────────────────────── Admin Wallet Management */
if (isAdmin($from['id']) && strpos($data, 'ADMIN_APPROVE_DEPOSIT__') === 0) {
    $tx_id = (int)substr($data, strlen('ADMIN_APPROVE_DEPOSIT__'));
    
    global $pdo;
    
    // شروع تراکنش دیتابیس
    $pdo->beginTransaction();
    
    try {
        // دریافت تراکنش
        $stmt = $pdo->prepare("SELECT * FROM wallet_transactions WHERE id = :id AND status = 'PENDING'");
        $stmt->execute([':id' => $tx_id]);
        $transaction = $stmt->fetch(PDO::FETCH_ASSOC);
        
        if (!$transaction) {
            $pdo->rollBack();
            tg('answerCallbackQuery', [
                'callback_query_id' => $cq['id'],
                'text' => 'تراکنش یافت نشد یا قبلاً پردازش شده',
                'show_alert' => true
            ]);
            exit;
        }
        
        // افزایش موجودی کاربر
        $update_balance = $pdo->prepare("UPDATE users SET balance = balance + :amount WHERE id = :id");
        $success = $update_balance->execute([':amount' => $transaction['amount'], ':id' => $transaction['user_id']]);
        
        if (!$success) {
            $pdo->rollBack();
            tg('answerCallbackQuery', [
                'callback_query_id' => $cq['id'],
                'text' => 'خطا در افزایش موجودی',
                'show_alert' => true
            ]);
            exit;
        }
        
        // آپدیت وضعیت تراکنش
        $update_stmt = $pdo->prepare("
            UPDATE wallet_transactions 
            SET status = 'COMPLETED', processed_at = NOW(), processed_by = :admin_id 
            WHERE id = :id
        ");
        $update_stmt->execute([':admin_id' => $from['id'], ':id' => $tx_id]);
        
        // کامیت تراکنش
        $pdo->commit();
        
        // اطلاع به کاربر
        $new_balance = get_user_balance($transaction['user_id']);
        tg('sendMessage', [
            'chat_id' => $transaction['user_id'],
            'text' => "✅ **موجودی کیف پول شما افزایش یافت!**\n\n" .
                     "💰 **مبلغ:** " . money($transaction['amount']) . "\n" .
                     "💵 **موجودی جدید:** " . money($new_balance) . "\n" .
                     "📅 **زمان:** " . jdate('Y/m/d H:i') . "\n\n" .
                     "🎉 اکنون می‌توانید از موجودی خود برای خرید استفاده کنید.",
            'parse_mode' => 'Markdown',
            'reply_markup' => kb_wallet()
        ]);
        
        tg('answerCallbackQuery', [
            'callback_query_id' => $cq['id'],
            'text' => 'موجودی کاربر افزایش یافت ✅'
        ]);
        
        // آپدیت پیام ادمین
        tg('editMessageText', [
            'chat_id' => $chat_id,
            'message_id' => $mid,
            'text' => "✅ **تراکنش تایید شد**\n\n" .
                     "👤 کاربر: " . $transaction['user_id'] . "\n" .
                     "💰 مبلغ: " . money((int)$transaction['amount']) . "\n" .
                     "✅ توسط: " . ($from['first_name'] ?? 'ادمین') . "\n" .
                     "🕒 زمان: " . jdate('Y/m/d H:i'),
            'parse_mode' => 'Markdown'
        ]);
        
    } catch (Exception $e) {
        $pdo->rollBack();
        error_log("Error in ADMIN_APPROVE_DEPOSIT: " . $e->getMessage());
        tg('answerCallbackQuery', [
            'callback_query_id' => $cq['id'],
            'text' => 'خطا در پردازش تراکنش',
            'show_alert' => true
        ]);
    }
    exit;
}

if (isAdmin($from['id']) && strpos($data, 'ADMIN_REJECT_DEPOSIT__') === 0) {
    $tx_id = (int)substr($data, strlen('ADMIN_REJECT_DEPOSIT__'));
    
    global $pdo;
    
    try {
        $stmt = $pdo->prepare("SELECT * FROM wallet_transactions WHERE id = :id AND status = 'PENDING'");
        $stmt->execute([':id' => $tx_id]);
        $transaction = $stmt->fetch(PDO::FETCH_ASSOC);
        
        if (!$transaction) {
            tg('answerCallbackQuery', [
                'callback_query_id' => $cq['id'],
                'text' => 'تراکنش یافت نشد یا قبلاً پردازش شده',
                'show_alert' => true
            ]);
            exit;
        }
        
        // رد تراکنش
        $update_stmt = $pdo->prepare("
            UPDATE wallet_transactions 
            SET status = 'REJECTED', processed_at = NOW(), processed_by = :admin_id 
            WHERE id = :id
        ");
        $update_stmt->execute([':admin_id' => $from['id'], ':id' => $tx_id]);
        
        // اطلاع به کاربر
        tg('sendMessage', [
            'chat_id' => $transaction['user_id'],
            'text' => "❌ **درخواست افزایش موجودی شما رد شد**\n\n" .
                     "💰 **مبلغ درخواستی:** " . money($transaction['amount']) . "\n" .
                     "📅 **زمان:** " . jdate('Y/m/d H:i') . "\n\n" .
                     "💬 **دلیل:** ممکن است رسید واریز نامعتبر باشد یا مشکلی در پرداخت وجود داشته باشد.\n\n" .
                     "📞 برای اطلاعات بیشتر با پشتیبانی تماس بگیرید.",
            'parse_mode' => 'Markdown',
            'reply_markup' => kb_wallet()
        ]);
        
        tg('answerCallbackQuery', [
            'callback_query_id' => $cq['id'],
            'text' => 'درخواست کاربر رد شد'
        ]);
        
        // آپدیت پیام ادمین
        tg('editMessageText', [
            'chat_id' => $chat_id,
            'message_id' => $mid,
            'text' => "❌ **تراکنش رد شد**\n\n" .
                     "👤 کاربر: " . $transaction['user_id'] . "\n" .
                     "💰 مبلغ: " . money((int)$transaction['amount']) . "\n" .
                     "❌ توسط: " . ($from['first_name'] ?? 'ادمین') . "\n" .
                     "🕒 زمان: " . jdate('Y/m/d H:i'),
            'parse_mode' => 'Markdown'
        ]);
        
    } catch (Exception $e) {
        error_log("Error in ADMIN_REJECT_DEPOSIT: " . $e->getMessage());
        tg('answerCallbackQuery', [
            'callback_query_id' => $cq['id'],
            'text' => 'خطا در پردازش تراکنش',
            'show_alert' => true
        ]);
    }
    exit;
}

// بعد از بخش ADMIN_REJECT_DEPOSIT__ این را اضافه کنید
if (isAdmin($from['id']) && strpos($data, 'ADMIN_USER_INFO__') === 0) {
    $user_id = (int)substr($data, strlen('ADMIN_USER_INFO__'));
    
    $user_info = $pdo->prepare("SELECT * FROM users WHERE id = :id");
    $user_info->execute([':id' => $user_id]);
    $user = $user_info->fetch();
    
    if (!$user) {
        tg('answerCallbackQuery', [
            'callback_query_id' => $cq['id'],
            'text' => 'کاربر یافت نشد',
            'show_alert' => true
        ]);
        exit;
    }
    
    $text = "👤 **اطلاعات کاربر**\n\n";
    $text .= "🆔 **آیدی:** `{$user['id']}`\n";
    $text .= "📛 **نام:** " . ($user['first_name'] ?? 'نامشخص') . " " . ($user['last_name'] ?? '') . "\n";
    $text .= "🔗 **یوزرنیم:** @" . ($user['username'] ?? 'بدون یوزرنیم') . "\n";
    $text .= "💵 **موجودی:** " . money($user['balance'] ?? 0) . "\n";
    $text .= "👑 **ادمین:** " . ($user['is_admin'] ? '✅' : '❌') . "\n";
    $text .= "🧪 **تست گرفته:** " . ($user['test_claimed'] ? '✅' : '❌') . "\n";
    $text .= "📅 **عضویت:** " . jdate('Y/m/d H:i', strtotime($user['created_at']));
    
    tg('sendMessage', [
        'chat_id' => $chat_id,
        'text' => $text,
        'parse_mode' => 'Markdown'
    ]);
    
    tg('answerCallbackQuery', [
        'callback_query_id' => $cq['id'],
        'text' => 'اطلاعات کاربر نمایش داده شد'
    ]);
    exit;
}
  // دیفالت
  tg('answerCallbackQuery', ['callback_query_id'=>$cq['id'], 'text'=>'...']);
  exit;
}
