/* ================= پنل مدیریت — ویرایش همه‌ی بخش‌ها ================= */
(function () {
  'use strict';
  var Store = window.Store;
  var D = Store.load();
  var PW_KEY = 'shahedSummer.pw';
  var AUTH_KEY = 'shahedSummer.auth';
  var PWS_KEY = 'shahedSummer.pws';

  /* ---------- اتصال به سرور (api/api.php) برای اعمال مستقیم تغییرات ---------- */
  var API = '../api/api.php';
  var hasApi = false, apiWritable = false, apiInfo = null;

  function sessPw(v){
    try{ if(v!==undefined) sessionStorage.setItem(PWS_KEY, v); return sessionStorage.getItem(PWS_KEY)||''; }
    catch(e){ return ''; }
  }

  function apiCall(action, extra, cb){
    var body = {}; var k;
    if(extra){ for(k in extra){ if(Object.prototype.hasOwnProperty.call(extra,k)) body[k]=extra[k]; } }
    body.action = action;
    if(body.password===undefined) body.password = sessPw();
    var xhr = new XMLHttpRequest();
    xhr.open('POST', API + '?action=' + encodeURIComponent(action) + '&t=' + Date.now(), true);
    xhr.setRequestHeader('Content-Type','application/json;charset=utf-8');
    xhr.onreadystatechange = function(){
      if(xhr.readyState!==4) return;
      var r=null; try{ r=JSON.parse(xhr.responseText); }catch(e){}
      if(xhr.status>=200 && xhr.status<300 && r && r.ok) cb(null, r);
      else cb((r && r.error) ? r.error : ('پاسخ نامعتبر از سرور (' + xhr.status + ')'), r);
    };
    try{ xhr.send(JSON.stringify(body)); }catch(e){ cb('ارسال درخواست ناموفق بود'); }
  }

  /* خواندن محتوای زنده‌ی سایت از سرور */
  function loadFromServer(done){
    apiCall('load', {}, function(err, r){
      if(!err && r && r.data && r.data.site){ D = r.data; try{ Store.save(D); }catch(e){} }
      if(done) done();
    });
  }

  /* نوشتن مستقیم محتوا روی سایت */
  var pushT=null, pushing=false;
  function pushToServer(loud){
    if(!hasApi){ if(loud) alert('اتصال به سرور برقرار نیست. از دکمه‌ی دانلود استفاده کنید.'); return; }
    if(pushing){ clearTimeout(pushT); pushT=setTimeout(function(){ pushToServer(loud); }, 700); return; }
    pushing=true;
    apiCall('save', {data: D}, function(err, r){
      pushing=false;
      if(err){ flash('⚠️ انتشار روی سایت ناموفق: ' + err); return; }
      flash('✅ ذخیره و روی سایت اعمال شد');
    });
  }

  function apiHelpHtml(){
    return '✅ اتصال به سرور برقرار است؛ هر تغییری که ذخیره کنید <b>خودکار روی ساید اعمال می‌شود</b> و نیازی به دانلود/آپلود ندارید.'
      .replace('ساید','سایت') +
      (apiWritable ? '' : '<br>⚠️ اما فایل <b>assets/js/content.js</b> روی هاست قابل نوشتن نیست؛ سطح دسترسی فایل را روی <b>644</b> و پوشه assets/js را روی <b>755</b> تنطیم کنید.');
  }

  /* ---------- ساخت فایل content.js برای انتشار روی هاست ---------- */
  function dlFile(text, name, mime){
    var blob = new Blob([text], {type: mime});
    var url = URL.createObjectURL(blob);
    var a = document.createElement('a');
    a.href = url; a.download = name;
    document.body.appendChild(a); a.click();
    setTimeout(function(){ try{document.body.removeChild(a);}catch(e){} URL.revokeObjectURL(url); }, 400);
  }
  function downloadContentJs(){
    try{
      /* نسخه‌ی جدید انتشار: هم در content.js و هم در version.json ثبت می‌شود.
         لودر صفحه، version.json را همیشه بدون کش می‌خواند؛ پس با جایگزینی این دو فایل،
         کش قدیمی مرورگر همه‌ی کاربران دور زده می‌شود و با یک رفرش آپدیت می‌گیرند */
      var stamp = 'pub-' + Date.now();
      var data = Store.load();
      data.contentVersion = stamp;
      var header = '/* محتوای منتشرشده‌ی سایت ترم تابستان — این فایل را در assets/js/content.js هاست جایگزین کنید */\n';
      dlFile(header + 'window.SITE_DATA = ' + JSON.stringify(data, null, 2) + ';\n', 'content.js', 'application/javascript;charset=utf-8');
      setTimeout(function(){ dlFile(JSON.stringify({build: stamp}) + '\n', 'version.json', 'application/json;charset=utf-8'); }, 500);
      flash('✅ فایل‌های content.js و version.json ساخته شد');
    }catch(e){ alert('خطا در ساخت فایل: '+e.message); }
  }

  function esc(s){ return String(s==null?'':s).replace(/[&<>"']/g,function(c){return({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'})[c];}); }
  function el(id){ return document.getElementById(id); }
  function getPw(){ try{ return localStorage.getItem(PW_KEY) || 'shahed1405'; }catch(e){ return 'shahed1405'; } }

  /* ---------- ذخیره ---------- */
  function persist(){
    Store.save(D);
    if(hasApi){ flash('⏳ در حال اعمال روی سایت…'); clearTimeout(pushT); pushT=setTimeout(function(){ pushToServer(false); }, 500); }
    else flash();
  }
  var flashT;
  function flash(msg){ var f=el('saveFlash'); if(msg) f.textContent=msg; f.classList.add('show'); clearTimeout(flashT); flashT=setTimeout(function(){f.classList.remove('show'); f.textContent='✅ ذخیره شد';},1600); }

  /* ---------- ورود ---------- */
  function isAuthed(){ try{ return sessionStorage.getItem(AUTH_KEY)==='1'; }catch(e){ return false; } }
  function showApp(){ el('loginWrap').style.display='none'; el('adminApp').style.display='block'; renderPanel(currentTab); }
  el('loginBtn').addEventListener('click', doLogin);
  el('pwInput').addEventListener('keydown', function(e){ if(e.key==='Enter') doLogin(); });
  function doLogin(){
    var pw = el('pwInput').value;
    if(!hasApi){
      if(pw===getPw()){ try{sessionStorage.setItem(AUTH_KEY,'1');}catch(e){} el('loginErr').style.display='none'; showApp(); }
      else { el('loginErr').textContent='رمز اشتباه است.'; el('loginErr').style.display='block'; }
      return;
    }
    el('loginBtn').disabled = true;
    apiCall('login', {password: pw}, function(err){
      el('loginBtn').disabled = false;
      if(err){ el('loginErr').textContent = err; el('loginErr').style.display='block'; return; }
      sessPw(pw);
      try{sessionStorage.setItem(AUTH_KEY,'1');}catch(e){}
      el('loginErr').style.display='none';
      loadFromServer(function(){ showApp(); });
    });
  }
  el('logoutBtn').addEventListener('click', function(){ try{sessionStorage.removeItem(AUTH_KEY);}catch(e){} location.reload(); });

  /* ---------- تب‌ها ---------- */
  var currentTab='general';
  el('adminTabs').addEventListener('click', function(e){
    var b=e.target.closest('button[data-p]'); if(!b) return;
    currentTab=b.getAttribute('data-p');
    [].forEach.call(el('adminTabs').children,function(x){x.classList.toggle('active',x===b);});
    renderPanel(currentTab);
  });

  /* ---------- ابزارهای فرم ---------- */
  function field(label, value, oninput, isArea){
    var wrap=document.createElement('div'); wrap.className='a-field';
    var lb=document.createElement('label'); lb.textContent=label; wrap.appendChild(lb);
    var inp=document.createElement(isArea?'textarea':'input');
    inp.className=isArea?'a-textarea':'a-input'; inp.value=value==null?'':value;
    if(isArea==='tall') inp.className='a-textarea tall';
    inp.addEventListener('input',function(){ oninput(inp.value); });
    wrap.appendChild(inp); return wrap;
  }
  function btn(txt,cls,fn){ var b=document.createElement('button'); b.className='a-btn '+(cls||''); b.textContent=txt; b.addEventListener('click',fn); return b; }
  function card(title, sub){ var c=document.createElement('div'); c.className='a-card'; if(title){var h=document.createElement('h3'); h.textContent=title; c.appendChild(h);} if(sub){var s=document.createElement('div'); s.className='a-sub'; s.textContent=sub; c.appendChild(s);} return c; }

  /* ---------- رندر پنل‌ها ---------- */
  function renderPanel(p){
    var host=el('panels'); host.innerHTML='';
    var div=document.createElement('div'); div.className='admin-panel active'; host.appendChild(div);
    var MAP={general:pGeneral, calendar:pCalendar, announcements:pAnnouncements, rules:pRules, faq:pFaq, guides:pGuides, guest:pGuest, courses:pCourses, offerings:pOfferings, schedule:pSchedule, groups:pGroups, exams:pExams, fees:pFees, downloads:pDownloads, links:pLinks, support:pSupport, settings:pSettings};
    var fn=MAP[p];
    if(typeof fn!=='function'){
      var w=card('⚠️ بخش پیدا نشد','به نظر می‌رسد مرورگر نسخه‌ی قدیمی فایل admin.js را از کش خوانده است.');
      var h=document.createElement('div'); h.className='a-help';
      h.innerHTML='برای حل مشکل، صفحه را با <b>Ctrl+F5</b> (یا Cmd+Shift+R) رفرش کنید تا آخرین نسخه‌ی پنل بارگذاری شود.';
      w.appendChild(h);
      w.appendChild(btn('♻️ بارگذاری دوباره‌ی پنل','primary',function(){ location.href=location.pathname+'?r='+Date.now(); }));
      div.appendChild(w);
      return;
    }
    fn(div);
  }

  /* ===== عمومی ===== */
  function pGeneral(root){
    var c=card('اطلاعات عمومی سایت','عنوان، زیرعنوان و متن هیرو');
    c.appendChild(field('عنوان سایت', D.site.title, function(v){D.site.title=v;}));
    c.appendChild(field('زیرعنوان', D.site.subtitle, function(v){D.site.subtitle=v;}));
    c.appendChild(field('عنوان هیرو', D.site.heroTitle, function(v){D.site.heroTitle=v;}));
    c.appendChild(field('متن هیرو', D.site.heroSub, function(v){D.site.heroSub=v;}, true));
    c.appendChild(field('کد ترم', D.site.termCode, function(v){D.site.termCode=v;}));
    c.appendChild(btn('💾 ذخیره','primary',persist));
    root.appendChild(c);
  }

  /* ===== تقویم ===== */
  function pCalendar(root){
    var c=card('زمان‌شمار','تاریخ شروع و پایان کلاس‌ها (میلادی — مبنای شمارش معکوس و تولید برنامه هفتگی)');
    c.appendChild(field('متن ��رچسب زمان‌شمار', D.countdown.label, function(v){D.countdown.label=v;}));
    var r=document.createElement('div'); r.className='a-row';
    r.appendChild(field('شروع کلاس‌ها (YYYY-MM-DDTHH:MM:SS)', D.countdown.classStart, function(v){D.countdown.classStart=v;}));
    r.appendChild(field('پایان کلاس‌ها', D.countdown.classEnd, function(v){D.countdown.classEnd=v;}));
    c.appendChild(r);
    c.appendChild(btn('💾 ذخیره','primary',persist));
    root.appendChild(c);

    var c2=card('رویدادهای تقویم آموزشی','تاریخ شمسی نمایشی + تاریخ میلادی برای وضعیت (انجام‌شده/درجریان)');
    (D.calendar||[]).forEach(function(ev,i){
      var it=document.createElement('div'); it.className='a-item';
      var hd=document.createElement('div'); hd.className='a-item-head';
      hd.innerHTML='<span class="a-item-title">'+esc(ev.icon+' '+ev.title)+'</span>';
      var act=document.createElement('div'); act.className='a-item-actions';
      act.appendChild(btn('🗑 حذف','danger sm',function(){D.calendar.splice(i,1);persist();pCalendar(clear(root));}));
      hd.appendChild(act); it.appendChild(hd);
      var r1=document.createElement('div'); r1.className='a-row';
      r1.appendChild(field('آیکون', ev.icon, function(v){ev.icon=v;}));
      r1.appendChild(field('عنوان', ev.title, function(v){ev.title=v;}));
      it.appendChild(r1);
      it.appendChild(field('تاریخ شمسی (نمایشی)', ev.jalali, function(v){ev.jalali=v;}));
      var r2=document.createElement('div'); r2.className='a-row';
      r2.appendChild(field('شروع میلادی (YYYY-MM-DD)', ev.gStart, function(v){ev.gStart=v;}));
      r2.appendChild(field('پایان میلادی (YYYY-MM-DD)', ev.gEnd, function(v){ev.gEnd=v;}));
      it.appendChild(r2);
      var r3=document.createElement('div'); r3.className='a-row';
      r3.appendChild(field('ساعت شروع (HH:MM — مبنای زمان‌شمار)', ev.startTime, function(v){ev.startTime=v.trim();}));
      r3.appendChild(field('ساعت پایان (HH:MM — اختیاری)', ev.endTime, function(v){ev.endTime=v.trim();}));
      it.appendChild(r3);
      c2.appendChild(it);
    });
    var bar=document.createElement('div'); bar.className='a-actions-bar';
    bar.appendChild(btn('➕ افزودن رویداد','',function(){D.calendar.push({id:'ev'+Date.now(),icon:'📅',title:'رویداد جدید',jalali:'',gStart:'2026-01-01',startTime:'08:00',gEnd:'2026-01-01',endTime:''});persist();pCalendar(clear(root));}));
    bar.appendChild(btn('💾 ذخیره','primary',persist));
    c2.appendChild(bar);
    c2.appendChild(field('متن یادداشت تقویم', D.calendarNote, function(v){D.calendarNote=v;}, true));
    root.appendChild(c2);
  }

  /* ===== اطلاعیه‌ها ===== */
  function pAnnouncements(root){
    var c=card('اطلاعیه‌ها','اطلاعیه اصلی، تکمیلی یا هر اطلاعیه‌ی جدید — ترتیب همین فهرست، ترتیب نمایش در سایت است');
    var hlp=document.createElement('div'); hlp.className='a-help';
    hlp.innerHTML='با دکمه‌های <b>↑</b> و <b>↓</b> جای اطلاعیه‌ها را عوض کنید و با <b>⤒</b> یک اطلاعیه را یک‌راست به بالای فهرست ببرید. اطلاعیه‌ی جدید هم خودکار در بالاترین جایگاه اضافه می‌شود.';
    c.appendChild(hlp);
    (D.announcements||[]).forEach(function(a,i){
      var it=document.createElement('div'); it.className='a-item';
      var hd=document.createElement('div'); hd.className='a-item-head';
      hd.innerHTML='<span class="a-item-title">'+esc(a.title)+'</span>';
      var act=document.createElement('div'); act.className='a-item-actions';
      var mv=function(from,to){ var arr=D.announcements; var x=arr.splice(from,1)[0]; arr.splice(to,0,x); persist(); pAnnouncements(clear(root)); };
      act.appendChild(btn('⤒ به بالای فهرست','sm',function(){ mv(i,0); }));
      if(i>0) act.appendChild(btn('↑','sm',function(){ mv(i,i-1); }));
      if(i<D.announcements.length-1) act.appendChild(btn('↓','sm',function(){ mv(i,i+1); }));
      act.appendChild(btn('🗑 حذف','danger sm',function(){D.announcements.splice(i,1);persist();pAnnouncements(clear(root));}));
      hd.appendChild(act); it.appendChild(hd);
      var r1=document.createElement('div'); r1.className='a-row three';
      r1.appendChild(field('آیکون', a.icon, function(v){a.icon=v;}));
      r1.appendChild(field('برچسب', a.badge, function(v){a.badge=v;}));
      r1.appendChild(field('منبع (کانال)', a.source, function(v){a.source=v;}));
      it.appendChild(r1);
      it.appendChild(field('عنوان', a.title, function(v){a.title=v;}));
      it.appendChild(field('خلاصه', a.summary, function(v){a.summary=v;}));
      it.appendChild(field('متن کامل', a.body, function(v){a.body=v;}, 'tall'));
      var r2=document.createElement('div'); r2.className='a-row';
      r2.appendChild(field('لینک (اختیاری)', a.link, function(v){a.link=v;}));
      r2.appendChild(field('متن دکمه‌ی لینک', a.linkText, function(v){a.linkText=v;}));
      it.appendChild(r2);
      var r3=document.createElement('div'); r3.className='a-row';
      r3.appendChild(field('مسیر فایل PDF (اختیاری)', a.file, function(v){a.file=v;}));
      r3.appendChild(field('متن دکمه‌ی فایل', a.fileText, function(v){a.fileText=v;}));
      it.appendChild(r3);
      c.appendChild(it);
    });
    var bar=document.createElement('div'); bar.className='a-actions-bar';
    bar.appendChild(btn('➕ افزودن اطلاعیه (در ب����لای فهرست)','',function(){D.announcements.unshift({id:'an'+Date.now(),icon:'📢',badge:'اطلاعیه',title:'اطلاعیه جدید',summary:'',body:'',link:'',linkText:'مشاهده',source:''});persist();pAnnouncements(clear(root));}));
    bar.appendChild(btn('💾 ذخیره','primary',persist));
    c.appendChild(bar);
    root.appendChild(c);
  }

  /* ===== نکات مهم ===== */
  function pRules(root){
    if(!D.importantRules) D.importantRules={title:'نکات مهم و قوانین ترم تابستان',summary:'',items:[]};
    var r=D.importantRules;
    var c=card('نکات مهم و قوانین ترم تابستان','عنوان، توضیح کوتاه و فهرست نکات (هر خط یک نکته)');
    c.appendChild(field('عنوان', r.title, function(v){r.title=v;}));
    c.appendChild(field('توضیح کوتاه', r.summary, function(v){r.summary=v;}));
    c.appendChild(field('نکات (هر خط یک نکته)', (r.items||[]).join('\n'), function(v){r.items=v.split('\n').filter(function(x){return x.trim();});}, 'tall'));
    c.appendChild(btn('💾 ذخیره','primary',persist));
    root.appendChild(c);
  }

  /* ===== راهنماها ===== */
  function pGuides(root){
    var c=card('راهنماهای ثبت‌نام','مراحل هر راهنما را خط به خط وارد کنید (هر خط = یک گام)');
    (D.guides||[]).forEach(function(g,i){
      var it=document.createElement('div'); it.className='a-item';
      var hd=document.createElement('div'); hd.className='a-item-head';
      hd.innerHTML='<span class="a-item-title">'+esc(g.title)+'</span>';
      var act=document.createElement('div'); act.className='a-item-actions';
      act.appendChild(btn('🗑 حذف','danger sm',function(){D.guides.splice(i,1);persist();pGuides(clear(root));}));
      hd.appendChild(act); it.appendChild(hd);
      var r1=document.createElement('div'); r1.className='a-row';
      r1.appendChild(field('آیکون', g.icon, function(v){g.icon=v;}));
      r1.appendChild(field('عنوان', g.title, function(v){g.title=v;}));
      it.appendChild(r1);
      it.appendChild(field('خلاصه', g.summary, function(v){g.summary=v;}));
      it.appendChild(field('مراحل (هر خط یک گام)', (g.steps||[]).join('\n'), function(v){g.steps=v.split('\n').filter(function(x){return x.trim();});}, 'tall'));
      var r2=document.createElement('div'); r2.className='a-row';
      r2.appendChild(field('لینک', g.link, function(v){g.link=v;}));
      r2.appendChild(field('متن دکمه', g.linkText, function(v){g.linkText=v;}));
      it.appendChild(r2);
      var r3=document.createElement('div'); r3.className='a-row';
      r3.appendChild(field('مسیر فایل PDF (اختیاری)', g.file, function(v){g.file=v;}));
      r3.appendChild(field('متن دکمه‌ی فایل', g.fileText, function(v){g.fileText=v;}));
      it.appendChild(r3);
      c.appendChild(it);
    });
    var bar=document.createElement('div'); bar.className='a-actions-bar';
    bar.appendChild(btn('➕ افزودن راهنما','',function(){D.guides.push({id:'g'+Date.now(),icon:'⚜️',title:'راهنمای جدید',summary:'',steps:[],link:'',linkText:'ورود'});persist();pGuides(clear(root));}));
    bar.appendChild(btn('💾 ذخیره','primary',persist));
    c.appendChild(bar);
    root.appendChild(c);
  }

  /* ===== مهمان شدن ===== */
  function pGuest(root){
    var g=D.guest;
    var c=card('راهنمای مهمان شدن','همه‌ی لیست‌ها خط به خط وارد می‌شوند');
    c.appendChild(field('آیکون', g.icon, function(v){g.icon=v;}));
    c.appendChild(field('عنوان', g.title, function(v){g.title=v;}));
    c.appendChild(field('مقدمه', g.intro, function(v){g.intro=v;}, true));
    c.appendChild(field('۱) قوانین و شرایط (هر خط یک مورد)', (g.rules||[]).join('\n'), function(v){g.rules=v.split('\n').filter(function(x){return x.trim();});}, 'tall'));
    c.appendChild(field('نکته‌ی دروس زبان', g.langNote, function(v){g.langNote=v;}, true));
    c.appendChild(field('۲) مراحل ثبت درخواست (هر خط)', (g.requestSteps||[]).join('\n'), function(v){g.requestSteps=v.split('\n').filter(function(x){return x.trim();});}, 'tall'));
    c.appendChild(field('مسیر تأیید (هر خط یک مرحله)', (g.approval||[]).join('\n'), function(v){g.approval=v.split('\n').filter(function(x){return x.trim();});}, true));
    c.appendChild(field('گام نهایی', g.finalStep, function(v){g.finalStep=v;}, true));
    c.appendChild(field('۳) نکات مهم (هر خط)', (g.important||[]).join('\n'), function(v){g.important=v.split('\n').filter(function(x){return x.trim();});}, 'tall'));
    c.appendChild(field('۴) دانشگاه‌های دارای ترم تابستان (هر خط)', (g.universities||[]).join('\n'), function(v){g.universities=v.split('\n').filter(function(x){return x.trim();});}, 'tall'));
    c.appendChild(field('منبع', g.source, function(v){g.source=v;}));
    c.appendChild(btn('💾 ذخیره','primary',persist));
    root.appendChild(c);
  }

  /* ===== دروس ===== */
  function pCourses(root){
    var c=card('دروس ارائه‌شده','دسته‌ها و دروس هر دسته. هر درس: «نام | واحد»');
    (D.courses||[]).forEach(function(cat,i){
      var it=document.createElement('div'); it.className='a-item';
      var hd=document.createElement('div'); hd.className='a-item-head';
      hd.innerHTML='<span class="a-item-title">📖 '+esc(cat.name)+'</span>';
      var act=document.createElement('div'); act.className='a-item-actions';
      act.appendChild(btn('🗑 حذف دسته','danger sm',function(){D.courses.splice(i,1);persist();pCourses(clear(root));}));
      hd.appendChild(act); it.appendChild(hd);
      it.appendChild(field('نام دسته', cat.name, function(v){cat.name=v;}));
      var txt=(cat.items||[]).map(function(x){return x.name+' | '+x.units;}).join('\n');
      it.appendChild(field('دروس (هر خط: نام | واحد)', txt, function(v){
        cat.items=v.split('\n').filter(function(x){return x.trim();}).map(function(line){var parts=line.split('|');return {name:(parts[0]||'').trim(),units:(parts[1]||'').trim()};});
      }, 'tall'));
      c.appendChild(it);
    });
    var bar=document.createElement('div'); bar.className='a-actions-bar';
    bar.appendChild(btn('➕ افزودن دسته','',function(){D.courses.push({id:'c'+Date.now(),name:'دسته‌ی جدید',items:[]});persist();pCourses(clear(root));}));
    bar.appendChild(btn('💾 ذخیره','primary',persist));
    c.appendChild(bar);
    root.appendChild(c);
  }

  /* ===== برنامه هفتگی ===== */
  function pSchedule(root){
    if(!D.schedule) D.schedule={};
    if(!D.scheduleDays) D.scheduleDays=[];
    if(!D.scheduleTimes) D.scheduleTimes=[];

    var cCfg=card('روزها و ستون‌های زمانی','ساختار جدول برنامه هفتگی — هر خط یک مورد');
    var newDays=(D.scheduleDays||[]).join('\n'), newTimes=(D.scheduleTimes||[]).join('\n');
    var rc=document.createElement('div'); rc.className='a-row';
    rc.appendChild(field('روزهای هفته (هر خط یک روز)', newDays, function(v){ newDays=v; }, 'tall'));
    rc.appendChild(field('بازه‌های ساعتی (مثلاً 8-10)', newTimes, function(v){ newTimes=v; }, 'tall'));
    cCfg.appendChild(rc);
    var hlpS=document.createElement('div'); hlpS.className='a-help';
    hlpS.innerHTML='با ذخیره‌ی این بخش، جدول زیر بازسازی می‌شود. دروسی که در روز/ساعت حذف‌شده بودند، دیگر نمایش داده نمی‌شوند.';
    cCfg.appendChild(hlpS);
    cCfg.appendChild(btn('💾 ذخیره ساختار جدول','primary',function(){
      D.scheduleDays=newDays.split('\n').map(function(s){return s.trim();}).filter(function(s){return s;});
      D.scheduleTimes=newTimes.split('\n').map(function(s){return s.trim();}).filter(function(s){return s;});
      D.scheduleDays.forEach(function(d){ if(!D.schedule[d]) D.schedule[d]={}; });
      persist(); pSchedule(clear(root));
    }));
    root.appendChild(cCfg);

    var c=card('برنامه هفتگی','برای هر روز و بازه‌ی زمانی، دروس را خط به خط بنویسید (هر خط یک درس)');
    var days=D.scheduleDays||[], times=D.scheduleTimes||[];
    var help=document.createElement('div'); help.className='a-help'; help.textContent='ستون‌های زمانی: '+times.join(' ، '); c.appendChild(help);
    days.forEach(function(day){
      var it=document.createElement('div'); it.className='a-item';
      it.innerHTML='<div class="a-item-head"><span class="a-item-title">📆 '+esc(day)+'</span></div>';
      times.forEach(function(t){
        var items=(D.schedule[day]&&D.schedule[day][t])||[];
        it.appendChild(field('ساعت '+t, items.join('\n'), function(v){
          if(!D.schedule[day]) D.schedule[day]={};
          D.schedule[day][t]=v.split('\n').filter(function(x){return x.trim();});
        }, true));
      });
      c.appendChild(it);
    });
    c.appendChild(field('یادداشت‌های زیر جدول (هر خط)', (D.scheduleNotes||[]).join('\n'), function(v){D.scheduleNotes=v.split('\n').filter(function(x){return x.trim();});}, true));
    c.appendChild(btn('💾 ذخیره','primary',persist));
    root.appendChild(c);
  }

  /* ===== گروه‌های درسی ===== */
  function pGroups(root){
    if(!D.classGroups) D.classGroups=[];
    var c=card('گروه‌های درسی','دسته‌بندی‌ها و گروه‌های هر درس (نام درس، گروه، استاد، زمان و لینک‌های عضویت)');

    D.classGroups.forEach(function(cat,ci){
      if(!cat.items) cat.items=[];
      var it=document.createElement('div'); it.className='a-item';
      var hd=document.createElement('div'); hd.className='a-item-head';
      hd.innerHTML='<span class="a-item-title">👥 '+esc(cat.name)+' ('+(cat.items.length)+' گروه)</span>';
      var act=document.createElement('div'); act.className='a-item-actions';
      if(ci>0) act.appendChild(btn('↑','sm',function(){var t=D.classGroups[ci-1];D.classGroups[ci-1]=cat;D.classGroups[ci]=t;persist();pGroups(clear(root));}));
      if(ci<D.classGroups.length-1) act.appendChild(btn('↓','sm',function(){var t=D.classGroups[ci+1];D.classGroups[ci+1]=cat;D.classGroups[ci]=t;persist();pGroups(clear(root));}));
      act.appendChild(btn('🗑 حذف دسته','danger sm',function(){ if(confirm('این دسته و همه‌ی گروه‌های داخل آن حذف شود؟')){ D.classGroups.splice(ci,1); persist(); pGroups(clear(root)); } }));
      hd.appendChild(act); it.appendChild(hd);

      it.appendChild(field('نام دسته', cat.name, function(v){cat.name=v;}));

      cat.items.forEach(function(g,gi){
        var sub=document.createElement('div'); sub.className='a-item';
        var shd=document.createElement('div'); shd.className='a-item-head';
        shd.innerHTML='<span class="a-item-title">'+esc((g.course||'بدون نام')+(g.group?(' — '+g.group):''))+'</span>';
        var sact=document.createElement('div'); sact.className='a-item-actions';
        if(gi>0) sact.appendChild(btn('↑','sm',function(){var t=cat.items[gi-1];cat.items[gi-1]=g;cat.items[gi]=t;persist();pGroups(clear(root));}));
        if(gi<cat.items.length-1) sact.appendChild(btn('↓','sm',function(){var t=cat.items[gi+1];cat.items[gi+1]=g;cat.items[gi]=t;persist();pGroups(clear(root));}));
        sact.appendChild(btn('🗑 حذف گروه','danger sm',function(){cat.items.splice(gi,1);persist();pGroups(clear(root));}));
        shd.appendChild(sact); sub.appendChild(shd);

        var r1=document.createElement('div'); r1.className='a-row';
        r1.appendChild(field('نام درس', g.course, function(v){g.course=v;}));
        r1.appendChild(field('گروه (مثلاً: گروه ۱ — مختلط)', g.group, function(v){g.group=v;}));
        sub.appendChild(r1);

        var r2=document.createElement('div'); r2.className='a-row';
        r2.appendChild(field('استاد', g.teacher, function(v){g.teacher=v;}));
        r2.appendChild(field('زمان برگزاری', g.time, function(v){g.time=v;}));
        sub.appendChild(r2);

        sub.appendChild(field('لینک گروه (روبیکا/تلگرام)', g.link, function(v){g.link=v.trim();}));
        sub.appendChild(field('لینک گروه دوم (اختیاری)', g.link2, function(v){g.link2=v.trim();}));
        it.appendChild(sub);
      });

      var sbar=document.createElement('div'); sbar.className='a-actions-bar';
      sbar.appendChild(btn('➕ افزودن گروه به این دسته','',function(){ cat.items.push({course:'درس جدید',group:'گروه ۱',teacher:'',time:'',link:'',link2:''}); persist(); pGroups(clear(root)); }));
      sbar.appendChild(btn('💾 ذخیره','primary',persist));
      it.appendChild(sbar);

      c.appendChild(it);
    });

    var bar=document.createElement('div'); bar.className='a-actions-bar';
    bar.appendChild(btn('➕ افزودن دسته','',function(){ D.classGroups.push({id:'cg'+Date.now(),name:'دسته‌ی جدید',items:[]}); persist(); pGroups(clear(root)); }));
    bar.appendChild(btn('💾 ذخیره','primary',persist));
    c.appendChild(bar);
    root.appendChild(c);

    var c2=card('یادداشت بخش گروه‌های درسی','متنی که زیر فهرست گروه‌ها نمایش داده می‌شود');
    c2.appendChild(field('یادداشت', D.classGroupsNote, function(v){D.classGroupsNote=v;}, true));
    c2.appendChild(btn('💾 ذخیره','primary',persist));
    root.appendChild(c2);
  }

  /* ---------- دکمه‌های جابه‌جایی عمومی ---------- */
  function orderBtns(act, arr, i, rerender, topLabel){
    var mv=function(from,to){ var x=arr.splice(from,1)[0]; arr.splice(to,0,x); persist(); rerender(); };
    if(i>0 && topLabel!==false) act.appendChild(btn('⤒','sm',function(){ mv(i,0); }));
    if(i>0) act.appendChild(btn('↑','sm',function(){ mv(i,i-1); }));
    if(i<arr.length-1) act.appendChild(btn('↓','sm',function(){ mv(i,i+1); }));
  }

  /* ===== سوالات متداول ===== */
  function pFaq(root){
    if(!D.faq) D.faq=[];
    var re=function(){ pFaq(clear(root)); };
    var c=card('سوالات متداول (FAQ)','دسته‌ها و پرسش و پاسخ‌های هر دسته');
    D.faq.forEach(function(g,gi){
      if(!g.items) g.items=[];
      var it=document.createElement('div'); it.className='a-item';
      var hd=document.createElement('div'); hd.className='a-item-head';
      hd.innerHTML='<span class="a-item-title">'+esc((g.icon||'🔹')+' '+(g.title||''))+' ('+g.items.length+' سوال)</span>';
      var act=document.createElement('div'); act.className='a-item-actions';
      orderBtns(act, D.faq, gi, re);
      act.appendChild(btn('🗑 حذف دسته','danger sm',function(){ if(confirm('این دسته و همه‌ی سوالات آن حذف شود؟')){ D.faq.splice(gi,1); persist(); re(); } }));
      hd.appendChild(act); it.appendChild(hd);
      var r1=document.createElement('div'); r1.className='a-row';
      r1.appendChild(field('آیکون', g.icon, function(v){g.icon=v;}));
      r1.appendChild(field('عنوان دسته', g.title, function(v){g.title=v;}));
      it.appendChild(r1);
      g.items.forEach(function(q,qi){
        var sub=document.createElement('div'); sub.className='a-item';
        var shd=document.createElement('div'); shd.className='a-item-head';
        shd.innerHTML='<span class="a-item-title">❓ '+esc((q.q||'سوال بدون متن').slice(0,60))+'</span>';
        var sact=document.createElement('div'); sact.className='a-item-actions';
        orderBtns(sact, g.items, qi, re, false);
        sact.appendChild(btn('🗑 حذف','danger sm',function(){ g.items.splice(qi,1); persist(); re(); }));
        shd.appendChild(sact); sub.appendChild(shd);
        sub.appendChild(field('پرسش', q.q, function(v){q.q=v;}));
        sub.appendChild(field('پاسخ (برای خط جدید Enter بزنید)', q.a, function(v){q.a=v;}, 'tall'));
        it.appendChild(sub);
      });
      var sbar=document.createElement('div'); sbar.className='a-actions-bar';
      sbar.appendChild(btn('➕ افزودن پرسش','',function(){ g.items.push({q:'پرسش جدید',a:''}); persist(); re(); }));
      sbar.appendChild(btn('💾 ذخیره','primary',persist));
      it.appendChild(sbar);
      c.appendChild(it);
    });
    var bar=document.createElement('div'); bar.className='a-actions-bar';
    bar.appendChild(btn('➕ افزودن دسته','',function(){ D.faq.push({id:'faq'+Date.now(),icon:'🔹',title:'دسته‌ی جدید',items:[]}); persist(); re(); }));
    bar.appendChild(btn('💾 ذخیره','primary',persist));
    c.appendChild(bar);
    root.appendChild(c);
  }

  /* ===== دروس به تفکیک رشته (کد دروس) ===== */
  function pOfferings(root){
    if(!D.offerings) D.offerings=[];
    var re=function(){ pOfferings(clear(root)); };
    var c=card('دروس ارائه‌شده به تفکیک رشته','هر رشته و دروس آن — هر خط: «نام درس | کد درس»');
    D.offerings.forEach(function(f,fi){
      if(!f.items) f.items=[];
      var it=document.createElement('div'); it.className='a-item';
      var hd=document.createElement('div'); hd.className='a-item-head';
      hd.innerHTML='<span class="a-item-title">🔸 رشته '+esc(f.field||'')+' ('+f.items.length+' درس)</span>';
      var act=document.createElement('div'); act.className='a-item-actions';
      orderBtns(act, D.offerings, fi, re);
      act.appendChild(btn('🗑 حذف رشته','danger sm',function(){ if(confirm('این رشته حذف شود؟')){ D.offerings.splice(fi,1); persist(); re(); } }));
      hd.appendChild(act); it.appendChild(hd);
      it.appendChild(field('نام رشته', f.field, function(v){f.field=v;}));
      var txt=f.items.map(function(x){ return (x.name||'')+' | '+(x.code||''); }).join('\n');
      it.appendChild(field('دروس (هر خط: نام | کد)', txt, function(v){
        f.items=v.split('\n').filter(function(x){return x.trim();}).map(function(line){ var p=line.split('|'); return {name:(p[0]||'').trim(), code:(p[1]||'').trim()}; });
      }, 'tall'));
      c.appendChild(it);
    });
    var bar=document.createElement('div'); bar.className='a-actions-bar';
    bar.appendChild(btn('➕ افزودن رشته','',function(){ D.offerings.push({id:'of'+Date.now(),field:'رشته‌ی جدید',items:[]}); persist(); re(); }));
    bar.appendChild(btn('💾 ذخیره','primary',persist));
    c.appendChild(bar);
    root.appendChild(c);

    var c2=card('یادداشت بخش کد دروس','متنی که زیر فهرست رشته‌ها نمایش داده می‌شود');
    c2.appendChild(field('یادداشت', D.offeringsNote, function(v){D.offeringsNote=v;}, true));
    c2.appendChild(btn('💾 ذخیره','primary',persist));
    root.appendChild(c2);
  }

  /* ===== برنامه امتحانات ===== */
  function pExams(root){
    if(!D.exams) D.exams={title:'برنامه امتحانات',sub:'',note:'',image:'',imageText:'',rows:[]};
    var x=D.exams; if(!x.rows) x.rows=[];
    var re=function(){ pExams(clear(root)); };
    var c=card('برنامه امتحانات','عنوان، یادداشت، تصویر و جدول روزهای امتحان');
    c.appendChild(field('عنوان', x.title, function(v){x.title=v;}));
    c.appendChild(field('زیرعنوان', x.sub, function(v){x.sub=v;}));
    c.appendChild(field('یادداشت زیر جدول', x.note, function(v){x.note=v;}, true));
    var r0=document.createElement('div'); r0.className='a-row';
    r0.appendChild(field('مسیر تصویر برنامه (مثلاً assets/files/x.png)', x.image, function(v){x.image=v.trim();}));
    r0.appendChild(field('متن دکمه‌ی تصویر', x.imageText, function(v){x.imageText=v;}));
    c.appendChild(r0);
    c.appendChild(btn('💾 ذخیره','primary',persist));
    root.appendChild(c);

    var c2=card('روزهای امتحان','برای هر روز، دروس را خط به خط بنویسید — هر خط: «ساعت | نام درس»');
    x.rows.forEach(function(rw,ri){
      if(!rw.items) rw.items=[];
      var it=document.createElement('div'); it.className='a-item';
      var hd=document.createElement('div'); hd.className='a-item-head';
      hd.innerHTML='<span class="a-item-title">📆 '+esc((rw.day||'')+' — '+(rw.date||''))+'</span>';
      var act=document.createElement('div'); act.className='a-item-actions';
      orderBtns(act, x.rows, ri, re, false);
      act.appendChild(btn('🗑 حذف روز','danger sm',function(){ x.rows.splice(ri,1); persist(); re(); }));
      hd.appendChild(act); it.appendChild(hd);
      var r1=document.createElement('div'); r1.className='a-row';
      r1.appendChild(field('روز', rw.day, function(v){rw.day=v;}));
      r1.appendChild(field('تاریخ (شمسی)', rw.date, function(v){rw.date=v;}));
      it.appendChild(r1);
      var txt=rw.items.map(function(i2){ return (i2.time||'')+' | '+(i2.course||''); }).join('\n');
      it.appendChild(field('امتحانات این روز (هر خط: ساعت | درس)', txt, function(v){
        rw.items=v.split('\n').filter(function(s){return s.trim();}).map(function(line){ var p=line.split('|'); return {time:(p[0]||'').trim(), course:(p[1]||'').trim()}; });
      }, 'tall'));
      c2.appendChild(it);
    });
    var bar=document.createElement('div'); bar.className='a-actions-bar';
    bar.appendChild(btn('➕ افزودن روز','',function(){ x.rows.push({day:'روز جدید',date:'',items:[]}); persist(); re(); }));
    bar.appendChild(btn('💾 ذخیره','primary',persist));
    c2.appendChild(bar);
    root.appendChild(c2);
  }

  /* ===== پشتیبانی ===== */
  function pSupport(root){
    if(!D.support) D.support=[];
    var re=function(){ pSupport(clear(root)); };
    var c=card('پشتیبانی و ادمین‌ها','دسته‌های پشتیبانی — هر خط: «نام | آیدی | پلتفرم»');
    D.support.forEach(function(g,gi){
      if(!g.items) g.items=[];
      var it=document.createElement('div'); it.className='a-item';
      var hd=document.createElement('div'); hd.className='a-item-head';
      hd.innerHTML='<span class="a-item-title">'+esc((g.icon||'🛠')+' '+(g.title||''))+'</span>';
      var act=document.createElement('div'); act.className='a-item-actions';
      orderBtns(act, D.support, gi, re, false);
      act.appendChild(btn('🗑 حذف دسته','danger sm',function(){ D.support.splice(gi,1); persist(); re(); }));
      hd.appendChild(act); it.appendChild(hd);
      var r1=document.createElement('div'); r1.className='a-row';
      r1.appendChild(field('آیکون', g.icon, function(v){g.icon=v;}));
      r1.appendChild(field('عنوان دسته', g.title, function(v){g.title=v;}));
      it.appendChild(r1);
      var txt=g.items.map(function(p){ return (p.name||'')+' | '+(p.handle||'')+' | '+(p.platform||''); }).join('\n');
      it.appendChild(field('افراد (هر خط: نام | آیدی | پلتفرم)', txt, function(v){
        g.items=v.split('\n').filter(function(s){return s.trim();}).map(function(line){ var p=line.split('|'); return {name:(p[0]||'').trim(), handle:(p[1]||'').trim(), platform:(p[2]||'').trim()}; });
      }, 'tall'));
      c.appendChild(it);
    });
    var bar=document.createElement('div'); bar.className='a-actions-bar';
    bar.appendChild(btn('➕ افزودن دسته','',function(){ D.support.push({id:'sup'+Date.now(),icon:'🛠',title:'دسته‌ی جدید',items:[]}); persist(); re(); }));
    bar.appendChild(btn('💾 ذخیره','primary',persist));
    c.appendChild(bar);
    root.appendChild(c);
  }

  /* ===== فایل‌ها و دانلودها ===== */
  function pDownloads(root){
    if(!D.downloads) D.downloads=[];
    var re=function(){ pDownloads(clear(root)); };
    var c=card('فایل‌های قابل دانلود','فایل PDF/تصویر را در پوشه‌ی assets/files هاست قرار دهید و مسیرش را اینجا بنویسید');
    D.downloads.forEach(function(f,i){
      var it=document.createElement('div'); it.className='a-item';
      var hd=document.createElement('div'); hd.className='a-item-head';
      hd.innerHTML='<span class="a-item-title">'+esc((f.icon||'📄')+' '+(f.title||''))+'</span>';
      var act=document.createElement('div'); act.className='a-item-actions';
      orderBtns(act, D.downloads, i, re);
      act.appendChild(btn('🗑 حذف','danger sm',function(){ D.downloads.splice(i,1); persist(); re(); }));
      hd.appendChild(act); it.appendChild(hd);
      var r1=document.createElement('div'); r1.className='a-row';
      r1.appendChild(field('آیکون', f.icon, function(v){f.icon=v;}));
      r1.appendChild(field('عنوان', f.title, function(v){f.title=v;}));
      it.appendChild(r1);
      it.appendChild(field('مسیر فایل (مثلاً assets/files/rahnama.pdf)', f.file, function(v){f.file=v.trim();}));
      it.appendChild(field('توضیح', f.desc, function(v){f.desc=v;}));
      c.appendChild(it);
    });
    var bar=document.createElement('div'); bar.className='a-actions-bar';
    bar.appendChild(btn('➕ افزودن فایل','',function(){ D.downloads.push({icon:'📄',title:'فایل جدید',file:'assets/files/',desc:''}); persist(); re(); }));
    bar.appendChild(btn('💾 ذخیره','primary',persist));
    c.appendChild(bar);
    root.appendChild(c);
  }

  /* ===== شهریه ===== */
  function pFees(root){
    var f=D.fees;
    var c=card('جدول شهریه','سرستون‌ها و ردیف‌ها. هر ردیف: مقادیر را با علامت | جدا کنید');
    c.appendChild(field('سرستون‌ها (با | جدا)', (f.cols||[]).join(' | '), function(v){f.cols=v.split('|').map(function(x){return x.trim();});}));
    var txt=(f.rows||[]).map(function(r){return r.join(' | ');}).join('\n');
    c.appendChild(field('ردیف‌ها (هر خط یک ردیف، ستون‌ها با |)', txt, function(v){
      f.rows=v.split('\n').filter(function(x){return x.trim();}).map(function(line){return line.split('|').map(function(x){return x.trim();});});
    }, 'tall'));
    c.appendChild(field('یادداشت زیر جدول', f.note, function(v){f.note=v;}, true));
    c.appendChild(btn('💾 ذخیره','primary',persist));
    root.appendChild(c);
  }

  /* ===== لینک و تماس ===== */
  function pLinks(root){
    var c=card('لینک‌های مهم','سامانه‌ها و لینک‌های مهم');
    (D.links||[]).forEach(function(l,i){
      var it=document.createElement('div'); it.className='a-item';
      var hd=document.createElement('div'); hd.className='a-item-head';
      hd.innerHTML='<span class="a-item-title">'+esc(l.title)+'</span>';
      var act=document.createElement('div'); act.className='a-item-actions';
      act.appendChild(btn('🗑 حذف','danger sm',function(){D.links.splice(i,1);persist();pLinks(clear(root));}));
      hd.appendChild(act); it.appendChild(hd);
      var r1=document.createElement('div'); r1.className='a-row';
      r1.appendChild(field('آیکون', l.icon, function(v){l.icon=v;}));
      r1.appendChild(field('عنوان', l.title, function(v){l.title=v;}));
      it.appendChild(r1);
      it.appendChild(field('آدرس (URL)', l.url, function(v){l.url=v;}));
      it.appendChild(field('توضیح', l.desc, function(v){l.desc=v;}));
      c.appendChild(it);
    });
    var bar=document.createElement('div'); bar.className='a-actions-bar';
    bar.appendChild(btn('➕ افزودن لینک','',function(){D.links.push({icon:'🔗',title:'لینک جدید',url:'https://',desc:''});persist();pLinks(clear(root));}));
    bar.appendChild(btn('💾 ذخیره','primary',persist));
    c.appendChild(bar); root.appendChild(c);

    var c2=card('راه‌های ارتباطی','آیدی‌های تلگرام/کانال‌ها');
    (D.contacts||[]).forEach(function(ct,i){
      var it=document.createElement('div'); it.className='a-item';
      var hd=document.createElement('div'); hd.className='a-item-head';
      hd.innerHTML='<span class="a-item-title">'+esc(ct.name)+'</span>';
      var act=document.createElement('div'); act.className='a-item-actions';
      act.appendChild(btn('🗑 حذف','danger sm',function(){D.contacts.splice(i,1);persist();pLinks(clear(root));}));
      hd.appendChild(act); it.appendChild(hd);
      var r1=document.createElement('div'); r1.className='a-row three';
      r1.appendChild(field('نام', ct.name, function(v){ct.name=v;}));
      r1.appendChild(field('آیدی (@ یا لینک)', ct.handle, function(v){ct.handle=v;}));
      r1.appendChild(field('نقش', ct.role, function(v){ct.role=v;}));
      it.appendChild(r1);
      c2.appendChild(it);
    });
    var bar2=document.createElement('div'); bar2.className='a-actions-bar';
    bar2.appendChild(btn('➕ افزودن تماس','',function(){D.contacts.push({name:'',handle:'@',role:'',type:'telegram'});persist();pLinks(clear(root));}));
    bar2.appendChild(btn('💾 ذخیره','primary',persist));
    c2.appendChild(bar2); root.appendChild(c2);

    var c3=card('فوتر','متن پایین صفحه');
    c3.appendChild(field('متن فوتر', D.footer.text, function(v){D.footer.text=v;}));
    var r=document.createElement('div'); r.className='a-row';
    r.appendChild(field('کانال', D.footer.channel, function(v){D.footer.channel=v;}));
    r.appendChild(field('سال', D.footer.year, function(v){D.footer.year=v;}));
    c3.appendChild(r);
    c3.appendChild(btn('💾 ذخیر��','primary',persist));
    root.appendChild(c3);
  }

  /* ===== تنظیمات ===== */
  function pSettings(root){
    var cPub=card('📤 انتشار تغییرات روی هاست','برای اینکه تغییرات برای همه‌ی کاربران روی هاست اعمال شود، این کار لازم است');
    var pubHelp=document.createElement('div'); pubHelp.className='a-help';
    pubHelp.innerHTML='⚠️ تغییرات شما فقط در همین مرورگر ذخیره می‌شود. برای اینکه همه‌ی کاربران سایت تغییرات را ببینند:<br>۱) دکمهٔ زیر را بزنید تا دو فایل <b>content.js</b> و <b>version.json</b> دانلود شوند.<br>۲) فایل content.js را در مسیر <b>assets/js/content.js</b> و فایل version.json را در <b>ریشهٔ سایت (کنار index.html)</b> جایگزین کنید.<br>۳) تمام! کش مرورگر کاربران خودکار دور زده می‌شود و با یک رفرش ساده، همه آخرین نسخه را می‌بینند.';
    if(hasApi) pubHelp.innerHTML = apiHelpHtml();
    cPub.appendChild(pubHelp);
    if(hasApi){
      cPub.appendChild(btn('🚀 انتشار فوری روی سایت','primary',function(){ pushToServer(true); }));
      cPub.appendChild(btn('♻️ بارگیری محتوای فعلی سایت','',function(){ loadFromServer(function(){ flash('✅ محتوای سایت بارگیری شد'); renderPanel(currentTab); }); }));
    }
    cPub.appendChild(btn('⬇️ دانلود فایل‌های انتشار (روش دستی)', hasApi?'':'primary', downloadContentJs));
    var prev=document.createElement('div'); prev.className='a-help'; prev.style.marginTop='10px';
    prev.innerHTML='👁️ برای پیش‌نمایش تغییرات خودتان قبل از انتشار، <a href=\"../?preview=1\" target=\"_blank\">اینجا را باز کنید</a>.';
    cPub.appendChild(prev);
    root.appendChild(cPub);

    var c=card('تغییر رمز عبور','رمز ورود به پنل مدیریت');
    var npw='';
    c.appendChild(field('رمز جدید', '', function(v){npw=v;}));
    c.appendChild(btn('🔑 تغییر رمز','primary',function(){
      var v=npw.trim(); if(!v) return;
      if(hasApi){
        if(v.length<6){ flash('⚠️ رمز جدید حداقل ۶ کاراکتر باشد'); return; }
        apiCall('changepw', {newPassword: v}, function(err){
          if(err){ flash('⚠️ ' + err); return; }
          sessPw(v); flash('✅ رمز روی سرور تغییر کرد');
        });
      } else {
        try{localStorage.setItem(PW_KEY,v);}catch(e){} flash('✅ رمز تغییر کرد');
      }
    }));
    root.appendChild(c);

    var c2=card('پشتیبان‌گیری و بازگردانی','خروجی/ورودی همه‌ی محتوا به صورت JSON');
    var help=document.createElement('div'); help.className='a-help';
    help.textContent='این بخش فقط برای پشتیبان‌گیری/انتقال محتوا به صورت JSON است. برای انتشار روی هاست از بخش «انتشار تغییرات روی هاست» در بالای همین صفحه استفاده کنید.';
    c2.appendChild(help);
    var ta=document.createElement('textarea'); ta.className='a-textarea tall'; ta.value=Store.export();
    c2.appendChild(ta);
    var bar=document.createElement('div'); bar.className='a-actions-bar';
    bar.appendChild(btn('📋 کپی خروجی','',function(){ ta.select(); try{document.execCommand('copy');}catch(e){} flash('✅ کپی شد'); }));
    bar.appendChild(btn('📥 بارگذاری از متن بالا','primary',function(){ try{ Store.import(ta.value); D=Store.load(); flash('✅ بازگردانی شد'); }catch(e){ flash('⚠️ JSON نامعتبر'); } }));
    c2.appendChild(bar);
    root.appendChild(c2);

    var c3=card('بازنشانی','بازگرداندن همه‌ی محتوا به حالت پیش‌فرض');
    c3.appendChild(btn('♻️ بازنشانی به پیش‌فرض','danger',function(){ if(confirm('همه‌ی تغییرات حذف و به حالت پیش‌فرض بازمی‌گردد. مطمئنید؟')){ Store.reset(); D=Store.load(); flash('✅ بازنشانی شد'); renderPanel('general'); [].forEach.call(el('adminTabs').children,function(x){x.classList.toggle('active',x.getAttribute('data-p')==='general');}); } }));
    root.appendChild(c3);
  }

  function clear(root){ root.innerHTML=''; return root; }

  /* ---------- شروع ---------- */
  apiCall('ping', {}, function(err, r){
    if(!err && r){ hasApi=true; apiWritable=!!r.writable; apiInfo=r; }
    var hint=el('loginHint');
    if(hint) hint.innerHTML = hasApi
      ? (apiWritable ? '✅ اتصال به سرور برقرار است — تغییرات مستقیم روی سایت اعمال می‌شود.' : '⚠️ سرور پاسخ می‌دهد اما فایل content.js قابل نوشتن نیست (دسترسی 644).')
      : 'ℹ️ اتصال به سرور برقرار نشد — پنل در حالت محلی کار می‌کند (انتشار با دانلود فایل).';
    if(isAuthed()){
      if(hasApi && sessPw()) loadFromServer(function(){ showApp(); });
      else showApp();
    }
  });
})();
