<?php
// شروع session قبل از هر چیز
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

require_once '../config.php';
require_once '../api/XrayAPI.php';



// بررسی لاگین
if (!isLoggedIn()) {
    redirect('../login.php');
}

// بررسی دسترسی نماینده
if (!isRepresentative()) {
    setMessage('دسترسی غیرمجاز', 'error');
    redirect('../login.php');
}

$page_title = 'مدیریت کاربران';

$representative_id = $_SESSION['user_id'];
$panel_id = $_SESSION['panel_id'];

// به‌روزرسانی آخرین فعالیت
try {
    if (function_exists('updateRepresentativeActivity')) {
        updateRepresentativeActivity($pdo, $representative_id);
    }
} catch (Exception $e) {
    // نادیده گرفتن خطا
}

// دریافت اطلاعات پنل
$panel = $pdo->prepare("SELECT * FROM panels WHERE id = ?");
$panel->execute([$panel_id]);
$panel = $panel->fetch();

if (!$panel) {
    setMessage('خطا: پنل یافت نشد!', 'error');
    redirect('dashboard.php');
}

// دریافت اطلاعات نماینده و بررسی محدودیت‌ها (شامل ریمارک و قیمت‌های اختصاصی)
try {
    $rep_info = $pdo->prepare("SELECT traffic_limit, expiry_date, used_traffic, default_remark, price_per_gb, price_per_day, discount_percent FROM representatives WHERE id = ?");
    $rep_info->execute([$representative_id]);
    $rep_info = $rep_info->fetch();
} catch (Exception $e) {
    $rep_info = $pdo->prepare("SELECT traffic_limit, expiry_date, used_traffic FROM representatives WHERE id = ?");
    $rep_info->execute([$representative_id]);
    $rep_info = $rep_info->fetch();
    if ($rep_info) {
        $rep_info['default_remark'] = null;
        $rep_info['price_per_gb'] = null;
        $rep_info['price_per_day'] = null;
        $rep_info['discount_percent'] = null;
    }
}
if (!$rep_info) {
    $rep_info = ['traffic_limit' => 0, 'expiry_date' => null, 'used_traffic' => 0, 'default_remark' => null, 'price_per_gb' => null, 'price_per_day' => null, 'discount_percent' => null];
}

$rep_traffic_limit = $rep_info['traffic_limit'] ?? 0;
$rep_expiry_date = $rep_info['expiry_date'] ?? null;
$rep_used_traffic = $rep_info['used_traffic'] ?? 0;
$rep_default_remark = trim($rep_info['default_remark'] ?? '');
$rep_wallet_balance = walletBalance($pdo, $representative_id);
$wallet_price_per_config = walletPricePerConfig($pdo);
// قیمت گیگ و روز: اول از نماینده، در غیر این صورت از تنظیمات سراسری
$wallet_price_per_gb = isset($rep_info['price_per_gb']) && $rep_info['price_per_gb'] !== '' && $rep_info['price_per_gb'] !== null
    ? (float)$rep_info['price_per_gb'] : walletPricePerGB($pdo);
$wallet_price_per_day = isset($rep_info['price_per_day']) && $rep_info['price_per_day'] !== '' && $rep_info['price_per_day'] !== null
    ? (float)$rep_info['price_per_day'] : walletPricePerDay($pdo);
// تخفیف: اول نماینده، در غیر این صورت تخفیف سراسری
$discount_percent = isset($rep_info['discount_percent']) && $rep_info['discount_percent'] !== '' && $rep_info['discount_percent'] !== null
    ? max(0, min(100, (int)$rep_info['discount_percent'])) : defaultDiscountPercent($pdo);
// قوانین و محدودیت‌های سراسری
$min_traffic_gb_rule = minTrafficGbForNormalPrice($pdo);
$min_traffic_extra_charge = minTrafficExtraCharge($pdo);
$max_users_rep = maxUsersPerRepresentative($pdo);
$max_traffic_user_gb = maxTrafficPerUserGb($pdo);
$min_traffic_user_gb = minTrafficPerUserGb($pdo);

// بررسی انقضای نماینده
$is_rep_expired = $rep_expiry_date && strtotime($rep_expiry_date) < time();
$is_rep_traffic_limited = $rep_traffic_limit > 0 && $rep_used_traffic >= $rep_traffic_limit;

// دریافت inbound های مجاز نماینده (از یک یا چند پنل) و محدودیت هر کدام
$allowed_inbound_ids = [];
$allowed_pairs = [];
$inbound_user_limit = [];
try {
    $stmt = $pdo->prepare("SELECT panel_id, inbound_id, COALESCE(user_limit, 0) as user_limit FROM representative_inbounds WHERE representative_id = ? AND status = 'active'");
    $stmt->execute([$representative_id]);
    foreach ($stmt->fetchAll() as $row) {
        $pid = (int)($row['panel_id'] ?? 0);
        $iid = (int)($row['inbound_id'] ?? 0);
        $allowed_inbound_ids[] = $iid;
        $key = $pid . '_' . $iid;
        $allowed_pairs[] = ['panel_id' => $pid, 'inbound_id' => $iid];
        $inbound_user_limit[$key] = (int)($row['user_limit'] ?? 0);
    }
} catch (Exception $e) {
    try {
        $stmt = $pdo->prepare("SELECT inbound_id, COALESCE(user_limit, 0) as user_limit FROM representative_inbounds WHERE representative_id = ? AND status = 'active'");
        $stmt->execute([$representative_id]);
        foreach ($stmt->fetchAll() as $row) {
            $allowed_inbound_ids[] = (int)$row['inbound_id'];
            $inbound_user_limit[(int)$row['inbound_id']] = (int)($row['user_limit'] ?? 0);
        }
        $allowed_pairs = [];
    } catch (Exception $e2) {
        $allowed_inbound_ids = [];
        $allowed_pairs = [];
    }
    if (empty($inbound_user_limit)) $inbound_user_limit = [];
}

// =================================================================================
// بهینه‌سازی: دریافت تمام اطلاعات کاربران و اینباندها در یک پاس
// =================================================================================
$all_inbounds_data = []; // [panel_id_inbound_id] => ['remark' => ..., 'client_count' => ...]
$client_traffic_data = []; // [panel_id_client_email] => ['up' => ..., 'down' => ..., 'total' => ..., 'expiryTime' => ...]

if (!empty($allowed_pairs)) {
    // 1. اینباندها را بر اساس پنل گروه‌بندی کن
    $inbounds_by_panel = [];
    foreach ($allowed_pairs as $p) {
        $pid = (int)$p['panel_id'];
        $iid = (int)$p['inbound_id'];
        if ($pid > 0 && $iid > 0) {
            $inbounds_by_panel[$pid][$iid] = true;
        }
    }

    // 2. برای هر پنل، اطلاعات را واکشی کن
    $panels_stmt = $pdo->prepare("SELECT * FROM panels WHERE id = ? AND status = 'active'");
    foreach ($inbounds_by_panel as $current_panel_id => $allowed_iids) {
        $panels_stmt->execute([$current_panel_id]);
        $current_panel = $panels_stmt->fetch();
        if (!$current_panel) {
            continue;
        }

        try {
            // 3. یک نمونه از API بساز
            $api = new XrayAPI($current_panel['url'], $current_panel['username'], $current_panel['password'], null, $current_panel['config_domain'] ?? null);
            
            // 4. تمام اینباندها را از پنل دریافت کن
            // با فرض اینکه LIVE_USER_STATS فعال است، این پاسخ باید شامل clientStats با آمار لحظه‌ای باشد
            $inbounds_result = $api->getInbounds();
            $inbound_list = $inbounds_result['obj'] ?? $inbounds_result['data'] ?? [];
            
            if (!is_array($inbound_list) || empty($inbound_list)) {
                continue;
            }

            // 5. نتایج را پردازش کن
            foreach ($inbound_list as $inbound) {
                $inbound_id = (int)($inbound['id'] ?? 0);

                // اگر اینباند در لیست مجاز نماینده نیست، ادامه بده
                if (!isset($allowed_iids[$inbound_id])) {
                    continue;
                }

                $client_stats = $inbound['clientStats'] ?? [];
                
                // ذخیره اطلاعات کلی اینباند
                $all_inbounds_data[$current_panel_id . '_' . $inbound_id] = [
                    'remark' => $inbound['remark'] ?? 'بدون نام',
                    'client_count' => count($client_stats)
                ];

                // پردازش و ذخیره آمار هر کلاینت
                if (!empty($client_stats)) {
                    foreach ($client_stats as $client) {
                        $email = trim($client['email'] ?? '');
                        if (empty($email)) {
                            continue;
                        }
                        
                        $client_key = $current_panel_id . '_' . $email;
                        $client_traffic_data[$client_key] = [
                            'up' => (int)($client['up'] ?? 0),
                            'down' => (int)($client['down'] ?? 0),
                            'total' => (int)($client['total'] ?? 0),
                            'expiryTime' => (int)($client['expiryTime'] ?? 0),
                        ];
                    }
                }
            }
        } catch (Exception $e) {
            // خطا در ارتباط با پنل، آن را لاگ کن یا نادیده بگیر
            error_log("Error fetching data for panel ID $current_panel_id: " . $e->getMessage());
        }
    }
}



// وارد کردن کاربران موجود در اینباندهای همهٔ پنل‌های مجاز به لیست
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'import_from_panel') {
    $imported = 0;
    $skipped = 0;
    try {
        $existing = [];
        $stmt = $pdo->prepare("SELECT panel_id, inbound_id, xray_user_id FROM reseller_users WHERE representative_id = ?");
        $stmt->execute([$representative_id]);
        while ($row = $stmt->fetch()) {
            $existing[(int)$row['panel_id'] . '_' . (int)$row['inbound_id'] . '_' . ($row['xray_user_id'] ?? '')] = true;
        }
        $inbounds_by_panel = [];
        foreach ($allowed_pairs as $p) {
            $pid = (int)$p['panel_id'];
            $iid = (int)$p['inbound_id'];
            if ($pid > 0 && $iid > 0) $inbounds_by_panel[$pid][$iid] = true;
        }
        if (empty($inbounds_by_panel)) {
            setMessage('هیچ اینباندی برای شما تعریف نشده است.', 'error');
            redirect('users.php');
        }
        $panels_stmt = $pdo->prepare("SELECT * FROM panels WHERE id = ? AND status = 'active'");
        foreach ($inbounds_by_panel as $current_panel_id => $allowed_iids) {
            $panels_stmt->execute([$current_panel_id]);
            $current_panel = $panels_stmt->fetch();
            if (!$current_panel) continue;
            $proxy_config = null;
            if (!empty($current_panel['proxy_host'])) {
                $proxy_config = [
                    'type' => $current_panel['proxy_type'] ?? 'socks5',
                    'host' => $current_panel['proxy_host'],
                    'port' => $current_panel['proxy_port'] ?? 1080,
                    'username' => $current_panel['proxy_username'] ?? null,
                    'password' => $current_panel['proxy_password'] ?? null,
                    'use_on_error' => !empty($current_panel['use_proxy'])
                ];
            }
            try {
                $xrayAPI = new XrayAPI($current_panel['url'], $current_panel['username'], $current_panel['password'], $proxy_config, $current_panel['config_domain'] ?? null);
                $inbounds_result = $xrayAPI->getInbounds();
                $inbound_list = $inbounds_result['obj'] ?? $inbounds_result['data'] ?? [];
                if (!is_array($inbound_list)) $inbound_list = [];
            } catch (Exception $e) {
                continue;
            }
            foreach ($inbound_list as $inbound) {
                $iid = (int)($inbound['id'] ?? 0);
                if ($iid <= 0 || empty($allowed_iids[$iid])) continue;
                $clients = $inbound['clients'] ?? [];
                if (empty($clients) && !empty($inbound['settings'])) {
                    $settings = is_string($inbound['settings']) ? json_decode($inbound['settings'], true) : $inbound['settings'];
                    $clients = isset($settings['clients']) && is_array($settings['clients']) ? $settings['clients'] : [];
                }
                foreach ($clients as $client) {
                    $cid = trim((string)($client['id'] ?? ''));
                    $email = trim((string)($client['email'] ?? ''));
                    if ($cid === '' || $email === '') continue;
                    $key = $current_panel_id . '_' . $iid . '_' . $cid;
                    if (isset($existing[$key])) { $skipped++; continue; }
                    $sub_id = trim((string)($client['subId'] ?? ''));
                    $total_gb = isset($client['totalGB']) && $client['totalGB'] > 0 ? (float)$client['totalGB'] : 0;
                    $traffic_limit_bytes = $total_gb > 0 ? (int)round($total_gb * 1024 * 1024 * 1024) : 0;
                    $expiry_time = isset($client['expiryTime']) && $client['expiryTime'] > 0 ? (int)$client['expiryTime'] : 0;
                    $expiry_date = $expiry_time > 0 ? date('Y-m-d H:i:s', (int)($expiry_time / 1000)) : null;
                    $total_traffic = 0;
                    try {
                        $stats = $xrayAPI->getClientStats($iid, $cid);
                        $traffic = isset($stats['obj']) && is_array($stats['obj']) ? $stats['obj'] : $stats;
                        if (!empty($traffic)) $total_traffic = (int)(($traffic['up'] ?? 0) + ($traffic['down'] ?? 0));
                    } catch (Exception $e) { }
                    $check_token = bin2hex(random_bytes(16));
                    try {
                        $stmt = $pdo->prepare("INSERT INTO reseller_users (representative_id, panel_id, xray_user_id, sub_id, inbound_id, email, remark, traffic_limit, total_traffic, expiry_date, check_token) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
                        $stmt->execute([$representative_id, $current_panel_id, $cid, $sub_id ?: null, $iid, $email, $email, $traffic_limit_bytes, $total_traffic, $expiry_date, $check_token]);
                    } catch (PDOException $e) {
                        if (strpos($e->getMessage(), 'sub_id') !== false) {
                            $stmt = $pdo->prepare("INSERT INTO reseller_users (representative_id, panel_id, xray_user_id, inbound_id, email, remark, traffic_limit, total_traffic, expiry_date, check_token) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
                            $stmt->execute([$representative_id, $current_panel_id, $cid, $iid, $email, $email, $traffic_limit_bytes, $total_traffic, $expiry_date, $check_token]);
                        } else {
                            throw $e;
                        }
                    }
                    $existing[$key] = true;
                    $imported++;
                }
            }
        }
        setMessage($imported > 0 ? "وارد شد: $imported کاربر" . ($skipped > 0 ? "، رد شد (قبلاً در لیست): $skipped" : '') : ($skipped > 0 ? "همهٔ کاربران قبلاً در لیست بودند ($skipped مورد)." : "کاربری در اینباندهای مجاز شما یافت نشد."));
    } catch (Exception $e) {
        setMessage('خطا در وارد کردن: ' . $e->getMessage(), 'error');
    }
    redirect('users.php');
}

// همگام‌سازی ترافیک از روی پنل (بدون نیاز به کرون)
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'sync_traffic_from_panel') {
    $updated = 0;
    $api_by_panel = [];
    $users_to_sync = $pdo->prepare("SELECT id, panel_id, inbound_id, xray_user_id, email, traffic_limit, expiry_date, status FROM reseller_users WHERE representative_id = ?");
    $users_to_sync->execute([$representative_id]);
    $users_to_sync = $users_to_sync->fetchAll();
    foreach ($users_to_sync as $u) {
        $pid = (int)($u['panel_id'] ?? 0);
        $iid = (int)($u['inbound_id'] ?? 0);
        $client_id = trim($u['xray_user_id'] ?? '');
        if ($client_id === '' && !empty($u['email'])) $client_id = trim($u['email']);
        if ($pid <= 0 || $iid <= 0 || $client_id === '') continue;
        if (!isset($api_by_panel[$pid])) {
            $prow = ($pid === (int)$panel_id) ? $panel : null;
            if (!$prow) {
                $st = $pdo->prepare("SELECT * FROM panels WHERE id = ? AND status = 'active'");
                $st->execute([$pid]);
                $prow = $st->fetch();
            }
            if (!$prow) { $api_by_panel[$pid] = null; continue; }
            try {
                $proxy_config = null;
                if (!empty($prow['proxy_host'])) {
                    $proxy_config = ['type' => $prow['proxy_type'] ?? 'socks5', 'host' => $prow['proxy_host'], 'port' => $prow['proxy_port'] ?? 1080, 'username' => $prow['proxy_username'] ?? null, 'password' => $prow['proxy_password'] ?? null, 'use_on_error' => !empty($prow['use_proxy'])];
                }
                $api_by_panel[$pid] = new XrayAPI($prow['url'], $prow['username'], $prow['password'], $proxy_config);
            } catch (Exception $e) {
                $api_by_panel[$pid] = null;
            }
        }
        $api = $api_by_panel[$pid] ?? null;
        if (!$api) continue;
        try {
            $stats = $api->getClientStats($iid, $client_id);
            $tr = isset($stats['obj']) ? $stats['obj'] : $stats;
            if (!is_array($tr)) continue;
            $total_traffic = (int)(($tr['up'] ?? 0) + ($tr['down'] ?? 0));
            $pdo->prepare("UPDATE reseller_users SET total_traffic = ? WHERE id = ?")->execute([$total_traffic, $u['id']]);
            $status = 'active';
            if (!empty($u['expiry_date']) && strtotime($u['expiry_date']) < time()) $status = 'expired';
            elseif (!empty($u['traffic_limit']) && $total_traffic >= (int)$u['traffic_limit']) $status = 'limited';
            if (($u['status'] ?? '') !== $status) {
                $pdo->prepare("UPDATE reseller_users SET status = ? WHERE id = ?")->execute([$status, $u['id']]);
            }
            $updated++;
        } catch (Exception $e) { }
    }
    $sum = $pdo->prepare("SELECT COALESCE(SUM(total_traffic), 0) FROM reseller_users WHERE representative_id = ?");
    $sum->execute([$representative_id]);
    $total = (int)$sum->fetchColumn();
    $pdo->prepare("UPDATE representatives SET used_traffic = ? WHERE id = ?")->execute([$total, $representative_id]);
    setMessage($updated > 0 ? "ترافیک $updated کاربر از پنل به‌روز شد." : "ترافیکی برای به‌روزرسانی یافت نشد.");
    redirect('users.php');
}

// افزودن کاربر جدید
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'add') {
    $email = trim($_POST['email'] ?? '');
    $remark = trim($_POST['remark'] ?? '');
    if ($remark === '' && $rep_default_remark !== '') {
        $remark = $rep_default_remark;
    }
    $traffic_limit = (int)($_POST['traffic_limit'] ?? 0); // به گیگابایت
    $expiry_days = (int)($_POST['expiry_days'] ?? 0);
    $inbound_id = (int)($_POST['inbound_id'] ?? 0);
    
    // لاگ برای دیباگ
    error_log("User creation form data: email=$email, traffic_limit=$traffic_limit GB, expiry_days=$expiry_days, inbound_id=$inbound_id");
    $add_panel_id = (int)($_POST['panel_id'] ?? 0);
    if ($add_panel_id <= 0 && !empty($_POST['inbound_id']) && strpos((string)$_POST['inbound_id'], '_') !== false) {
        $parts = explode('_', (string)$_POST['inbound_id'], 2);
        $add_panel_id = (int)($parts[0] ?? 0);
        $inbound_id = (int)($parts[1] ?? 0);
    }
    if ($add_panel_id <= 0) $add_panel_id = $panel_id;
    
    // محاسبه مبلغ کل: فقط مواردی که > 0 هستند لحاظ می‌شوند
    $total_charge = ($wallet_price_per_config > 0) ? (float)$wallet_price_per_config : 0;
    if ($wallet_price_per_gb > 0 && $traffic_limit > 0) {
        $total_charge += $traffic_limit * $wallet_price_per_gb;
    }
    if ($wallet_price_per_day > 0 && $expiry_days > 0) {
        $total_charge += $expiry_days * $wallet_price_per_day;
    }
    if ($min_traffic_gb_rule > 0 && $min_traffic_extra_charge > 0 && $traffic_limit > 0 && $traffic_limit < $min_traffic_gb_rule) {
        $total_charge += $min_traffic_extra_charge;
    }
    if ($total_charge > 0 && $discount_percent > 0) {
        $total_charge = $total_charge * (1 - $discount_percent / 100);
    }

    if ($min_traffic_user_gb > 0 && $traffic_limit > 0 && $traffic_limit < $min_traffic_user_gb) {
        setMessage("حداقل ترافیک هر کاربر {$min_traffic_user_gb} گیگابایت است.", 'error');
        redirect('users.php');
    }
    if ($max_traffic_user_gb > 0 && $traffic_limit > 0 && $traffic_limit > $max_traffic_user_gb) {
        setMessage("حداکثر ترافیک هر کاربر {$max_traffic_user_gb} گیگابایت است.", 'error');
        redirect('users.php');
    }
    if ($max_users_rep > 0) {
        $stmt_cnt = $pdo->prepare("SELECT COUNT(*) FROM reseller_users WHERE representative_id = ?");
        $stmt_cnt->execute([$representative_id]);
        $cur_users = (int)$stmt_cnt->fetchColumn();
        if ($cur_users >= $max_users_rep) {
            setMessage("حداکثر تعداد کاربر مجاز ({$max_users_rep}) را رسیده‌اید.", 'error');
            redirect('users.php');
        }
    }

    $allowed_this = false;
    if (!empty($allowed_pairs)) {
        foreach ($allowed_pairs as $p) {
            if ((int)$p['panel_id'] === $add_panel_id && (int)$p['inbound_id'] === $inbound_id) {
                $allowed_this = true;
                break;
            }
        }
    } else {
        $allowed_this = empty($allowed_inbound_ids) || in_array($inbound_id, $allowed_inbound_ids);
    }
    
    // بررسی محدودیت‌های نماینده
    if ($is_rep_expired) {
        setMessage('دسترسی شما منقضی شده است', 'error');
    } elseif ($is_rep_traffic_limited) {
        setMessage('حد ترافیک شما تمام شده است', 'error');
    } elseif (empty($email) || $inbound_id === 0) {
        setMessage('لطفاً فیلدهای ضروری را پر کنید', 'error');
    } elseif (!$allowed_this) {
        setMessage('این اینباند برای شما مجاز نیست', 'error');
    } elseif ($total_charge > 0 && $rep_wallet_balance < $total_charge) {
        setMessage('موجودی کیف پول کافی نیست. مبلغ این کاربر: ' . number_format($total_charge) . ' تومان، موجودی شما: ' . number_format($rep_wallet_balance) . ' تومان', 'error');
    } else {
        $limit_ok = true;
        // بررسی محدودیت اینباند در سطح پنل (کل کاربران همه نمایندگان روی این اینباند)
        try {
            $st = $pdo->prepare("SELECT user_limit FROM panel_inbounds WHERE panel_id = ? AND inbound_id = ?");
            $st->execute([$add_panel_id, $inbound_id]);
            $row = $st->fetch();
            if ($row && (int)$row['user_limit'] > 0) {
                $panel_inbound_limit = (int)$row['user_limit'];
                $st = $pdo->prepare("SELECT COUNT(*) FROM reseller_users WHERE panel_id = ? AND inbound_id = ?");
                $st->execute([$add_panel_id, $inbound_id]);
                $cur_panel = (int)$st->fetchColumn();
                if ($cur_panel >= $panel_inbound_limit) {
                    setMessage("محدودیت این اینباند در پنل تکمیل است. حداکثر {$panel_inbound_limit} کاربر مجاز است.", 'error');
                    $limit_ok = false;
                }
            }
        } catch (Exception $e) { }
        // بررسی محدودیت تعداد کاربر برای این اینباند (نماینده)
        if ($limit_ok) {
            $lim_key = $add_panel_id . '_' . $inbound_id;
            $lim_inbound = (int)($inbound_user_limit[$lim_key] ?? $inbound_user_limit[$inbound_id] ?? 0);
            if ($lim_inbound > 0) {
                $stmt = $pdo->prepare("SELECT COUNT(*) FROM reseller_users WHERE representative_id = ? AND panel_id = ? AND inbound_id = ?");
                $stmt->execute([$representative_id, $add_panel_id, $inbound_id]);
                $cur = (int)$stmt->fetchColumn();
                if ($cur >= $lim_inbound) {
                    setMessage("محدودیت این اینباند تکمیل است. حداکثر {$lim_inbound} کاربر مجاز است و اکنون {$cur} کاربر دارید.", 'error');
                    $limit_ok = false;
                }
            }
        }
        if ($limit_ok) {
        try {
            if ($total_charge > 0) {
                try {
                    $desc = 'ساخت کاربر: ' . $email;
                    if ($traffic_limit > 0 && $wallet_price_per_gb > 0) $desc .= ' (' . $traffic_limit . ' GB)';
                    if ($expiry_days > 0 && $wallet_price_per_day > 0) $desc .= ' (' . $expiry_days . ' روز)';
                    walletDeduct($pdo, $representative_id, $total_charge, 'create_user', null, $desc);
                } catch (Exception $e) {
                    setMessage($e->getMessage(), 'error');
                    redirect('users.php');
                }
            }
            
            $add_panel = ($add_panel_id === $panel_id) ? $panel : null;
            if (!$add_panel) {
                $st = $pdo->prepare("SELECT * FROM panels WHERE id = ?");
                $st->execute([$add_panel_id]);
                $add_panel = $st->fetch();
            }
            if (!$add_panel) {
                setMessage('پنل انتخاب‌شده یافت نشد', 'error');
                redirect('users.php');
            }
            $proxy_config = null;
            if (!empty($add_panel['proxy_host'])) {
                $proxy_config = [
                    'type' => $add_panel['proxy_type'] ?? 'socks5',
                    'host' => $add_panel['proxy_host'],
                    'port' => $add_panel['proxy_port'] ?? 1080,
                    'username' => $add_panel['proxy_username'] ?? null,
                    'password' => $add_panel['proxy_password'] ?? null,
                    'use_on_error' => !empty($add_panel['use_proxy'])
                ];
            }
            $xrayAPI = new XrayAPI($add_panel['url'], $add_panel['username'], $add_panel['password'], $proxy_config, $add_panel['config_domain'] ?? null);
            
            // تبدیل ترافیک به بایت
            $traffic_limit_bytes = $traffic_limit * 1024 * 1024 * 1024;
            
            // محاسبه تاریخ انقضا
            $expiry_time = $expiry_days > 0 ? time() + ($expiry_days * 24 * 60 * 60) : 0;
            $expiry_date = $expiry_time > 0 ? date('Y-m-d H:i:s', $expiry_time) : null;
            
            // افزودن کاربر به پنل
            $result = $xrayAPI->addClient($inbound_id, $email, $remark, $traffic_limit_bytes, $expiry_time);
            
            if (isset($result['success']) && $result['success']) {
                // استفاده از UUID که در addClient تولید شده است
                $client_id = $result['client_uuid'] ?? null;
                
                // اگر UUID در نتیجه نبود، از پنل بخوان
                if (empty($client_id)) {
                    error_log("UUID not found in addClient result, fetching from panel...");
                    $inbounds = $xrayAPI->getInbounds();
                    $inbound_list = [];
                    if (isset($inbounds['obj']) && is_array($inbounds['obj'])) {
                        $inbound_list = $inbounds['obj'];
                    } elseif (isset($inbounds['data']) && is_array($inbounds['data'])) {
                        $inbound_list = $inbounds['data'];
                    } elseif (is_array($inbounds)) {
                        $inbound_list = $inbounds;
                    }
                    
                    foreach ($inbound_list as $inb) {
                        if ((string)($inb['id'] ?? '') !== (string)$inbound_id) {
                            continue;
                        }
                        $clients = $inb['clients'] ?? [];
                        if (empty($clients) && !empty($inb['settings'])) {
                            $settings = is_string($inb['settings']) ? json_decode($inb['settings'], true) : $inb['settings'];
                            $clients = isset($settings['clients']) && is_array($settings['clients']) ? $settings['clients'] : [];
                        }
                        foreach ($clients as $c) {
                            if (trim((string)($c['email'] ?? '')) === $email) {
                                $client_id = $c['id'] ?? null;
                                break;
                            }
                        }
                        if (empty($client_id) && !empty($clients)) {
                            $last_client = end($clients);
                            $client_id = $last_client['id'] ?? null;
                        }
                        break;
                    }
                }
                
                // اگر هنوز client_id نداریم، از email استفاده کن
                if (empty($client_id)) {
                    error_log("Warning: client_id not found, using email as fallback");
                    $client_id = $email;
                }
                
                error_log("Saving user with client_id: $client_id (email: $email)");
                
                // ذخیره در دیتابیس (کد استعلام برای ربات تلگرام / لینک استعلام)
                $check_token = bin2hex(random_bytes(16));
                $client_sub_id = $result['client_sub_id'] ?? null;
                try {
                    $stmt = $pdo->prepare("INSERT INTO reseller_users 
                        (representative_id, panel_id, xray_user_id, sub_id, inbound_id, email, remark, traffic_limit, expiry_date, check_token) 
                        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
                    $stmt->execute([
                        $representative_id, $add_panel_id, $client_id, $client_sub_id,
                        $inbound_id, $email, $remark, $traffic_limit_bytes, $expiry_date, $check_token
                    ]);
                } catch (PDOException $e) {
                    if (strpos($e->getMessage(), 'sub_id') !== false) {
                        $stmt = $pdo->prepare("INSERT INTO reseller_users 
                            (representative_id, panel_id, xray_user_id, inbound_id, email, remark, traffic_limit, expiry_date, check_token) 
                            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
                        $stmt->execute([
                            $representative_id, $add_panel_id, $client_id, $inbound_id, $email, $remark,
                            $traffic_limit_bytes, $expiry_date, $check_token
                        ]);
                    } else {
                        throw $e;
                    }
                }
                
                $new_user_id = $pdo->lastInsertId();
                
                // تولید لینک‌های subscription و config
                try {
                    if (!empty($add_panel['subscription_base_url'])) {
                        $xrayAPI->setSubscriptionBaseUrl($add_panel['subscription_base_url']);
                    }
                    
                    $subscriptionLink = $xrayAPI->getSubscriptionLink($inbound_id, $client_id, $client_sub_id ?? null);
                    $configLink = null;
                    try {
                        // دریافت تنظیمات اختصاصی اینباند (Overrides)
                        $overrides = [];
                        $st_ov = $pdo->prepare("SELECT address_override, port_override, host_override, path_override, sni_override FROM panel_inbounds WHERE panel_id = ? AND inbound_id = ?");
                        $st_ov->execute([$add_panel_id, $inbound_id]);
                        $ov_data = $st_ov->fetch();
                        if ($ov_data) {
                            $overrides = [
                                'address' => $ov_data['address_override'],
                                'port' => $ov_data['port_override'],
                                'host' => $ov_data['host_override'],
                                'path' => $ov_data['path_override'],
                                'sni' => $ov_data['sni_override']
                            ];
                        }
                        $configLink = $xrayAPI->getConfigLink($inbound_id, $client_id, $overrides);
                    } catch (Exception $e) {
                        error_log("Error generating config link after user creation: " . $e->getMessage());
                    }
                    
                    // ذخیره لینک‌ها در session برای نمایش بعدی
                    $_SESSION['new_user_links'] = [
                        'user_id' => $new_user_id,
                        'subscription_link' => $subscriptionLink,
                        'config_link' => $configLink,
                        'email' => $email
                    ];
                    
                    error_log("Links generated for new user: subscription=$subscriptionLink, config=" . ($configLink ?? 'N/A'));
                } catch (Exception $e) {
                    error_log("Error generating links after user creation: " . $e->getMessage());
                    // ادامه می‌دهیم حتی اگر خطا داشت
                }
                
                // ثبت لاگ
                $log_stmt = $pdo->prepare("INSERT INTO representative_logs (representative_id, action, user_id, details, ip_address) VALUES (?, ?, ?, ?, ?)");
                $log_stmt->execute([
                    $representative_id,
                    'create_user',
                    $new_user_id,
                    "ایجاد کاربر: $email",
                    $_SERVER['REMOTE_ADDR'] ?? null
                ]);
                
                setMessage('کاربر با موفقیت افزوده شد. لینک‌های کانفیگ در جدول کاربران قابل مشاهده است.');
                redirect('users.php');
            } else {
                setMessage('خطا در افزودن کاربر به پنل: ' . ($result['msg'] ?? 'نامشخص'), 'error');
            }
        } catch (Exception $e) {
            if ($total_charge > 0) {
                try {
                    walletDeposit($pdo, $representative_id, $total_charge, 'admin_deposit', null, 'بازگشت مبلغ به علت خطا در ساخت کاربر');
                } catch (Exception $e2) {
                    error_log("Refund failed: " . $e2->getMessage());
                }
            }
            setMessage('خطا: ' . $e->getMessage(), 'error');
        }
        }
    }
}

// ساخت انبوه کاربر
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'bulk_add') {
    $bulk_text = $_POST['bulk_emails'] ?? '';
    $emails = array_filter(array_map('trim', preg_split('/[\r\n]+/', $bulk_text)));
    // روش پیشوند+عدد+پسوند (مثل پنل x-ui)
    $bulk_method = trim($_POST['bulk_method'] ?? 'list');
    if ($bulk_method === 'range') {
        $from = (int)($_POST['bulk_from'] ?? 0);
        $to = (int)($_POST['bulk_to'] ?? 0);
        $prefix = trim($_POST['bulk_prefix'] ?? '');
        $postfix = trim($_POST['bulk_postfix'] ?? '');
        $emails = [];
        for ($i = $from; $i <= $to; $i++) {
            $emails[] = $prefix . $i . $postfix;
        }
    }
    $inbound_id = (int)($_POST['inbound_id'] ?? 0);
    $bulk_panel_id = (int)($panel_id);
    if (!empty($_POST['inbound_id']) && strpos((string)$_POST['inbound_id'], '_') !== false) {
        $parts = explode('_', (string)$_POST['inbound_id'], 2);
        $bulk_panel_id = (int)($parts[0] ?? 0);
        $inbound_id = (int)($parts[1] ?? 0);
    }
    $traffic_limit = (int)($_POST['traffic_limit'] ?? 0);
    $expiry_days = (int)($_POST['expiry_days'] ?? 0);
    $bulk_remark = trim($_POST['remark'] ?? '');
    if ($bulk_remark === '' && $rep_default_remark !== '') {
        $bulk_remark = $rep_default_remark;
    }
    $total_charge_per_user = ($wallet_price_per_config > 0) ? (float)$wallet_price_per_config : 0;
    if ($wallet_price_per_gb > 0 && $traffic_limit > 0) $total_charge_per_user += $traffic_limit * $wallet_price_per_gb;
    if ($wallet_price_per_day > 0 && $expiry_days > 0) $total_charge_per_user += $expiry_days * $wallet_price_per_day;
    if ($min_traffic_gb_rule > 0 && $min_traffic_extra_charge > 0 && $traffic_limit > 0 && $traffic_limit < $min_traffic_gb_rule) {
        $total_charge_per_user += $min_traffic_extra_charge;
    }
    if ($total_charge_per_user > 0 && $discount_percent > 0) {
        $total_charge_per_user = $total_charge_per_user * (1 - $discount_percent / 100);
    }

    if ($min_traffic_user_gb > 0 && $traffic_limit > 0 && $traffic_limit < $min_traffic_user_gb) {
        setMessage("حداقل ترافیک هر کاربر {$min_traffic_user_gb} گیگابایت است.", 'error');
        redirect('users.php');
    }
    if ($max_traffic_user_gb > 0 && $traffic_limit > 0 && $traffic_limit > $max_traffic_user_gb) {
        setMessage("حداکثر ترافیک هر کاربر {$max_traffic_user_gb} گیگابایت است.", 'error');
        redirect('users.php');
    }
    if ($max_users_rep > 0) {
        $stmt_bc = $pdo->prepare("SELECT COUNT(*) FROM reseller_users WHERE representative_id = ?");
        $stmt_bc->execute([$representative_id]);
        $cur_bulk = (int)$stmt_bc->fetchColumn();
        if ($cur_bulk + count($emails) > $max_users_rep) {
            setMessage("با این تعداد، از حداکثر کاربر مجاز ({$max_users_rep}) فراتر می‌روید. اکنون {$cur_bulk} کاربر دارید.", 'error');
            redirect('users.php');
        }
    }

    $created = 0;
    $failed = 0;
    $errors = [];
    if ($is_rep_expired) {
        setMessage('دسترسی شما منقضی شده است', 'error');
        redirect('users.php');
    }
    if ($is_rep_traffic_limited) {
        setMessage('حد ترافیک شما تمام شده است', 'error');
        redirect('users.php');
    }
    if (empty($emails) || $inbound_id === 0) {
        setMessage('لطفاً حداقل یک ایمیل/شناسه و یک اینباند وارد کنید.', 'error');
        redirect('users.php');
    }
    $bulk_allowed = false;
    if (!empty($allowed_pairs)) {
        foreach ($allowed_pairs as $p) {
            if ((int)$p['panel_id'] === $bulk_panel_id && (int)$p['inbound_id'] === $inbound_id) { $bulk_allowed = true; break; }
        }
    } else {
        $bulk_allowed = empty($allowed_inbound_ids) || in_array($inbound_id, $allowed_inbound_ids);
    }
    if (!$bulk_allowed) {
        setMessage('این اینباند برای شما مجاز نیست', 'error');
        redirect('users.php');
    }
    $bulk_panel = ($bulk_panel_id === $panel_id) ? $panel : null;
    if (!$bulk_panel) {
        $st = $pdo->prepare("SELECT * FROM panels WHERE id = ?");
        $st->execute([$bulk_panel_id]);
        $bulk_panel = $st->fetch();
    }
    if (!$bulk_panel) {
        setMessage('پنل انتخاب‌شده یافت نشد', 'error');
        redirect('users.php');
    }
    $traffic_limit_bytes = $traffic_limit * 1024 * 1024 * 1024;
    $expiry_time = $expiry_days > 0 ? time() + ($expiry_days * 24 * 60 * 60) : 0;
    $expiry_date = $expiry_time > 0 ? date('Y-m-d H:i:s', $expiry_time) : null;
    $proxy_config = null;
    if (!empty($bulk_panel['proxy_host'])) {
        $proxy_config = ['type' => $bulk_panel['proxy_type'] ?? 'socks5', 'host' => $bulk_panel['proxy_host'], 'port' => $bulk_panel['proxy_port'] ?? 1080, 'username' => $bulk_panel['proxy_username'] ?? null, 'password' => $bulk_panel['proxy_password'] ?? null, 'use_on_error' => !empty($bulk_panel['use_proxy'])];
    }
    $xrayAPI = new XrayAPI($bulk_panel['url'], $bulk_panel['username'], $bulk_panel['password'], $proxy_config);
    foreach ($emails as $email) {
        if ($email === '') continue;
        $cur_rep = 0;
        $cur_panel = 0;
        $lim_key = $bulk_panel_id . '_' . $inbound_id;
        $lim_rep = (int)($inbound_user_limit[$lim_key] ?? $inbound_user_limit[$inbound_id] ?? 0);
        if ($lim_rep > 0) {
            $st = $pdo->prepare("SELECT COUNT(*) FROM reseller_users WHERE representative_id = ? AND panel_id = ? AND inbound_id = ?");
            $st->execute([$representative_id, $bulk_panel_id, $inbound_id]);
            $cur_rep = (int)$st->fetchColumn();
        }
        try {
            $st = $pdo->prepare("SELECT user_limit FROM panel_inbounds WHERE panel_id = ? AND inbound_id = ?");
            $st->execute([$bulk_panel_id, $inbound_id]);
            $r = $st->fetch();
            if ($r && (int)$r['user_limit'] > 0) {
                $st = $pdo->prepare("SELECT COUNT(*) FROM reseller_users WHERE panel_id = ? AND inbound_id = ?");
                $st->execute([$bulk_panel_id, $inbound_id]);
                $cur_panel = (int)$st->fetchColumn();
                if ($cur_panel + $created >= (int)$r['user_limit']) {
                    $errors[] = "$email: محدودیت پنل";
                    $failed++;
                    continue;
                }
            }
        } catch (Exception $e) { }
        if ($lim_rep > 0 && $cur_rep + $created >= $lim_rep) {
            $errors[] = "$email: محدودیت اینباند شما";
            $failed++;
            continue;
        }
        if ($total_charge_per_user > 0 && $rep_wallet_balance < $total_charge_per_user) {
            $errors[] = "$email: موجودی کافی نیست";
            $failed++;
            continue;
        }
        try {
            if ($total_charge_per_user > 0) {
                $desc = 'ساخت انبوه: ' . $email;
                walletDeduct($pdo, $representative_id, $total_charge_per_user, 'create_user', null, $desc);
                $rep_wallet_balance -= $total_charge_per_user;
            }
            $result = $xrayAPI->addClient($inbound_id, $email, $bulk_remark, $traffic_limit_bytes, $expiry_time);
            if (isset($result['success']) && $result['success']) {
                $client_id = $result['client_uuid'] ?? null;
                if (empty($client_id)) {
                    $inbounds = $xrayAPI->getInbounds();
                    $inbound_list = $inbounds['obj'] ?? $inbounds['data'] ?? [];
                    if (is_array($inbound_list)) {
                        foreach ($inbound_list as $inb) {
                            if ((string)($inb['id'] ?? '') !== (string)$inbound_id) continue;
                            $clients = $inb['clients'] ?? [];
                            if (empty($clients) && !empty($inb['settings'])) {
                                $settings = is_string($inb['settings']) ? json_decode($inb['settings'], true) : $inb['settings'];
                                $clients = $settings['clients'] ?? [];
                            }
                            foreach ($clients as $c) {
                                if (trim((string)($c['email'] ?? '')) === $email) {
                                    $client_id = $c['id'] ?? null;
                                    break;
                                }
                            }
                            if (empty($client_id) && !empty($clients)) $client_id = end($clients)['id'] ?? null;
                            break;
                        }
                    }
                }
                if (empty($client_id)) $client_id = $email;
                $client_sub_id = $result['client_sub_id'] ?? null;
                $check_token = bin2hex(random_bytes(16));
                try {
                    $stmt = $pdo->prepare("INSERT INTO reseller_users (representative_id, panel_id, xray_user_id, sub_id, inbound_id, email, remark, traffic_limit, expiry_date, check_token) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
                    $stmt->execute([$representative_id, $bulk_panel_id, $client_id, $client_sub_id, $inbound_id, $email, $bulk_remark, $traffic_limit_bytes, $expiry_date, $check_token]);
                } catch (PDOException $e) {
                    if (strpos($e->getMessage(), 'sub_id') !== false) {
                        $stmt = $pdo->prepare("INSERT INTO reseller_users (representative_id, panel_id, xray_user_id, inbound_id, email, remark, traffic_limit, expiry_date, check_token) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
                        $stmt->execute([$representative_id, $bulk_panel_id, $client_id, $inbound_id, $email, $bulk_remark, $traffic_limit_bytes, $expiry_date, $check_token]);
                    } else {
                        throw $e;
                    }
                }
                $log_stmt = $pdo->prepare("INSERT INTO representative_logs (representative_id, action, user_id, details, ip_address) VALUES (?, ?, ?, ?, ?)");
                $log_stmt->execute([$representative_id, 'create_user', $pdo->lastInsertId(), "ایجاد کاربر (انبوه): $email", $_SERVER['REMOTE_ADDR'] ?? null]);
                $created++;
            } else {
                if ($total_charge_per_user > 0) walletDeposit($pdo, $representative_id, $total_charge_per_user, 'admin_deposit', null, 'بازگشت: خطا در ساخت ' . $email);
                $errors[] = $email . ': ' . ($result['msg'] ?? 'نامشخص');
                $failed++;
            }
        } catch (Exception $e) {
            if ($total_charge_per_user > 0) {
                try { walletDeposit($pdo, $representative_id, $total_charge_per_user, 'admin_deposit', null, 'بازگشت: خطا در ساخت ' . $email); } catch (Exception $e2) { }
            }
            $errors[] = $email . ': ' . $e->getMessage();
            $failed++;
        }
    }
    if ($created > 0 || $failed > 0) {
        $msg = $created > 0 ? $created . ' کاربر ساخته شد.' : '';
        if ($failed > 0) $msg .= ($msg ? ' ' : '') . $failed . ' خطا.';
        if (!empty($errors)) $msg .= ' ' . implode('؛ ', array_slice($errors, 0, 5)) . ($failed > 5 ? '...' : '');
        setMessage($msg, $failed > 0 && $created === 0 ? 'error' : 'success');
    }
    redirect('users.php');
}

// حذف کاربر
if (isset($_GET['delete'])) {
    $id = (int)$_GET['delete'];
    try {
        $user = $pdo->prepare("SELECT * FROM reseller_users WHERE id = ? AND representative_id = ?");
        $user->execute([$id, $representative_id]);
        $user = $user->fetch();
        
        if ($user) {
            // آماده‌سازی تنظیمات proxy
            $proxy_config = null;
            if (!empty($panel['proxy_host'])) {
                $proxy_config = [
                    'type' => $panel['proxy_type'] ?? 'socks5',
                    'host' => $panel['proxy_host'],
                    'port' => $panel['proxy_port'] ?? 1080,
                    'username' => $panel['proxy_username'] ?? null,
                    'password' => $panel['proxy_password'] ?? null,
                    'use_on_error' => !empty($panel['use_proxy'])
                ];
            }
            
            $xrayAPI = new XrayAPI($panel['url'], $panel['username'], $panel['password'], $proxy_config);
            $xrayAPI->deleteClient($user['inbound_id'], $user['xray_user_id']);
            
            $stmt = $pdo->prepare("DELETE FROM reseller_users WHERE id = ?");
            $stmt->execute([$id]);
            
            // ثبت لاگ
            $log_stmt = $pdo->prepare("INSERT INTO representative_logs (representative_id, action, user_id, details, ip_address) VALUES (?, ?, ?, ?, ?)");
            $log_stmt->execute([
                $representative_id,
                'delete_user',
                $id,
                "حذف کاربر: " . $user['email'],
                $_SERVER['REMOTE_ADDR'] ?? null
            ]);
            
            setMessage('کاربر با موفقیت حذف شد');
        }
        redirect('users.php');
    } catch (Exception $e) {
        setMessage('خطا در حذف کاربر: ' . $e->getMessage(), 'error');
        redirect('users.php');
    }
}

// به‌روزرسانی کاربر
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'update') {
    $id = (int)($_POST['id'] ?? 0);
    $email = $_POST['email'] ?? '';
    $remark = $_POST['remark'] ?? '';
    $traffic_limit = (int)($_POST['traffic_limit'] ?? 0);
    $expiry_days = (int)($_POST['expiry_days'] ?? 0);
    
    try {
        $user = $pdo->prepare("SELECT * FROM reseller_users WHERE id = ? AND representative_id = ?");
        $user->execute([$id, $representative_id]);
        $user = $user->fetch();
        
        if ($user) {
            // آماده‌سازی تنظیمات proxy
            $proxy_config = null;
            if (!empty($panel['proxy_host'])) {
                $proxy_config = [
                    'type' => $panel['proxy_type'] ?? 'socks5',
                    'host' => $panel['proxy_host'],
                    'port' => $panel['proxy_port'] ?? 1080,
                    'username' => $panel['proxy_username'] ?? null,
                    'password' => $panel['proxy_password'] ?? null,
                    'use_on_error' => !empty($panel['use_proxy'])
                ];
            }
            
            $xrayAPI = new XrayAPI($panel['url'], $panel['username'], $panel['password'], $proxy_config);
            
            $traffic_limit_bytes = $traffic_limit * 1024 * 1024 * 1024;
            $expiry_time = $expiry_days > 0 ? time() + ($expiry_days * 24 * 60 * 60) : 0;
            $expiry_date = $expiry_time > 0 ? date('Y-m-d H:i:s', $expiry_time) : null;
            
            $xrayAPI->updateClient($user['inbound_id'], $user['xray_user_id'], $email, $remark, $traffic_limit_bytes, $expiry_time);
            
            $stmt = $pdo->prepare("UPDATE reseller_users 
                SET email = ?, remark = ?, traffic_limit = ?, expiry_date = ? 
                WHERE id = ?");
            $stmt->execute([$email, $remark, $traffic_limit_bytes, $expiry_date, $id]);
            
            // ثبت لاگ
            $log_stmt = $pdo->prepare("INSERT INTO representative_logs (representative_id, action, user_id, details, ip_address) VALUES (?, ?, ?, ?, ?)");
            $log_stmt->execute([
                $representative_id,
                'update_user',
                $id,
                "به‌روزرسانی کاربر: $email",
                $_SERVER['REMOTE_ADDR'] ?? null
            ]);
            
            setMessage('کاربر با موفقیت به‌روزرسانی شد');
        }
        redirect('users.php');
    } catch (Exception $e) {
        setMessage('خطا در به‌روزرسانی کاربر: ' . $e->getMessage(), 'error');
        redirect('users.php');
    }
}

// دریافت لیست inbound ها (از یک پنل یا چند پنل)
$all_inbounds = [];
$inbounds = [];
$inbounds_with_panel = [];
if (!empty($allowed_pairs)) {
    $panel_ids = array_unique(array_column($allowed_pairs, 'panel_id'));
    $allowed_by_panel = [];
    foreach ($allowed_pairs as $p) {
        $allowed_by_panel[(int)$p['panel_id']][] = (int)$p['inbound_id'];
    }
    foreach ($panel_ids as $pid) {
        $pid = (int)$pid;
        if ($pid <= 0) continue;
        $prow = ($pid === $panel_id) ? $panel : null;
        if (!$prow) {
            $st = $pdo->prepare("SELECT * FROM panels WHERE id = ?");
            $st->execute([$pid]);
            $prow = $st->fetch();
        }
        if (!$prow) continue;
        try {
            $proxy_config = null;
            if (!empty($prow['proxy_host'])) {
                $proxy_config = ['type' => $prow['proxy_type'] ?? 'socks5', 'host' => $prow['proxy_host'], 'port' => $prow['proxy_port'] ?? 1080, 'username' => $prow['proxy_username'] ?? null, 'password' => $prow['proxy_password'] ?? null, 'use_on_error' => !empty($prow['use_proxy'])];
            }
            $xapi = new XrayAPI($prow['url'], $prow['username'], $prow['password'], $proxy_config);
            $res = $xapi->getInbounds();
            $list = $res['obj'] ?? $res['data'] ?? [];
            if (!is_array($list)) $list = [];
            $allowed_iids = $allowed_by_panel[$pid] ?? [];
            foreach ($list as $inb) {
                $iid = (int)($inb['id'] ?? 0);
                if ($iid <= 0) continue;
                if (!empty($allowed_iids) && !in_array($iid, $allowed_iids)) continue;
                $inb['_panel_id'] = $pid;
                $inb['_panel_name'] = $prow['name'] ?? ('پنل #' . $pid);
                $inbounds_with_panel[] = $inb;
            }
        } catch (Exception $e) {
            // skip this panel
        }
    }
    $inbounds = $inbounds_with_panel;
} else {
    try {
        $proxy_config = null;
        if (!empty($panel['proxy_host'])) {
            $proxy_config = [
                'type' => $panel['proxy_type'] ?? 'socks5',
                'host' => $panel['proxy_host'],
                'port' => $panel['proxy_port'] ?? 1080,
                'username' => $panel['proxy_username'] ?? null,
                'password' => $panel['proxy_password'] ?? null,
                'use_on_error' => !empty($panel['use_proxy'])
            ];
        }
        $xrayAPI = new XrayAPI($panel['url'], $panel['username'], $panel['password'], $proxy_config);
        $inbounds_result = $xrayAPI->getInbounds();
        $all_inbounds = $inbounds_result['obj'] ?? [];
        if (!empty($allowed_inbound_ids)) {
            $inbounds = array_filter($all_inbounds, function($inbound) use ($allowed_inbound_ids) {
                return in_array($inbound['id'], $allowed_inbound_ids);
            });
            $inbounds = array_values($inbounds);
        } else {
            $inbounds = $all_inbounds;
        }
    } catch (Exception $e) {
        $inbounds = [];
        setMessage('خطا در اتصال به پنل: ' . $e->getMessage(), 'error');
    }
}

// تعداد کاربران فعلی هر اینباند (برای نمایش حد)
$inbound_current_count = [];
try {
    $stmt = $pdo->prepare("SELECT panel_id, inbound_id, COUNT(*) as cnt FROM reseller_users WHERE representative_id = ? GROUP BY panel_id, inbound_id");
    $stmt->execute([$representative_id]);
    foreach ($stmt->fetchAll() as $row) {
        $k = (int)$row['inbound_id'];
        $inbound_current_count[$k] = (int)$row['cnt'];
        $inbound_current_count[(int)$row['panel_id'] . '_' . $k] = (int)$row['cnt'];
    }
} catch (Exception $e) {
    try {
        $stmt = $pdo->prepare("SELECT inbound_id, COUNT(*) as cnt FROM reseller_users WHERE representative_id = ? GROUP BY inbound_id");
        $stmt->execute([$representative_id]);
        foreach ($stmt->fetchAll() as $row) {
            $inbound_current_count[$row['inbound_id']] = (int)$row['cnt'];
        }
    } catch (Exception $e2) {
        $inbound_current_count = [];
    }
}

// صفحه‌بندی لیست کاربران (۱۵ مورد در هر صفحه)
$users_per_page = 15;
$current_page = max(1, (int)($_GET['page'] ?? 1));
$total_users_stmt = $pdo->prepare("SELECT COUNT(*) FROM reseller_users WHERE representative_id = ?");
$total_users_stmt->execute([$representative_id]);
$total_users_count = (int)$total_users_stmt->fetchColumn();
$total_pages = max(1, (int)ceil($total_users_count / $users_per_page));
if ($current_page > $total_pages) {
    $current_page = $total_pages;
}
$users_offset = ($current_page - 1) * $users_per_page;

// دریافت لیست کاربران با جزئیات بیشتر (فقط صفحه جاری)
$users_stmt = $pdo->prepare("
    SELECT ru.*,
           TIMESTAMPDIFF(DAY, ru.created_at, NOW()) as days_since_creation,
           TIMESTAMPDIFF(DAY, ru.updated_at, NOW()) as days_since_update,
           CASE 
               WHEN ru.expiry_date IS NULL THEN NULL
               WHEN ru.expiry_date < NOW() THEN TIMESTAMPDIFF(DAY, ru.expiry_date, NOW())
               ELSE TIMESTAMPDIFF(DAY, NOW(), ru.expiry_date)
           END as days_until_expiry
    FROM reseller_users ru 
    WHERE ru.representative_id = ? 
    ORDER BY ru.created_at DESC
    LIMIT ? OFFSET ?
");
$users_stmt->bindValue(1, $representative_id, PDO::PARAM_INT);
$users_stmt->bindValue(2, $users_per_page, PDO::PARAM_INT);
$users_stmt->bindValue(3, $users_offset, PDO::PARAM_INT);
$users_stmt->execute();
$users = $users_stmt->fetchAll();
// تولید کد استعلام برای کاربرانی که ندارند (رکوردهای قدیمی)
foreach ($users as &$u) {
    if (empty($u['check_token'])) {
        $new_token = bin2hex(random_bytes(16));
        try {
            $pdo->prepare("UPDATE reseller_users SET check_token = ? WHERE id = ?")->execute([$new_token, $u['id']]);
            $u['check_token'] = $new_token;
        } catch (Exception $e) { }
    }
}
unset($u);

// واکشی ترافیک لحظه‌ای از پنل برای نمایش خط روند (مصرف هر کاربر)
// توجه: برای جلوگیری از کند شدن صفحه، این بخش به صورت پیش‌فرض غیرفعال است
// و فقط از مقدار ذخیره‌شده در دیتابیس استفاده می‌شود.
// در صورت نیاز می‌توانید ثابت LIVE_USER_STATS را در config.php تعریف و true کنید.
if (defined('LIVE_USER_STATS') && LIVE_USER_STATS) {
    $api_by_panel = [];
    foreach ($users as &$u) {
        $pid = (int)($u['panel_id'] ?? 0);
        $iid = (int)($u['inbound_id'] ?? 0);
        // برای سازگاری با کاربرانی که xray_user_id خالی دارند، از ایمیل هم به عنوان شناسه کلاینت استفاده می‌کنیم
        $xuid = trim($u['xray_user_id'] ?? '');
        if ($xuid === '' && !empty($u['email'])) {
            $xuid = trim($u['email']);
        }
        if ($pid <= 0 || $iid <= 0 || $xuid === '') continue;
        if (!isset($api_by_panel[$pid])) {
            $prow = ($pid === (int)$panel_id) ? $panel : null;
            if (!$prow) {
                $st = $pdo->prepare("SELECT * FROM panels WHERE id = ?");
                $st->execute([$pid]);
                $prow = $st->fetch();
            }
            if (!$prow) { $api_by_panel[$pid] = null; continue; }
            try {
                $proxy_config = null;
                if (!empty($prow['proxy_host'])) {
                    $proxy_config = ['type' => $prow['proxy_type'] ?? 'socks5', 'host' => $prow['proxy_host'], 'port' => $prow['proxy_port'] ?? 1080, 'username' => $prow['proxy_username'] ?? null, 'password' => $prow['proxy_password'] ?? null, 'use_on_error' => !empty($prow['use_proxy'])];
                }
                $api_by_panel[$pid] = new XrayAPI($prow['url'], $prow['username'], $prow['password'], $proxy_config);
            } catch (Exception $e) {
                $api_by_panel[$pid] = null;
            }
        }
        $api = $api_by_panel[$pid] ?? null;
        if ($api) {
            try {
                $stats = $api->getClientStats($iid, $xuid);
                $tr = isset($stats['obj']) ? $stats['obj'] : $stats;
                if (is_array($tr)) {
                    $u['total_traffic'] = (int)(($tr['up'] ?? 0) + ($tr['down'] ?? 0));
                }
            } catch (Exception $e) { /* از مقدار DB استفاده می‌شود */ }
        }
    }
    unset($u);
}

// به‌روزرسانی وضعیت کاربران (بررسی انقضا و ترافیک)
// این بخش قبلاً انجام شده و نیازی به تکرار نیست

require_once '../includes/header.php';

// نمایش پیام‌ها
$message = getMessage();
?>

<style>
/* هماهنگی با تم داشبورد */
.stat-card-pro {
    background-color: var(--bg-card);
    border: 1px solid var(--border-subtle);
    border-radius: var(--radius);
    padding: 1.25rem;
    height: 100%;
    box-shadow: var(--shadow-card);
    transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
}
.stat-card-pro:hover {
    transform: translateY(-5px);
    box-shadow: var(--shadow-card-hover);
}
.stat-card-pro .stat-icon {
    width: 48px;
    height: 48px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    font-size: 24px;
}
.stat-label { color: var(--text-muted); font-size: 0.85rem; font-weight: 500; }
.stat-value { color: var(--text-primary); font-weight: 700; }

/* بهبود نمایش QR Code */
#qrcode {
    padding: 15px;
    background: #fff;
    border-radius: 12px;
    display: inline-block;
    box-shadow: 0 4px 15px rgba(0,0,0,0.1);
}
#qrcode img {
    display: block;
    margin: 0 auto;
}
.modal-content {
    border-radius: 18px;
}

/* پروفایل و کارت مشتری */
.user-avatar {
    width: 45px;
    height: 45px;
    border-radius: 12px;
    background: linear-gradient(135deg, var(--accent-primary), #10b981);
    display: flex;
    align-items: center;
    justify-content: center;
    color: white;
    font-weight: 700;
    font-size: 1.2rem;
    box-shadow: 0 4px 10px rgba(16, 185, 129, 0.2);
}
.customer-code {
    font-family: 'Vazirmatn', monospace;
    font-size: 0.75rem;
    color: var(--text-muted);
    background: var(--bg-body);
    padding: 2px 8px;
    border-radius: 6px;
    border: 1px solid var(--border-subtle);
}
.profile-card-header {
    background: linear-gradient(135deg, #1e293b, #0f172a);
    color: white;
    padding: 2rem;
    border-radius: 18px 18px 0 0;
    position: relative;
    overflow: hidden;
}
.profile-card-header::after {
    content: '';
    position: absolute;
    top: -50%;
    right: -20%;
    width: 300px;
    height: 300px;
    background: radial-gradient(circle, rgba(16, 185, 129, 0.1) 0%, transparent 70%);
    z-index: 0;
}
.profile-avatar-large {
    width: 90px;
    height: 90px;
    border-radius: 24px;
    border: 4px solid rgba(255,255,255,0.1);
    background: var(--accent-primary);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 2.5rem;
    margin-bottom: 1rem;
    position: relative;
    z-index: 1;
}
.profile-info-main { position: relative; z-index: 1; }
.profile-info-main h4 { margin-bottom: 0.25rem; font-weight: 700; }
.profile-info-main p { opacity: 0.7; font-size: 0.9rem; margin-bottom: 0; }

.detail-item-pro {
    background: var(--bg-card);
    border: 1px solid var(--border-subtle);
    border-radius: 12px;
    padding: 1rem;
    margin-bottom: 1rem;
    transition: all 0.2s;
}
.detail-item-pro:hover { border-color: var(--accent-primary); }
.detail-item-pro label {
    display: block;
    font-size: 0.75rem;
    color: var(--text-muted);
    margin-bottom: 0.25rem;
    font-weight: 500;
}
.detail-item-pro span {
    display: block;
    font-weight: 600;
    color: var(--text-primary);
}
.pagination .page-link {
    background-color: var(--bg-secondary);
    border-color: var(--border-subtle);
    color: var(--text-primary);
}
.pagination .page-item.active .page-link {
    background-color: var(--accent-primary);
    border-color: var(--accent-primary);
    color: #fff;
}
.pagination .page-item.disabled .page-link {
    background-color: var(--bg-card);
    color: var(--text-muted);
}
</style>

<?php if ($message): ?>
    <div class="alert alert-<?= $message['type'] === 'error' ? 'danger' : 'success' ?> alert-dismissible fade show" role="alert">
        <?= htmlspecialchars($message['message']) ?>
        <button type="button" class="btn-close" data-bs-dismiss="alert"></button>
    </div>
<?php endif; ?>

<?php
// نمایش لینک‌های کاربر جدید اگر موجود باشد
if (isset($_SESSION['new_user_links']) && !empty($_SESSION['new_user_links'])) {
    $links = $_SESSION['new_user_links'];
    unset($_SESSION['new_user_links']);
    ?>
    <div class="alert alert-success alert-dismissible fade show" role="alert">
        <h6 class="alert-heading">✅ کاربر با موفقیت ایجاد شد!</h6>
        <p><strong>ایمیل:</strong> <?= htmlspecialchars($links['email']) ?></p>
        <?php if (!empty($links['subscription_link'])): ?>
            <div class="mb-2">
                <strong>لینک Subscription:</strong><br>
                <input type="text" class="form-control form-control-sm mt-1" value="<?= htmlspecialchars($links['subscription_link']) ?>" readonly>
                <button class="btn btn-sm btn-outline-primary mt-1" onclick="copyToClipboard('<?= htmlspecialchars($links['subscription_link'], ENT_QUOTES) ?>', 'لینک subscription کپی شد')">
                    <i class="bi bi-clipboard"></i> کپی
                </button>
            </div>
        <?php endif; ?>
        <?php if (!empty($links['config_link'])): ?>
            <div class="mb-2">
                <strong>لینک کانفیگ مستقیم:</strong><br>
                <input type="text" class="form-control form-control-sm mt-1" value="<?= htmlspecialchars($links['config_link']) ?>" readonly>
                <button class="btn btn-sm btn-outline-primary mt-1" onclick="copyToClipboard('<?= htmlspecialchars($links['config_link'], ENT_QUOTES) ?>', 'لینک کانفیگ کپی شد')">
                    <i class="bi bi-clipboard"></i> کپی
                </button>
            </div>
        <?php endif; ?>
        <button type="button" class="btn-close" data-bs-dismiss="alert"></button>
    </div>
    <?php
}
?>

<?php if ($is_rep_expired): ?>
    <div class="alert alert-danger">
        <strong>⚠️ توجه:</strong> دسترسی شما منقضی شده است. لطفاً با مدیر تماس بگیرید.
    </div>
<?php elseif ($is_rep_traffic_limited): ?>
    <div class="alert alert-warning">
        <strong>⚠️ توجه:</strong> حد ترافیک شما تمام شده است. لطفاً با مدیر تماس بگیرید.
    </div>
<?php endif; ?>

<?php if (!empty($allowed_inbound_ids) && empty($inbounds)): ?>
    <div class="alert alert-warning">
        <strong>⚠️ توجه:</strong> هیچ inbound مجازی برای شما تعریف نشده است. لطفاً با مدیر تماس بگیرید.
    </div>
<?php endif; ?>

<div class="row g-4 mb-4">
    <div class="col-md-4">
        <div class="stat-card-pro">
            <div class="d-flex align-items-center">
                <div class="stat-icon bg-soft-primary text-primary me-3">
                    <i class="bi bi-bar-chart-line"></i>
                </div>
                <div>
                    <p class="stat-label mb-1">ترافیک مصرفی</p>
                    <h4 class="stat-value mb-0"><?= number_format($rep_used_traffic / (1024 * 1024 * 1024), 2) ?> <small>GB</small></h4>
                </div>
            </div>
        </div>
    </div>
    <div class="col-md-4">
        <div class="stat-card-pro">
            <div class="d-flex align-items-center">
                <div class="stat-icon bg-soft-success text-success me-3">
                    <i class="bi bi-pie-chart"></i>
                </div>
                <div>
                    <p class="stat-label mb-1">حد ترافیک</p>
                    <h4 class="stat-value mb-0"><?= $rep_traffic_limit > 0 ? number_format($rep_traffic_limit / (1024 * 1024 * 1024), 2) . ' <small>GB</small>' : 'نامحدود' ?></h4>
                </div>
            </div>
        </div>
    </div>
    <div class="col-md-4">
        <div class="stat-card-pro">
            <div class="d-flex align-items-center">
                <div class="stat-icon bg-soft-warning text-warning me-3">
                    <i class="bi bi-calendar-event"></i>
                </div>
                <div>
                    <p class="stat-label mb-1">تاریخ انقضا</p>
                    <h4 class="stat-value mb-0"><?= $rep_expiry_date ? date('Y/m/d', strtotime($rep_expiry_date)) : 'نامحدود' ?></h4>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="card card-xui">
    <div class="card-header d-flex justify-content-between align-items-center">
        <h5 class="mb-0">مدیریت کاربران</h5>
        <div class="d-flex align-items-center gap-2 flex-wrap">
            <span class="badge bg-info" title="مجموع کانفیگ‌هایی که شما ساخته‌اید">کانفیگ ساخته‌شده: <?= number_format($total_users_count) ?></span>
            <?php if ($total_pages > 1): ?>
                <span class="badge bg-secondary">صفحه <?= $current_page ?> از <?= $total_pages ?></span>
            <?php endif; ?>
            <?php if ($wallet_price_per_config > 0 || $wallet_price_per_gb > 0 || $wallet_price_per_day > 0): ?>
                <span class="badge bg-success">موجودی: <?= number_format($rep_wallet_balance) ?></span>
                <?php if ($wallet_price_per_config > 0): ?>
                    <span class="badge bg-secondary">هر کانفیگ: <?= number_format($wallet_price_per_config) ?> تومان</span>
                <?php endif; ?>
                <?php if ($wallet_price_per_gb > 0): ?>
                    <span class="badge bg-secondary">هر گیگ: <?= number_format($wallet_price_per_gb) ?> تومان</span>
                <?php endif; ?>
                <?php if ($wallet_price_per_day > 0): ?>
                    <span class="badge bg-secondary">هر روز: <?= number_format($wallet_price_per_day) ?> تومان</span>
                <?php endif; ?>
                <?php if ($discount_percent > 0): ?>
                    <span class="badge bg-success">تخفیف: <?= $discount_percent ?>%</span>
                <?php endif; ?>
            <?php endif; ?>
            <button type="button" class="btn btn-soft-primary btn-sm" data-bs-toggle="modal" data-bs-target="#addUserModal">
                <i class="bi bi-person-plus"></i> کاربر جدید
            </button>
            <button type="button" class="btn btn-soft-info btn-sm" data-bs-toggle="modal" data-bs-target="#bulkAddModal">
                <i class="bi bi-collection"></i> ساخت انبوه
            </button>
            <?php if (!empty($inbounds)): ?>
            <form method="POST" class="d-inline">
                <input type="hidden" name="action" value="sync_traffic_from_panel">
                <button type="submit" class="btn btn-soft-info btn-sm" title="همگام‌سازی ترافیک از پنل">
                    <i class="bi bi-arrow-repeat"></i> بروزرسانی
                </button>
            </form>
            <?php endif; ?>
        </div>
    </div>
    <div class="card-body">
        <div class="table-responsive">
            <table class="table table-xui">
                <thead>
                    <tr>
                        <th>پروفایل</th>
                        <th>کاربر</th>
                        <th>اینباند</th>
                        <th>ترافیک (مصرف/کل)</th>
                        <th>روز مانده</th>
                        <th>وضعیت</th>
                        <th>عملیات</th>
                    </tr>
                </thead>
                <tbody>
                    <?php foreach ($users as $user): ?>
    <?php
    // تولید کد مشتری (Customer Code)
    $customer_code = "USR-" . (10000 + $user['id']);
    
    // استخراج اولین حرف برای آواتار
    $initials = mb_substr($user['remark'] ?: $user['email'], 0, 1, 'UTF-8');
    
    // کلید برای یافتن اطلاعات ترافیک لحظه‌ای
    $client_key = ($user['panel_id'] ?? $panel_id) . '_' . ($user['email'] ?? '');
    $traffic_info = $client_traffic_data[$client_key] ?? null;

    // تعیین ترافیک مصرفی
    $consumed_traffic = $user['total_traffic']; // پیش‌فرض از دیتابیس
    if (isset($traffic_info['up']) && isset($traffic_info['down'])) {
        $consumed_traffic = $traffic_info['up'] + $traffic_info['down'];
    }

    // تعیین روز مانده
    $remaining_days_text = 'نامحدود';
    $expiry_timestamp = !empty($user['expiry_date']) ? strtotime($user['expiry_date']) : 0;
    if (isset($traffic_info['expiryTime']) && $traffic_info['expiryTime'] > 0) {
        $expiry_timestamp = (int)($traffic_info['expiryTime'] / 1000);
    }
    if ($expiry_timestamp > 0) {
        $remaining_seconds = $expiry_timestamp - time();
        if ($remaining_seconds < 0) {
            $remaining_days_text = 'منقضی شده';
        } else {
            $remaining_days_text = floor($remaining_seconds / (60 * 60 * 24)) . ' روز';
        }
    }

    // تعیین وضعیت
    $status = $user['status'];
    // به‌روزرسانی وضعیت بر اساس اطلاعات لحظه‌ای
    if ($expiry_timestamp > 0 && $expiry_timestamp < time()) {
        $status = 'expired';
    } elseif ($user['traffic_limit'] > 0 && $consumed_traffic >= $user['traffic_limit']) {
        $status = 'limited';
    }

    $status_class = 'secondary';
    $status_text = 'نامشخص';
    switch ($status) {
        case 'active':
            $status_class = 'success';
            $status_text = 'فعال';
            break;
        case 'expired':
            $status_class = 'danger';
            $status_text = 'منقضی شده';
            break;
        case 'limited':
            $status_class = 'warning';
            $status_text = 'ترافیک تمام';
            break;
        case 'disabled':
            $status_class = 'secondary';
            $status_text = 'غیرفعال';
            break;
    }

    // محاسبه برای خط روند ترافیک
    $traffic_limit_bytes = (int)($user['traffic_limit'] ?? 0);
    $percentage = 0;
    $bar_class = 'bg-info'; // برای نامحدود

    if ($traffic_limit_bytes > 0) {
        $percentage = min(100, ($consumed_traffic / $traffic_limit_bytes) * 100);
        $bar_class = 'bg-success'; // سبز
        if ($percentage >= 80) {
            $bar_class = 'bg-warning'; // زرد
        }
        if ($percentage >= 95) {
            $bar_class = 'bg-danger'; // قرمز
        }
    } else {
        // اگر نامحدود بود، یک حالت خاص برای نمایش در نظر می‌گیریم
        $percentage = 100;
    }
    ?>
    <tr>
        <td>
            <div class="d-flex align-items-center gap-3">
                <div class="user-avatar"><?= htmlspecialchars($initials) ?></div>
                <div>
                    <div class="customer-code"><?= $customer_code ?></div>
                </div>
            </div>
        </td>
        <td>
            <div class="fw-bold"><?= htmlspecialchars($user['remark'] ?: $user['email']) ?></div>
            <small class="text-muted d-block" style="font-size: 0.7rem;"><?= htmlspecialchars($user['email']) ?></small>
        </td>
        <td>
            <?php
            $inbound_key = ($user['panel_id'] ?? $panel_id) . '_' . ($user['inbound_id'] ?? 0);
            $iid_only = (int)($user['inbound_id'] ?? 0);
            // فقط کانفیگ‌های ساخته‌شده توسط این نماینده (دیتابیس)، نه همه کلاینت‌های پنل
            $created_on_inbound = (int)($inbound_current_count[$inbound_key] ?? $inbound_current_count[$iid_only] ?? 0);
            $inbound_remark = 'Inbound #' . $iid_only;
            if (isset($all_inbounds_data[$inbound_key]['remark'])) {
                $inbound_remark = $all_inbounds_data[$inbound_key]['remark'];
            }
            echo htmlspecialchars($inbound_remark);
            echo ' <span class="badge bg-secondary" title="تعداد کانفیگ ساخته‌شده توسط شما روی این اینباند">' . $created_on_inbound . '</span>';
            ?>
        </td>
        <td>
            <div class="d-flex justify-content-between">
                <span><?= formatBytes($consumed_traffic) ?></span>
                <span class="text-muted"><?= $traffic_limit_bytes > 0 ? formatBytes($traffic_limit_bytes) : '∞' ?></span>
            </div>
            <div class="progress mt-1" style="height: 5px;">
                <div class="progress-bar <?= $bar_class ?>" role="progressbar" style="width: <?= $percentage ?>%;" aria-valuenow="<?= $percentage ?>" aria-valuemin="0" aria-valuemax="100"></div>
            </div>
        </td>
        <td><?= $remaining_days_text ?></td>
        <td>
            <span class="badge bg-<?= $status_class ?>"><?= $status_text ?></span>
        </td>
        <td>
            <div class="actions-xui">
                <button type="button" class="btn-action-xui btn-qr" 
                        onclick="showQRCode(<?= $user['id'] ?>, <?= $user['inbound_id'] ?>, '<?= htmlspecialchars($user['xray_user_id'] ?? '', ENT_QUOTES) ?>')"
                        title="QR Code و لینک">
                    <i class="bi bi-qr-code"></i>
                </button>
                <?php if (!empty($user['check_token'])): 
                    $check_url = (defined('BASE_URL') ? rtrim(BASE_URL, '/') : '') . '/api/check_usage.php?token=' . urlencode($user['check_token']);
                ?>
                <button type="button" class="btn-action-xui btn-tg" 
                        onclick="showCheckUsage('<?= htmlspecialchars($user['check_token'], ENT_QUOTES) ?>', '<?= htmlspecialchars($check_url, ENT_QUOTES) ?>', '<?= htmlspecialchars($user['email'], ENT_QUOTES) ?>')"
                        title="کد استعلام (ربات تلگرام / لینک)">
                    <i class="bi bi-telegram"></i>
                </button>
                <?php endif; ?>
                <button type="button" class="btn-action-xui btn-info" 
                        onclick="showUserDetails(<?= htmlspecialchars(json_encode($user)) ?>)"
                        title="جزئیات">
                    <i class="bi bi-info-circle"></i>
                </button>
                <button type="button" class="btn-action-xui btn-edit" 
                        onclick="editUser(<?= htmlspecialchars(json_encode($user)) ?>)"
                        title="ویرایش">
                    <i class="bi bi-pencil"></i>
                </button>
                <a href="?delete=<?= $user['id'] ?>&page=<?= $current_page ?>" class="btn-action-xui btn-del" 
                   onclick="return confirm('آیا مطمئن هستید؟')" title="حذف">
                    <i class="bi bi-trash"></i>
                </a>
            </div>
        </td>
    </tr>
<?php endforeach; ?>
                </tbody>
            </table>
        </div>
        <?php if ($total_pages > 1): ?>
            <?php
            $range_start = $total_users_count > 0 ? $users_offset + 1 : 0;
            $range_end = min($users_offset + count($users), $total_users_count);
            ?>
            <nav class="mt-3" aria-label="صفحه‌بندی کاربران">
                <p class="text-muted small text-center mb-2">
                    نمایش <?= number_format($range_start) ?> تا <?= number_format($range_end) ?> از <?= number_format($total_users_count) ?> کانفیگ
                </p>
                <ul class="pagination pagination-sm justify-content-center mb-0 flex-wrap">
                    <li class="page-item <?= $current_page <= 1 ? 'disabled' : '' ?>">
                        <a class="page-link" href="?page=<?= max(1, $current_page - 1) ?>">قبلی</a>
                    </li>
                    <?php
                    $page_window = 2;
                    $start_p = max(1, $current_page - $page_window);
                    $end_p = min($total_pages, $current_page + $page_window);
                    if ($start_p > 1): ?>
                        <li class="page-item"><a class="page-link" href="?page=1">1</a></li>
                        <?php if ($start_p > 2): ?><li class="page-item disabled"><span class="page-link">…</span></li><?php endif; ?>
                    <?php endif;
                    for ($p = $start_p; $p <= $end_p; $p++): ?>
                        <li class="page-item <?= $p === $current_page ? 'active' : '' ?>">
                            <a class="page-link" href="?page=<?= $p ?>"><?= $p ?></a>
                        </li>
                    <?php endfor;
                    if ($end_p < $total_pages): ?>
                        <?php if ($end_p < $total_pages - 1): ?><li class="page-item disabled"><span class="page-link">…</span></li><?php endif; ?>
                        <li class="page-item"><a class="page-link" href="?page=<?= $total_pages ?>"><?= $total_pages ?></a></li>
                    <?php endif; ?>
                    <li class="page-item <?= $current_page >= $total_pages ? 'disabled' : '' ?>">
                        <a class="page-link" href="?page=<?= min($total_pages, $current_page + 1) ?>">بعدی</a>
                    </li>
                </ul>
            </nav>
        <?php endif; ?>
    </div>
</div>

<script src="https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js"></script>


<!-- Modal افزودن کاربر -->
<div class="modal fade" id="addUserModal" tabindex="-1">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title">کاربر جدید</h5>
                <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
            </div>
            <form method="POST">
                <div class="modal-body">
                    <input type="hidden" name="action" value="add">
                    <div class="mb-3">
                        <label class="form-label">Inbound <span class="text-danger">*</span></label>
                        <?php if (empty($inbounds)): ?>
                            <div class="alert alert-warning">هیچ inbound مجازی برای شما تعریف نشده است.</div>
                        <?php else: ?>
                            <select name="inbound_id" class="form-select" required>
                                <option value="">انتخاب کنید</option>
                                <?php foreach ($inbounds as $inbound): 
                                    $iid = $inbound['id'];
                                    $pid = isset($inbound['_panel_id']) ? (int)$inbound['_panel_id'] : $panel_id;
                                    $opt_val = isset($inbound['_panel_id']) ? ($pid . '_' . $iid) : $iid;
                                    $cur = (int)($inbound_current_count[$pid . '_' . $iid] ?? $inbound_current_count[$iid] ?? 0);
                                    $lim = (int)($inbound_user_limit[$pid . '_' . $iid] ?? $inbound_user_limit[$iid] ?? 0);
                                    $limit_txt = $lim > 0 ? " ({$cur}/{$lim})" : '';
                                    $panel_label = isset($inbound['_panel_name']) ? ($inbound['_panel_name'] . ' — ') : '';
                                ?>
                                    <option value="<?= $opt_val ?>">
                                        <?= $panel_label ? htmlspecialchars($panel_label) : '' ?><?= htmlspecialchars($inbound['remark'] ?? 'Inbound #' . $iid) ?> 
                                        (<?= htmlspecialchars($inbound['protocol'] ?? '') ?>) - Port: <?= $inbound['port'] ?? '' ?><?= $limit_txt ?>
                                    </option>
                                <?php endforeach; ?>
                            </select>
                        <?php endif; ?>
                    </div>
                    <div class="mb-3">
                        <label class="form-label">ایمیل یا شناسه کاربری <span class="text-danger">*</span></label>
                        <input type="text" name="email" class="form-control" required 
                               pattern=".*" 
                               title="می‌توانید ایمیل یا شناسه کاربری وارد کنید">
                        <small class="form-text text-muted">می‌توانید ایمیل (مثلاً user@example.com) یا شناسه کاربری (مثلاً user123) وارد کنید</small>
                    </div>
                    <div class="mb-3">
                        <label class="form-label">توضیحات</label>
                        <input type="text" name="remark" class="form-control" placeholder="مثل پنل x-ui">
                    </div>
                    <div class="mb-3">
                        <label class="form-label">ترافیک کل (GB) — 0 نامحدود</label>
                        <input type="number" name="traffic_limit" class="form-control" min="0" value="1" placeholder="0 = ∞">
                    </div>
                    <div class="mb-3">
                        <label class="form-label">مدت زمان (روز) — 0 نامحدود</label>
                        <input type="number" name="expiry_days" class="form-control" min="0" value="0" placeholder="0 = ∞">
                    </div>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">بستن</button>
                    <button type="submit" class="btn btn-success">اضافه کردن</button>
                </div>
            </form>
        </div>
    </div>
</div>

<!-- Modal ساخت انبوه -->
<div class="modal fade" id="bulkAddModal" tabindex="-1">
    <div class="modal-dialog modal-lg">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title"><i class="bi bi-collection"></i> ساخت انبوه کاربر</h5>
                <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
            </div>
            <form method="POST">
                <div class="modal-body">
                    <input type="hidden" name="action" value="bulk_add">
                    <div class="mb-3">
                        <label class="form-label">روش</label>
                        <select name="bulk_method" class="form-select" id="bulk_method_select">
                            <option value="list">لیست ایمیل (هر خط یک کاربر)</option>
                            <option value="range">پیشوند + عدد + پسوند</option>
                        </select>
                    </div>
                    <div class="mb-3" id="bulk_list_box">
                        <label class="form-label">ایمیل یا شناسه (هر خط یک کاربر) <span class="text-danger">*</span></label>
                        <textarea name="bulk_emails" class="form-control font-monospace" rows="5" placeholder="user1&#10;user2&#10;user3"></textarea>
                    </div>
                    <div class="row mb-3 d-none" id="bulk_range_box">
                        <div class="col-6 col-md-3">
                            <label class="form-label">از</label>
                            <input type="number" name="bulk_from" class="form-control" min="0" value="1" id="bulk_from">
                        </div>
                        <div class="col-6 col-md-3">
                            <label class="form-label">تا</label>
                            <input type="number" name="bulk_to" class="form-control" min="0" value="1" id="bulk_to">
                        </div>
                        <div class="col-6 col-md-3">
                            <label class="form-label">پیشوند</label>
                            <input type="text" name="bulk_prefix" class="form-control" id="bulk_prefix" placeholder="user">
                        </div>
                        <div class="col-6 col-md-3">
                            <label class="form-label">پسوند</label>
                            <input type="text" name="bulk_postfix" class="form-control" id="bulk_postfix" placeholder="">
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-md-6 mb-3">
                            <label class="form-label">Inbound <span class="text-danger">*</span></label>
                            <?php if (!empty($inbounds)): ?>
                                <select name="inbound_id" class="form-select" required>
                                    <option value="">انتخاب کنید</option>
                                    <?php foreach ($inbounds as $inbound): 
                                        $iid = $inbound['id'];
                                        $pid = isset($inbound['_panel_id']) ? (int)$inbound['_panel_id'] : $panel_id;
                                        $opt_val = isset($inbound['_panel_id']) ? ($pid . '_' . $iid) : $iid;
                                        $cur = (int)($inbound_current_count[$pid . '_' . $iid] ?? $inbound_current_count[$iid] ?? 0);
                                        $lim = (int)($inbound_user_limit[$pid . '_' . $iid] ?? $inbound_user_limit[$iid] ?? 0);
                                        $limit_txt = $lim > 0 ? " ({$cur}/{$lim})" : '';
                                        $panel_label = isset($inbound['_panel_name']) ? ($inbound['_panel_name'] . ' — ') : '';
                                    ?>
                                        <option value="<?= $opt_val ?>"><?= $panel_label ? htmlspecialchars($panel_label) : '' ?><?= htmlspecialchars($inbound['remark'] ?? 'Inbound #' . $iid) ?> (<?= $inbound['protocol'] ?? '' ?>)<?= $limit_txt ?></option>
                                    <?php endforeach; ?>
                                </select>
                            <?php else: ?>
                                <div class="alert alert-warning mb-0">هیچ inbound مجازی تعریف نشده است.</div>
                            <?php endif; ?>
                        </div>
                        <div class="col-md-3 mb-3">
                            <label class="form-label">ترافیک کل (GB) — 0 نامحدود</label>
                            <input type="number" name="traffic_limit" class="form-control" min="0" value="1" placeholder="0 = ∞">
                        </div>
                        <div class="col-md-3 mb-3">
                            <label class="form-label">مدت زمان (روز)</label>
                            <input type="number" name="expiry_days" class="form-control" min="0" value="0" placeholder="0 = ∞">
                        </div>
                    </div>
                    <div class="mb-3">
                        <label class="form-label">توضیحات (برای همه)</label>
                        <input type="text" name="remark" class="form-control" placeholder="<?= htmlspecialchars($rep_default_remark ?: '') ?>">
                    </div>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">بستن</button>
                    <button type="submit" class="btn btn-success"><i class="bi bi-collection"></i> انبوه‌سازی</button>
                </div>
            </form>
        </div>
    </div>
</div>
<script>
(function() {
    var sel = document.getElementById('bulk_method_select');
    var listBox = document.getElementById('bulk_list_box');
    var rangeBox = document.getElementById('bulk_range_box');
    if (!sel || !listBox || !rangeBox) return;
    function toggle() {
        var isRange = sel.value === 'range';
        listBox.classList.toggle('d-none', isRange);
        rangeBox.classList.toggle('d-none', !isRange);
    }
    sel.addEventListener('change', toggle);
    toggle();
})();
</script>

<!-- Modal ویرایش کاربر -->
<div class="modal fade" id="editUserModal" tabindex="-1">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title">ویرایش کاربر</h5>
                <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
            </div>
            <form method="POST">
                <div class="modal-body">
                    <input type="hidden" name="action" value="update">
                    <input type="hidden" name="id" id="edit_user_id">
                    <div class="mb-3">
                        <label class="form-label">ایمیل یا شناسه کاربری <span class="text-danger">*</span></label>
                        <input type="text" name="email" id="edit_email" class="form-control" required 
                               pattern=".*" 
                               title="می‌توانید ایمیل یا شناسه کاربری وارد کنید">
                        <small class="form-text text-muted">می‌توانید ایمیل (مثلاً user@example.com) یا شناسه کاربری (مثلاً user123) وارد کنید</small>
                    </div>
                    <div class="mb-3">
                        <label class="form-label">یادداشت</label>
                        <input type="text" name="remark" id="edit_remark" class="form-control">
                    </div>
                    <div class="mb-3">
                        <label class="form-label">ترافیک مصرفی فعلی</label>
                        <input type="text" class="form-control" value="" id="edit_current_traffic" readonly placeholder="از پنل">
                    </div>
                    <div class="mb-3">
                        <label class="form-label">ترافیک کل (GB) — 0 نامحدود</label>
                        <input type="number" name="traffic_limit" id="edit_traffic_limit" class="form-control" min="0" placeholder="0 = ∞">
                    </div>
                    <div class="mb-3">
                        <label class="form-label">تعداد روز اعتبار - 0 برای نامحدود</label>
                        <input type="number" name="expiry_days" id="edit_expiry_days" class="form-control" min="0">
                    </div>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">انصراف</button>
                    <button type="submit" class="btn btn-primary">ذخیره</button>
                </div>
            </form>
        </div>
    </div>
</div>

<!-- Modal جزئیات کاربر -->
<div class="modal fade" id="userDetailsModal" tabindex="-1">
    <div class="modal-dialog modal-lg">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title">جزئیات کاربر</h5>
                <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
            </div>
            <div class="modal-body" id="userDetailsContent">
                <!-- محتوا از طریق JavaScript پر می‌شود -->
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">بستن</button>
            </div>
        </div>
    </div>
</div>

<!-- Modal نمایش QR Code و لینک -->
<div class="modal fade" id="qrCodeModal" tabindex="-1">
    <div class="modal-dialog modal-lg">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title">QR Code و لینک اشتراک‌گذاری</h5>
                <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
            </div>
            <div class="modal-body text-center">
                <div class="mb-4">
                    <h6>QR Code (لینک کانفیگ مستقیم):</h6>
                    <div id="qr_code_container" class="d-flex justify-content-center mb-3">
                        <div id="qrcode"></div>
                    </div>
                    <small class="text-muted">از این QR Code برای اتصال سریع استفاده کنید</small>
                </div>
                <div class="mb-3">
                    <h6>لینک کانفیگ مستقیم (vless://, vmess://):</h6>
                    <div class="input-group">
                        <input type="text" class="form-control" id="config_link" readonly>
                        <button class="btn btn-outline-secondary" type="button" onclick="copyConfigLink()">
                            <i class="bi bi-clipboard"></i> کپی
                        </button>
                    </div>
                    <small class="text-muted d-block mt-2">این لینک را مستقیماً در اپلیکیشن VPN خود وارد کنید</small>
                </div>
                <div class="mb-3">
                    <h6>لینک اشتراک‌گذاری (Subscription):</h6>
                    <div class="input-group">
                        <input type="text" class="form-control" id="subscription_link" readonly>
                        <button class="btn btn-outline-secondary" type="button" onclick="copySubscriptionLink()">
                            <i class="bi bi-clipboard"></i> کپی
                        </button>
                    </div>
                    <small class="text-muted d-block mt-2">این لینک را برای دریافت خودکار کانفیگ‌ها استفاده کنید</small>
                </div>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">بستن</button>
            </div>
        </div>
    </div>
</div>

<div class="modal fade" id="checkUsageModal" tabindex="-1">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title"><i class="bi bi-telegram"></i> کد استعلام وضعیت کانفیگ</h5>
                <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
            </div>
            <div class="modal-body">
                <p class="text-muted small">این کد یا لینک را به مشتری بدهید تا در ربات تلگرام یا مرورگر بتواند باقی‌مانده ترافیک و زمان را ببیند.</p>
                <div class="mb-3">
                    <label class="form-label mb-1">کد استعلام (برای ربات تلگرام)</label>
                    <div class="input-group">
                        <input type="text" class="form-control font-monospace" id="check_usage_token" readonly>
                        <button class="btn btn-outline-secondary" type="button" onclick="copyCheckToken()"><i class="bi bi-clipboard"></i> کپی</button>
                    </div>
                </div>
                <div class="mb-0">
                    <label class="form-label mb-1">لینک استعلام (برای مرورگر)</label>
                    <div class="input-group">
                        <input type="text" class="form-control form-control-sm" id="check_usage_link" readonly>
                        <button class="btn btn-outline-secondary" type="button" onclick="copyCheckLink()"><i class="bi bi-clipboard"></i> کپی</button>
                    </div>
                </div>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">بستن</button>
            </div>
        </div>
    </div>
</div>

<script src="https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js"></script>
<script>
function showCheckUsage(token, link, email) {
    document.getElementById('check_usage_token').value = token;
    document.getElementById('check_usage_link').value = link;
    new bootstrap.Modal(document.getElementById('checkUsageModal')).show();
}
function copyCheckToken() {
    copyToClipboard(document.getElementById('check_usage_token').value, 'کد استعلام کپی شد.');
}
function copyCheckLink() {
    copyToClipboard(document.getElementById('check_usage_link').value, 'لینک استعلام کپی شد.');
}
function formatBytes(bytes) {
    if (bytes === 0) return '0 B';
    const k = 1024;
    const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
    const i = Math.floor(Math.log(bytes) / Math.log(k));
    return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}

function showUserDetails(user) {
    const customerCode = "USR-" + (10000 + parseInt(user.id));
    const initials = (user.remark || user.email).substring(0, 1).toUpperCase();
    
    var used = parseInt(user.total_traffic, 10) || 0;
    var limitBytes = parseInt(user.traffic_limit, 10) || 0;
    var usedMB = used / 1048576, usedGB = used / 1073741824;
    var usedStr = usedGB >= 1000 ? (Math.round(usedGB/1024) + ' TB') : (usedMB >= 1000 ? (Math.round(usedGB) + ' GB') : (used >= 1048576 ? (Math.round(usedMB) + ' MB') : (used + ' B')));
    var limitGB = limitBytes / 1073741824, limitMB = limitBytes / 1048576;
    var limitStr = limitBytes <= 0 ? 'نامحدود' : (limitGB >= 1000 ? (Math.round(limitGB/1024) + 'TB') : (limitMB >= 1000 ? (Math.round(limitGB) + 'GB') : (Math.round(limitMB) + 'MB')));
    const trafficPercent = limitBytes > 0 ? ((used / limitBytes) * 100).toFixed(1) : 0;
    
    const createdDate = new Date(user.created_at);
    const expiryDate = user.expiry_date ? new Date(user.expiry_date) : null;
    
    let html = `
        <div class="profile-card-header mb-4">
            <div class="d-flex align-items-center gap-4">
                <div class="profile-avatar-large shadow-lg">${initials}</div>
                <div class="profile-info-main">
                    <h4>${user.remark || 'کاربر بدون نام'}</h4>
                    <p><i class="bi bi-envelope me-1"></i> ${user.email}</p>
                    <div class="mt-2">
                        <span class="customer-code" style="background: rgba(255,255,255,0.1); border-color: rgba(255,255,255,0.2); color: white;">
                            ${customerCode}
                        </span>
                    </div>
                </div>
            </div>
        </div>
        <div class="px-4 pb-4">
            <div class="row">
                <div class="col-md-6">
                    <div class="detail-item-pro">
                        <label>وضعیت اشتراک</label>
                        <span class="text-${user.status === 'active' ? 'success' : (user.status === 'expired' ? 'danger' : 'warning')}">
                            ${user.status === 'active' ? '● فعال' : (user.status === 'expired' ? '● منقضی شده' : '● محدود شده')}
                        </span>
                    </div>
                </div>
                <div class="col-md-6">
                    <div class="detail-item-pro">
                        <label>ترافیک مصرفی</label>
                        <span>${usedStr} از ${limitStr}</span>
                    </div>
                </div>
                <div class="col-md-12">
                    <div class="detail-item-pro">
                        <label>پیشرفت مصرف</label>
                        <div class="progress mt-2" style="height: 10px; border-radius: 5px;">
                            <div class="progress-bar ${trafficPercent >= 90 ? 'bg-danger' : (trafficPercent >= 70 ? 'bg-warning' : 'bg-success')}" 
                                 style="width: ${Math.min(trafficPercent, 100)}%"></div>
                        </div>
                        <div class="d-flex justify-content-between mt-1">
                            <small class="text-muted">${trafficPercent}% استفاده شده</small>
                        </div>
                    </div>
                </div>
                <div class="col-md-6">
                    <div class="detail-item-pro">
                        <label>تاریخ ایجاد</label>
                        <span>${createdDate.toLocaleDateString('fa-IR')}</span>
                    </div>
                </div>
                <div class="col-md-6">
                    <div class="detail-item-pro">
                        <label>تاریخ انقضا</label>
                        <span>${expiryDate ? expiryDate.toLocaleDateString('fa-IR') : 'بدون محدودیت'}</span>
                    </div>
                </div>
            </div>
        </div>
    `;
    
    document.getElementById('userDetailsContent').innerHTML = html;
    new bootstrap.Modal(document.getElementById('userDetailsModal')).show();
}

function editUser(user) {
    document.getElementById('edit_user_id').value = user.id;
    document.getElementById('edit_email').value = user.email;
    document.getElementById('edit_remark').value = user.remark || '';
    var limitBytes = parseInt(user.traffic_limit, 10) || 0;
    document.getElementById('edit_traffic_limit').value = limitBytes > 0 ? 
        Math.round(limitBytes / (1024 * 1024 * 1024)) : 0;
    
    // نمایش ترافیک مصرفی فعلی (عدد صحیح مثل XUI)
    var used = parseInt(user.total_traffic, 10) || 0;
    var usedMB = used / 1048576, usedGB = used / 1073741824;
    var usedStr = usedGB >= 1000 ? (Math.round(usedGB/1024) + ' TB') : (usedMB >= 1000 ? (Math.round(usedMB/1024) + ' GB') : (used >= 1048576 ? (Math.round(usedMB) + ' MB') : (used + ' B')));
    document.getElementById('edit_current_traffic').value = usedStr;
    
    if (user.expiry_date) {
        const expiryDate = new Date(user.expiry_date);
        const now = new Date();
        const diffTime = expiryDate - now;
        const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
        document.getElementById('edit_expiry_days').value = diffDays > 0 ? diffDays : 0;
    } else {
        document.getElementById('edit_expiry_days').value = 0;
    }
    
    new bootstrap.Modal(document.getElementById('editUserModal')).show();
}

function showQRCode(userId, inboundId, clientId) {
    // نمایش loading
    document.getElementById('subscription_link').value = 'در حال دریافت...';
    document.getElementById('qrcode').innerHTML = '<div class="spinner-border" role="status"><span class="visually-hidden">Loading...</span></div>';
    new bootstrap.Modal(document.getElementById('qrCodeModal')).show();
    
    // دریافت لینک subscription از سرور
    const url = `get_subscription_link.php?user_id=${userId}&inbound_id=${inboundId}` + 
                (clientId ? `&client_id=${encodeURIComponent(clientId)}` : '');
    
    fetch(url)
        .then(response => {
            if (!response.ok) {
                throw new Error('HTTP error! status: ' + response.status);
            }
            return response.json();
        })
        .then(data => {
            console.log('Response data:', data);
            if (data.success) {
                const subscriptionLink = data.subscription_link || '';
                const configLink = data.config_link || '';
                
                // نمایش لینک subscription
                document.getElementById('subscription_link').value = subscriptionLink || 'در دسترس نیست';
                
                // نمایش لینک کانفیگ مستقیم
                document.getElementById('config_link').value = configLink || 'در دسترس نیست';
                
                // انتخاب لینک برای QR code (اولویت با config link)
                const qrCodeData = configLink || subscriptionLink;
                
                if (!qrCodeData || qrCodeData === '') {
                    throw new Error('هیچ لینکی برای تولید QR Code موجود نیست');
                }
                
                // پاک کردن QR code قبلی
                document.getElementById('qrcode').innerHTML = '';
                
                // تولید QR code جدید با کیفیت بالاتر
                try {
                    new QRCode(document.getElementById('qrcode'), {
                        text: qrCodeData,
                        width: 320,
                        height: 320,
                        colorDark: '#000000',
                        colorLight: '#ffffff',
                        correctLevel: QRCode.CorrectLevel.H
                    });
                } catch (qrError) {
                    console.error('QR Code generation error:', qrError);
                    document.getElementById('qrcode').innerHTML = '<div class="alert alert-danger">خطا در تولید QR Code</div>';
                }
            } else {
                const errorMsg = data.message || 'خطا در دریافت لینک';
                console.error('API Error:', data);
                throw new Error(errorMsg + (data.debug ? ' (جزئیات در کنسول)' : ''));
            }
        })
        .catch(error => {
            console.error('Error:', error);
            console.error('Error details:', error.message, error.stack);
            const errorMsg = error.message || 'خطای نامشخص';
            document.getElementById('subscription_link').value = 'خطا: ' + errorMsg;
            document.getElementById('config_link').value = 'خطا: ' + errorMsg;
            document.getElementById('qrcode').innerHTML = '<div class="alert alert-danger">خطا: ' + error.message + '</div>';
        });
}

function copySubscriptionLink() {
    const linkInput = document.getElementById('subscription_link');
    copyToClipboard(linkInput.value, 'لینک اشتراک‌گذاری کپی شد!');
}

function copyConfigLink() {
    const linkInput = document.getElementById('config_link');
    copyToClipboard(linkInput.value, 'لینک کانفیگ کپی شد!');
}

function copyToClipboard(text, successMessage) {
    if (!text || text === 'در دسترس نیست') {
        alert('لینک موجود نیست');
        return;
    }
    
    const textarea = document.createElement('textarea');
    textarea.value = text;
    textarea.style.position = 'fixed';
    textarea.style.opacity = '0';
    document.body.appendChild(textarea);
    textarea.select();
    textarea.setSelectionRange(0, 99999); // برای موبایل
    
    try {
        document.execCommand('copy');
        document.body.removeChild(textarea);
        alert(successMessage || 'کپی شد!');
    } catch (err) {
        // Fallback برای مرورگرهای جدید
        navigator.clipboard.writeText(text).then(() => {
            document.body.removeChild(textarea);
            alert(successMessage || 'کپی شد!');
        }).catch(() => {
            document.body.removeChild(textarea);
            alert('خطا در کپی کردن لینک');
        });
    }
}
</script>

<?php require_once '../includes/footer.php'; ?>
