const $ = (id) => document.getElementById(id);
let currentUser = null;
let lastData = null;

function bind(id, event, fn) { const el = $(id); if (el) el.addEventListener(event, fn); }
function toast(msg, ok = true) { const t = $('toast'); if (!t) return; t.textContent = msg; t.className = 'toast-box ' + (ok ? 'ok' : 'bad'); t.classList.remove('hidden'); setTimeout(() => t.classList.add('hidden'), 6500); }
async function api(action, payload = {}) { const res = await fetch('api.php', {method:'POST',headers:{'Content-Type':'application/json'},credentials:'same-origin',body:JSON.stringify({action,...payload})}); const data = await res.json().catch(()=>({ok:false,error:'پاسخ JSON نامعتبر است'})); if(!data.ok) throw Object.assign(new Error(data.error||'خطای نامشخص'), data); return data; }
function toman(v) { return new Intl.NumberFormat('fa-IR').format(Number(v || 0)) + ' تومان'; }
function esc(s) { return String(s ?? '').replace(/[&<>"']/g, m => ({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#039;'}[m])); }
function roleTitle(r) { return r === 'admin' ? 'ادمین' : r === 'reseller' ? 'نماینده' : 'مشتری'; }
function faDate(s) { if (!s) return '-'; try { return new Date(String(s).replace(' ', 'T')).toLocaleString('fa-IR'); } catch(e) { return s; } }
function statusClass(status) { return 'status-' + String(status || '').replace(/[^a-z]/g, ''); }
function prettyJson(payload) { if (!payload) return '-'; try { const obj = typeof payload === 'string' ? JSON.parse(payload) : payload; return esc(JSON.stringify(obj, null, 1)).replace(/\n/g,'<br>'); } catch(e) { return esc(payload); } }
function goTab(name) { document.querySelectorAll('#mainTabs .nav-link').forEach(b => b.classList.toggle('active', b.dataset.tab === name)); document.querySelectorAll('.tab').forEach(t => t.classList.remove('active')); $('tab-' + name)?.classList.add('active'); window.scrollTo({top:0,behavior:'smooth'}); }

async function boot() {
  const tg = window.Telegram?.WebApp;
  if (tg) { tg.ready(); tg.expand(); try { tg.setHeaderColor('#080B12'); tg.setBackgroundColor('#080B12'); } catch(e) {} }
  const qs = new URLSearchParams(location.search);
  const panelKey = qs.get('panel_key') || '';
  if (panelKey && $('panelKey')) $('panelKey').value = panelKey;
  try {
    if (tg?.initData) { const auth = await api('auth', {init_data: tg.initData}); currentUser = auth.user; }
    else { try { const me = await api('me'); currentUser = me.user; } catch(e) { $('loginCard')?.classList.remove('hidden'); $('dashboard')?.classList.add('hidden'); return; } }
    $('loginCard')?.classList.add('hidden'); $('dashboard')?.classList.remove('hidden'); await loadDashboard();
  } catch (e) { $('loginCard')?.classList.remove('hidden'); toast(e.message, false); }
}

async function loadDashboard() {
  const d = await api('dashboard'); lastData = d; currentUser = d.user || currentUser;
  $('statUsers').textContent = d.stats.users || 0; $('statBots').textContent = d.stats.bots || 0; $('statActiveBots').textContent = d.stats.active_bots || 0; $('statBalance').textContent = toman(d.stats.balance || 0); $('rolePill').textContent = roleTitle(currentUser.role);
  document.querySelectorAll('.admin-only').forEach(el => el.style.display = currentUser.role === 'admin' ? '' : 'none');
  renderAccount(d.account || {}); renderPaymentUser(d.payment || {}); renderPlans(d.plans || []); renderBots(d.bots || []); renderUsers(d.users || []); renderJoins(d.joins || []); renderLogs(d.logs || []); renderTopups(d.topups || []);
  const payment = d.payment || {}; const card = payment.card || {};
  if ($('activityLogChatId')) $('activityLogChatId').value = d.settings?.activity_log_chat_id || '';
  if ($('ownerTelegramId')) { $('ownerTelegramId').placeholder = 'آیدی عددی مالک ربات'; if (!$('ownerTelegramId').value && currentUser?.telegram_id) $('ownerTelegramId').value = currentUser.telegram_id; }
  if ($('payHolder')) $('payHolder').value = card.holder || ''; if ($('payCard')) $('payCard').value = card.card_number || ''; if ($('payIban')) $('payIban').value = card.iban || ''; if ($('payMin')) $('payMin').value = payment.topup_min_amount || 200000; if ($('payMax')) $('payMax').value = payment.topup_max_amount || 50000000; if ($('botMinBalance')) $('botMinBalance').value = payment.bot_min_balance || 200000;
}
function renderAccount(account) {
  const u = account.user || currentUser || {}; const username = u.username ? '@' + esc(u.username) : '-'; const name = [u.first_name, u.last_name].filter(Boolean).join(' ') || 'بدون نام'; const last = account.last_purchase; const lastPurchase = last ? `@${esc(last.bot_username || '-')} | ${esc(last.plan_title || 'دلخواه')} | تا ${faDate(last.expires_at)}` : '-';
  const rows = [['یوزر عددی', `<span class="ltr d-inline-block">${esc(u.telegram_id || '-')}</span>`],['یوزرنیم', `<span class="ltr d-inline-block">${username}</span>`],['اسم اکانت', esc(name)],['نقش', roleTitle(u.role)],['موجودی حساب', toman(u.balance || 0)],['تاریخ ثبت نام', faDate(u.created_at)],['آخرین خرید', lastPurchase]];
  $('accountInfo').innerHTML = rows.map(([k,v]) => `<div class="col-md-6 col-xl-4"><div class="kv-card"><span>${k}</span><b>${v}</b></div></div>`).join('');
  const active = account.active_plans || [];
  $('activePlans').innerHTML = active.length ? active.map(p => `<div class="col-md-6 col-xl-4"><div class="mini-card"><b>@${esc(p.bot_username || '-')}</b><br>شماره ربات: #${p.bot_id}<br>پلن: ${esc(p.plan_title || 'دلخواه')} ${p.plan_months ? `(${p.plan_months} ماه)` : ''}<br>قیمت: ${toman(p.price)}<br>شروع: ${faDate(p.started_at)}<br>انقضا: ${faDate(p.expires_at)}<br>وضعیت ربات: <span class="${statusClass(p.bot_status)}">${esc(p.bot_status)}</span></div></div>`).join('') : '<div class="col-12"><div class="mini-card text-soft">فعلاً پلن فعالی ثبت نشده است.</div></div>';
}
function renderPaymentUser(payment) {
  const card = payment.card || {}; const has = !!card.card_number;
  $('paymentCardsUser').innerHTML = `<div class="col-lg-4"><div class="kv-card"><span>حداقل شارژ</span><b>${toman(payment.topup_min_amount || 200000)}</b></div></div><div class="col-lg-4"><div class="kv-card"><span>حداکثر شارژ</span><b>${toman(payment.topup_max_amount || 50000000)}</b></div></div><div class="col-lg-4"><div class="kv-card"><span>بررسی موجودی ساخت ربات</span><b>طبق قیمت پلن انتخابی</b></div></div><div class="col-12"><div class="mini-card ${has?'':'status-rejected'}"><b>کارت به کارت</b><br>${has ? `شماره کارت: <span class="ltr d-inline-block">${esc(card.card_number)}</span><br>به نام: ${esc(card.holder || '-')}<br>${card.iban ? `شبا: <span class="ltr d-inline-block">${esc(card.iban)}</span>` : ''}` : 'کارت پرداخت هنوز توسط ادمین ثبت نشده است.'}</div></div>`;
}
function renderPlans(plans) {
  const activePlans = plans.filter(p=>p.status==='active');
  const select = $('botPlan');
  if (select) {
    const first = currentUser?.role === 'customer' ? '<option value="">پلن را انتخاب کن</option>' : '<option value="">بدون پلن / دلخواه</option>';
    select.innerHTML = first + activePlans.map(p=>`<option value="${p.id}">${esc(p.title)} - ${p.months} ماه - ${toman(p.price)}</option>`).join('');
  }
  const isAdmin = currentUser?.role === 'admin';
  $('plansList').innerHTML = plans.map(p=>{
    const actions = isAdmin ? `<div class="d-flex flex-wrap gap-2 mt-2"><button class="btn btn-glass small-btn" onclick="editPlan(${p.id})">✏️ ادیت</button><button class="btn btn-danger-soft small-btn" onclick="deletePlan(${p.id})">🗑 حذف</button></div>` : '';
    return `<div class="col-md-6 col-xl-4"><div class="mini-card"><b>${esc(p.title)}</b><br>مدت: ${esc(p.months)} ماه<br>قیمت: ${toman(p.price)}<br>نوع: ${p.is_custom == 1 ? 'دلخواه' : 'معمولی'}<br>وضعیت: <span class="${statusClass(p.status)}">${esc(p.status)}</span>${actions}</div></div>`;
  }).join('') || '<div class="col-12"><p class="text-soft">پلنی ثبت نشده است.</p></div>';
  updateBotPlanPreview();
}
function getSelectedPlan() { const id = Number($('botPlan')?.value || 0); return (lastData?.plans || []).find(p => Number(p.id) === id) || null; }
function updateBotPlanPreview() {
  const plan = getSelectedPlan(); const notice = $('botBalanceNotice'); const topupBtn = $('botTopupBtn');
  if ($('botMonths')) $('botMonths').readOnly = currentUser?.role === 'customer';
  if ($('botPrice')) $('botPrice').readOnly = currentUser?.role === 'customer';
  if (!notice) return;
  if (!plan) { notice.classList.add('hidden'); topupBtn?.classList.add('hidden'); if (currentUser?.role === 'customer') { if ($('botMonths')) $('botMonths').value=''; if ($('botPrice')) $('botPrice').value=''; } return; }
  if ($('botMonths')) $('botMonths').value = plan.months || 1;
  if ($('botPrice')) $('botPrice').value = plan.price || 0;
  const balance = Number(currentUser?.balance || 0); const price = Number(plan.price || 0);
  if (currentUser?.role !== 'customer') { notice.classList.add('hidden'); topupBtn?.classList.add('hidden'); return; }
  notice.classList.remove('hidden');
  if (balance < price) {
    const need = price - balance;
    notice.className = 'mini-card mt-3 status-rejected';
    notice.innerHTML = `❌ موجودی کافی نیست. قیمت پلن <b>${toman(price)}</b> است، موجودی شما <b>${toman(balance)}</b> و کسری <b>${toman(need)}</b> می‌باشد.`;
    topupBtn?.classList.remove('hidden');
  } else {
    notice.className = 'mini-card mt-3 highlight-card';
    notice.innerHTML = `✅ موجودی کافی است. بعد از ثبت موفق، مبلغ <b>${toman(price)}</b> بابت پلن <b>${esc(plan.title)}</b> کسر می‌شود.`;
    topupBtn?.classList.add('hidden');
  }
}
function renderBots(bots) { const isAdmin = currentUser?.role === 'admin'; $('botsBody').innerHTML = bots.map(b=>{ const deleteBtn = isAdmin ? ` <button class="btn btn-danger-soft small-btn" onclick="deleteBot(${b.id})">🗑 حذف</button>` : ''; const isolated = ['dedicated_database','table_namespace'].includes(String(b.isolation_mode || '')) && b.child_db_name; const providerLabel = b.child_db_provider === 'table_namespace' ? 'فضای داده اختصاصی' : 'روش قدیمی'; const isolationBadge = isolated ? `<span class="status-active">✅ مستقل • ${esc(providerLabel)}</span>` : '<span class="status-rejected">⚠️ قدیمی/مشترک</span>'; return `<tr><td>#${b.id}</td><td class="ltr">@${esc(b.bot_username || '-')}<br><span class="muted">${esc(b.bot_name || '')}</span></td><td>${esc(b.owner_name || '')}<br><span class="muted ltr d-inline-block">${esc(b.owner_telegram_id || '')}</span></td><td>${esc(b.reseller_name || '-')}</td><td>${esc(b.plan_title || 'دلخواه')}<br><span class="muted">${b.plan_months ? b.plan_months + ' ماه' : ''} ${toman(b.price)}</span></td><td><span class="${statusClass(b.status)}">${esc(b.status)}</span></td><td>${isolationBadge}</td><td>${faDate(b.expires_at)}</td><td><button class="btn btn-glass small-btn" onclick="setBotStatus(${b.id}, 'active')">✅ فعال</button> <button class="btn btn-danger-soft small-btn" onclick="setBotStatus(${b.id}, 'suspended')">🔒 قفل</button>${deleteBtn}</td></tr>`; }).join('') || '<tr><td colspan="9">رباتی ثبت نشده است.</td></tr>'; }
function renderUsers(users) { $('usersBody').innerHTML = users.map(u=>`<tr><td>#${u.id}</td><td class="ltr">${esc(u.telegram_id)}<br>@${esc(u.username || '-')}</td><td>${esc([u.first_name,u.last_name].filter(Boolean).join(' ') || '-')}</td><td>${roleTitle(u.role)}</td><td>${toman(u.balance)}</td><td><span class="${statusClass(u.status)}">${esc(u.status)}</span></td><td><button class="btn btn-glass small-btn" onclick="quickUserAmount('${esc(u.telegram_id)}', 1)">+ موجودی</button> <button class="btn btn-danger-soft small-btn" onclick="quickUserAmount('${esc(u.telegram_id)}', -1)">- موجودی</button> <button class="btn btn-danger-soft small-btn" onclick="setUserStatus('${esc(u.telegram_id)}','blocked')">اخراج</button> <button class="btn btn-glass small-btn" onclick="setUserStatus('${esc(u.telegram_id)}','active')">فعال</button></td></tr>`).join('') || '<tr><td colspan="7">برای نقش شما لیست کاربر نمایش داده نمی‌شود.</td></tr>'; }
function renderTopups(rows) { const el = $('topupsBody'); if (!el) return; el.innerHTML = rows.map(p=>`<tr><td>#${p.id}</td><td>${esc([p.first_name,p.last_name].filter(Boolean).join(' ') || '-')}<br><span class="muted ltr d-inline-block">${esc(p.telegram_id || '')}</span></td><td>${toman(p.amount)}</td><td>${esc(p.receipt_type || '-')}</td><td><span class="${statusClass(p.status)}">${esc(p.status)}</span>${p.reject_reason ? `<br><span class="muted">${esc(p.reject_reason)}</span>` : ''}</td><td>${faDate(p.created_at)}</td><td>${p.status === 'pending' ? `<button class="btn btn-glass small-btn" onclick="approveTopup(${p.id})">تایید</button> <button class="btn btn-danger-soft small-btn" onclick="rejectTopup(${p.id})">رد</button>` : '-'}</td></tr>`).join('') || '<tr><td colspan="7">رسیدی ثبت نشده است.</td></tr>'; }
function renderJoins(joins) { const el = $('joinsBody'); if (!el) return; el.innerHTML = joins.map(j=>`<tr><td>#${j.id}</td><td>${esc(j.title)}</td><td class="ltr">${esc(j.chat_id)}<br><span class="muted">${esc(j.invite_url || '')}</span></td><td>${j.join_type === 'group' ? 'گروه/گپ' : 'کانال'}</td><td><span class="${statusClass(j.status)}">${esc(j.status)}</span></td><td><button class="btn btn-glass small-btn" onclick="setJoinStatus(${j.id}, 'active')">فعال</button> <button class="btn btn-danger-soft small-btn" onclick="setJoinStatus(${j.id}, 'inactive')">غیرفعال</button> <button class="btn btn-danger-soft small-btn" onclick="deleteJoin(${j.id})">حذف</button></td></tr>`).join('') || '<tr><td colspan="6">موردی ثبت نشده است.</td></tr>'; }
function renderLogs(logs) { const el = $('logsBody'); if (!el) return; el.innerHTML = logs.map(l=>`<tr><td>${faDate(l.created_at)}</td><td>${esc(l.action)}</td><td>${esc(l.first_name || '-')}<br><span class="muted ltr d-inline-block">${esc(l.telegram_id || '')}</span></td><td class="ltr">${prettyJson(l.payload)}</td></tr>`).join('') || '<tr><td colspan="4">فعلاً گزارشی ثبت نشده است.</td></tr>'; }

async function editPlan(id){
  const p=(lastData?.plans||[]).find(x=>Number(x.id)===Number(id)); if(!p){toast('پلن پیدا نشد',false);return;}
  const title=prompt('عنوان جدید پلن:', p.title || ''); if(title===null)return;
  const monthsRaw=prompt('مدت پلن به ماه:', p.months || 1); if(monthsRaw===null)return;
  const priceRaw=prompt('قیمت پلن به تومان:', p.price || 0); if(priceRaw===null)return;
  const status=confirm('پلن فعال باشد؟ OK=فعال / Cancel=غیرفعال') ? 'active' : 'inactive';
  try{await api('update_plan',{id,title:title.trim(),months:Math.max(1,parseInt(monthsRaw,10)||1),price:Math.max(0,parseInt(priceRaw,10)||0),is_custom:Number(p.is_custom)===1,status});toast('پلن ویرایش شد');await loadDashboard();}catch(e){toast(e.message,false)}
} window.editPlan=editPlan;
async function deletePlan(id){if(!confirm('این پلن حذف شود؟ اگر قبلاً برای رباتی استفاده شده باشد، برای جلوگیری از خرابی فقط غیرفعال می‌شود.'))return;try{await api('delete_plan',{id});toast('پلن حذف یا غیرفعال شد');await loadDashboard();}catch(e){toast(e.message,false)}} window.deletePlan=deletePlan;

async function setBotStatus(botId,status){try{await api('bot_status',{bot_id:botId,status});toast('وضعیت ربات تغییر کرد');await loadDashboard();}catch(e){toast(e.message,false)}} window.setBotStatus=setBotStatus;
async function deleteBot(botId){if(!confirm('این ربات کامل حذف شود؟ وبهوک، جدول‌های اختصاصی و پوشه اختصاصی آن حذف می‌شود.'))return;try{await api('delete_bot',{bot_id:botId});toast('ربات حذف شد');await loadDashboard();}catch(e){toast(e.message,false)}} window.deleteBot=deleteBot;
async function sendBroadcast(){const text=$('broadcastText')?.value.trim()||''; if(!text){toast('متن پیام همگانی را وارد کن',false);return;} if(!confirm('پیام برای همه کاربران فعال ارسال شود؟'))return; try{toast('در حال ارسال پیام همگانی...');const r=await api('broadcast_message',{text});toast(`ارسال شد: ${r.sent} موفق، ${r.failed} ناموفق`);$('broadcastText').value='';await loadDashboard();}catch(e){toast(e.message,false)}}
async function sendDirectMessage(){const telegram_id=$('directTelegramId')?.value.trim()||''; const text=$('directText')?.value.trim()||''; if(!telegram_id||!text){toast('آیدی کاربر و متن پیام را کامل وارد کن',false);return;} try{await api('direct_message',{telegram_id,text});toast('پیام تکی ارسال شد');$('directText').value='';}catch(e){toast(e.message,false)}}
async function forwardBroadcast(){const from_chat_id=$('forwardFromChatId')?.value.trim()||''; const message_id=parseInt($('forwardMessageId')?.value||'0',10); if(!from_chat_id||message_id<=0){toast('Chat ID مبدا و Message ID را کامل وارد کن',false);return;} if(!confirm('این پیام برای همه کاربران فعال فوروارد شود؟'))return; try{toast('در حال فوروارد همگانی...');const r=await api('forward_broadcast',{from_chat_id,message_id});toast(`فوروارد شد: ${r.sent} موفق، ${r.failed} ناموفق`);await loadDashboard();}catch(e){toast(e.message,false)}}
async function pinMessage(){const chat_id=$('pinChatId')?.value.trim()||''; const message_id=parseInt($('pinMessageId')?.value||'0',10); const disable_notification=!!$('pinSilent')?.checked; if(!chat_id||message_id<=0){toast('Chat ID و Message ID را کامل وارد کن',false);return;} try{await api('pin_message',{chat_id,message_id,disable_notification});toast('پیام پین شد');}catch(e){toast(e.message,false)}}
async function setJoinStatus(id,status){try{await api('required_join_status',{id,status});toast('وضعیت جوین اجباری تغییر کرد');await loadDashboard();}catch(e){toast(e.message,false)}} window.setJoinStatus=setJoinStatus;
async function deleteJoin(id){if(!confirm('این جوین اجباری حذف شود؟'))return;try{await api('delete_required_join',{id});toast('حذف شد');await loadDashboard();}catch(e){toast(e.message,false)}} window.deleteJoin=deleteJoin;
async function approveTopup(id){try{await api('topup_approve',{id});toast('رسید تایید شد');await loadDashboard();}catch(e){toast(e.message,false)}} window.approveTopup=approveTopup;
async function rejectTopup(id){const reason=prompt('دلیل رد رسید را بنویس:'); if(!reason) return; try{await api('topup_reject',{id,reason});toast('رسید رد شد');await loadDashboard();}catch(e){toast(e.message,false)}} window.rejectTopup=rejectTopup;

async function quickUserAmount(telegramId, sign){const raw=prompt(sign>0?'مبلغ افزایش موجودی را وارد کن:':'مبلغ کاهش موجودی را وارد کن:'); if(!raw)return; const amount=Math.abs(parseInt(String(raw).replace(/\D/g,''),10)||0); if(amount<=0){toast('مبلغ معتبر نیست',false);return;} try{await api('charge_user',{telegram_id:telegramId,amount:sign*amount,description:sign>0?'افزایش موجودی از مدیریت کاربر':'کاهش موجودی از مدیریت کاربر'});toast('موجودی کاربر تغییر کرد');await loadDashboard();}catch(e){toast(e.message,false)}} window.quickUserAmount=quickUserAmount;
async function setUserStatus(telegramId,status){const msg=status==='blocked'?'این کاربر از ربات اخراج و مسدود شود؟':'دسترسی این کاربر فعال شود؟'; if(!confirm(msg))return; try{await api('user_status',{telegram_id:telegramId,status});toast('وضعیت کاربر تغییر کرد');await loadDashboard();}catch(e){toast(e.message,false)}} window.setUserStatus=setUserStatus;
async function manageUserAmount(sign){const telegramId=$('manageUserTelegramId').value.trim(); const amount=Math.abs(parseInt($('manageUserAmount').value,10)||0); if(!telegramId||amount<=0){toast('آیدی عددی و مبلغ را کامل وارد کن',false);return;} try{await api('charge_user',{telegram_id:telegramId,amount:sign*amount,description:sign>0?'افزایش موجودی از مدیریت سریع':'کاهش موجودی از مدیریت سریع'});toast('موجودی تغییر کرد');await loadDashboard();}catch(e){toast(e.message,false)}}
async function manageUserStatus(status){const telegramId=$('manageUserTelegramId').value.trim(); if(!telegramId){toast('آیدی عددی کاربر را وارد کن',false);return;} try{await api('user_status',{telegram_id:telegramId,status});toast('وضعیت کاربر تغییر کرد');await loadDashboard();}catch(e){toast(e.message,false)}}

document.querySelectorAll('#mainTabs .nav-link').forEach(btn=>btn.addEventListener('click',()=>goTab(btn.dataset.tab)));
document.addEventListener('click', e => { const b = e.target.closest('[data-tab-go]'); if (b) goTab(b.dataset.tabGo); });
bind('manualLoginBtn','click',async()=>{try{const r=await api('auth',{panel_key:$('panelKey').value.trim(),telegram_id:$('panelTelegramId').value.trim()});currentUser=r.user;$('loginCard').classList.add('hidden');$('dashboard').classList.remove('hidden');toast('ورود موفق بود');await loadDashboard();}catch(e){toast(e.message,false)}});
bind('refreshBtn','click',()=>loadDashboard().then(()=>toast('به‌روزرسانی شد')).catch(e=>toast(e.message,false))); bind('logoutBtn','click',async()=>{try{await api('logout');location.reload();}catch(e){location.reload();}});
bind('createBotBtn','click',async()=>{const btn=$('createBotBtn');try{
  const token=$('botToken').value.trim(); const ownerTelegramId=String($('ownerTelegramId')?.value||'').replace(/\D/g,''); const plan=getSelectedPlan(); const role=currentUser?.role||'customer';
  if(!ownerTelegramId){toast('آیدی عددی مالک ربات را وارد کن',false);return;}
  if(role==='customer'){
    if(!plan){toast('اول یکی از پلن‌های فعال را انتخاب کن',false);return;}
    const balance=Number(currentUser?.balance||0), price=Number(plan.price||0);
    if(balance<price){updateBotPlanPreview();toast('موجودی کافی نیست؛ اول افزایش موجودی را بزن',false);goTab('payments-user');return;}
  }
  btn.disabled=true;btn.textContent='⏳ در حال آماده‌سازی و وبهوک...';toast('ربات شما درحال آماده سازی و وبهوک شدن میباشد. از صبر و شکیبایی شما سپاسگذاریم.');
  const payload={bot_token:token,owner_telegram_id:ownerTelegramId,plan_id:$('botPlan').value||null};
  if(role!=='customer'){payload.months=$('botMonths').value||null;payload.price=$('botPrice').value||null;}
  await api('create_bot',payload);$('botToken').value='';toast('ربات ثبت شد، وبهوک فعال شد و مالک با دسترسی کامل ثبت شد');await loadDashboard();
}catch(e){if(e.need_topup){updateBotPlanPreview();goTab('payments-user');}toast(e.message,false)}finally{btn.disabled=false;btn.textContent='ثبت و فعال‌سازی وبهوک'}});
bind('botPlan','change',updateBotPlanPreview);
bind('increaseUserBtn','click',()=>manageUserAmount(1));
bind('decreaseUserBtn','click',()=>manageUserAmount(-1));
bind('blockUserBtn','click',()=>manageUserStatus('blocked'));
bind('unblockUserBtn','click',()=>manageUserStatus('active'));
bind('createPlanBtn','click',async()=>{try{await api('create_plan',{title:$('planTitle').value.trim(),months:$('planMonths').value,price:$('planPrice').value,is_custom:$('planCustom').checked});$('planTitle').value='';$('planMonths').value=1;$('planPrice').value=0;$('planCustom').checked=false;toast('پلن ثبت شد');await loadDashboard();}catch(e){toast(e.message,false)}});
bind('addAdminBtn','click',async()=>{try{await api('add_admin',{telegram_id:$('adminTelegramId').value.trim(),level:$('adminLevel').value});toast('ادمین اضافه شد');await loadDashboard();}catch(e){toast(e.message,false)}});
bind('chargeUserBtn','click',async()=>{try{await api('charge_user',{telegram_id:$('adminTelegramId').value.trim(),amount:$('chargeAmount').value,description:'شارژ دستی از پنل'});toast('شارژ انجام شد');await loadDashboard();}catch(e){toast(e.message,false)}});
bind('resellerBtn','click',async()=>{try{await api('register_reseller',{telegram_id:$('resellerTelegramId').value.trim(),display_name:$('resellerName').value.trim(),commission_percent:$('resellerCommission').value||0});toast('نماینده ثبت شد');await loadDashboard();}catch(e){toast(e.message,false)}});
bind('savePaymentSettingsBtn','click',async()=>{try{await api('save_payment_settings',{holder:$('payHolder').value.trim(),card_number:$('payCard').value.trim(),iban:$('payIban').value.trim(),topup_min_amount:$('payMin').value,topup_max_amount:$('payMax').value,bot_min_balance:$('botMinBalance').value,title:'کارت اصلی'});toast('تنظیمات پرداخت ذخیره شد');await loadDashboard();}catch(e){toast(e.message,false)}});
bind('saveActivitySettingsBtn','click',async()=>{try{await api('save_activity_settings',{activity_log_chat_id:$('activityLogChatId').value.trim()});toast('تنظیمات گزارش ذخیره شد');await loadDashboard();}catch(e){toast(e.message,false)}});
bind('addJoinBtn','click',async()=>{try{await api('add_required_join',{title:$('joinTitle').value.trim(),chat_id:$('joinChatId').value.trim(),invite_url:$('joinInviteUrl').value.trim(),join_type:$('joinType').value});toast('جوین اجباری ثبت شد');await loadDashboard();}catch(e){toast(e.message,false)}});
bind('broadcastBtn','click',sendBroadcast);
bind('directMessageBtn','click',sendDirectMessage);
bind('forwardBroadcastBtn','click',forwardBroadcast);
bind('pinMessageBtn','click',pinMessage);
bind('ticketBtn','click',async()=>{try{await api('support_ticket',{subject:$('ticketSubject').value.trim(),message:$('ticketMessage').value.trim()});$('ticketMessage').value='';toast('پیام ثبت شد');}catch(e){toast(e.message,false)}});
boot();
