<?php
$page_title = 'استيراد من MikroTik';

// ترتيب التحميل هنا مهم جداً: نفحص الدخول والصلاحيات قبل إخراج أي HTML.
// في آخر التعديلات كان استدعاء header/sidebar قبل التحقق، وهذا قد يسبب شاشة بيضاء داخل النافذة الفرعية.
require_once __DIR__ . '/auth.php';
require_once __DIR__ . '/helpers.php';
require_once __DIR__ . '/db_bootstrap.php';

require_login('index.php?login=1');
if (function_exists('require_perm')) {
  // هذه الصفحة تنفيذ/مزامنة من MikroTik وليست إعدادات عامة.
  require_perm('can_mikrotik_sync');
}

try {
  if (function_exists('ensure_db')) ensure_db(true);
} catch (Throwable $e) {
  // لا نترك الصفحة بيضاء إذا تعطل اتصال قاعدة البيانات.
}

$uaAndroidMikrotikImport = ((string)($_GET['ua_android'] ?? '') === '1')
  || stripos((string)($_SERVER['HTTP_USER_AGENT'] ?? ''), 'NetworkCustomersAndroid/') !== false;
$UA_FORCE_DESIGN_V2 = true;
$UA_PAGE_CSS = ['assets/css/pages/mikrotik_import_admin.css'];
if ($uaAndroidMikrotikImport) $UA_PAGE_CSS[] = 'assets/css/android_mikrotik_import.css';
require_once __DIR__ . '/header.php';
if (!(defined('UA_EMBED') && UA_EMBED)) {
  require_once __DIR__ . '/sidebar.php';
}
if ($uaAndroidMikrotikImport) {
  require __DIR__ . '/android_mikrotik_import.php';
  require_once __DIR__ . '/footer.php';
  return;
}
?>

<div class="content-wrapper ua-extracted-page ua-subscriber-child-page ua-sub-child-mikrotik-import">
  <section class="content">
    <div class="ua-page-v2">
      <header class="ua-page-head">
        <div class="ua-page-title">
          <h1>استيراد البيانات من MikroTik</h1>
          <p>معاينة حسابات Hotspot وPPPoE قبل إضافتها إلى قاعدة بيانات البرنامج.</p>
        </div>
      </header>

      <div class="ua-alert alert-info">
        هذا الخيار يسحب <b>حسابات المشتركين</b> الموجودة داخل MikroTik (Hotspot / PPPoE) ويضيفها إلى قاعدة بيانات البرنامج.
        <br>لا نقوم بأي تعديل على الراوتر أثناء الاستيراد.
      </div>

      <section class="ua-panel-v2">
        <div class="ua-panel-body">
          <div class="row">
            <div class="col-md-4">
              <label class="d-block">
                <input type="checkbox" id="optHotspot" checked> استيراد Hotspot Users
              </label>
              <label class="d-block">
                <input type="checkbox" id="optPPP" checked> استيراد PPPoE Secrets
              </label>
              <label class="d-block mt-2">
                <input type="checkbox" id="optOverwrite"> السماح بالكتابة فوق بيانات المشترك الموجود (غير مُستحسن)
              </label>
              <small class="text-muted">بالوضع الافتراضي: إذا كان المشترك موجوداً بنفس اسم المستخدم، لن نغيّر بياناته إلا عند الفراغ.</small>
            </div>
            <div class="col-md-8">
              <div class="d-flex flex-wrap gap-2">
                <button class="btn btn-outline-primary" type="button" id="btnPreview"><i class="fa fa-eye"></i> معاينة</button>
                <button class="btn btn-success" type="button" id="btnImport" disabled><i class="fa fa-download"></i> تنفيذ الاستيراد</button>
                <span id="importStatus" class="ml-2"></span>
              </div>
              <div class="ua-import-progress mt-3 ua-u-hidden" id="importProgressWrap">
                <div class="ua-import-progress-head">
                  <span id="importProgressText">بانتظار البدء...</span>
                  <b id="importProgressPct">0%</b>
                </div>
                <div class="ua-import-progress-track"><div class="ua-import-progress-fill" id="importProgressFill"></div></div>
              </div>
              <div class="mt-3 ua-u-hidden" id="summaryBox"></div>
            </div>
          </div>

          <hr>

          <div class="ua-table-wrap">
            <table class="ua-table ua-u-hidden" id="previewTable">
              <thead>
                <tr>
                  <th>النوع</th>
                  <th>اسم المستخدم</th>
                  <th>الحالة في البرنامج</th>
                  <th>Profile/Service</th>
                  <th>Speed/Rate</th>
                  <th>الحجم/الحد</th>
                  <th>تعليق/تعطيل</th>
                </tr>
              </thead>
              <tbody></tbody>
            </table>
          </div>

          <small class="text-muted">ملاحظة: المعاينة تعرض أول 200 عنصر فقط للتسريع، بينما الاستيراد ينفذ على كامل القائمة.</small>
        </div>
      </section>

      <script>
      (function(){
        const el = (id)=>document.getElementById(id);
        const optHotspot = el('optHotspot');
        const optPPP = el('optPPP');
        const optOverwrite = el('optOverwrite');
        const btnPreview = el('btnPreview');
        const btnImport = el('btnImport');
        const status = el('importStatus');
        const summaryBox = el('summaryBox');
        const progressWrap = el('importProgressWrap');
        const progressFill = el('importProgressFill');
        const progressPct = el('importProgressPct');
        const progressText = el('importProgressText');
        const table = el('previewTable');
        const tbody = table.querySelector('tbody');
        let progressTimer = null;
        let progressValue = 0;

        function q(){
          const p = new URLSearchParams();
          p.set('hotspot', optHotspot.checked ? '1':'0');
          p.set('ppp', optPPP.checked ? '1':'0');
          p.set('overwrite', optOverwrite.checked ? '1':'0');
          return p.toString();
        }

        async function fetchJson(url, opts){
          const r = await fetch(url, Object.assign({credentials:'same-origin'}, opts||{}));
          const txt = await r.text();
          let data = null;
          try { data = JSON.parse(txt); } catch(e) {
            throw new Error(txt ? txt.substring(0, 220) : ('HTTP '+r.status));
          }
          if(!r.ok && data && data.error){ throw new Error(data.message || data.error); }
          return data;
        }

        function setStatus(txt, ok){
          status.textContent = txt;
          status.className = ok ? 'text-success ml-2' : 'text-danger ml-2';
        }

        function setProgress(pct, txt){
          progressValue = Math.max(0, Math.min(100, Number(pct||0)));
          progressWrap.style.display = 'block';
          progressFill.style.width = progressValue + '%';
          progressPct.textContent = Math.round(progressValue) + '%';
          if(txt) progressText.textContent = txt;
        }
        function startSoftProgress(txt){
          stopSoftProgress();
          setProgress(5, txt || 'جاري التنفيذ...');
          progressTimer = setInterval(()=>{
            const next = progressValue < 60 ? progressValue + 7 : (progressValue < 88 ? progressValue + 3 : progressValue + 1);
            setProgress(Math.min(next, 92));
          }, 450);
        }
        function stopSoftProgress(finalPct, txt){
          if(progressTimer){ clearInterval(progressTimer); progressTimer = null; }
          if(typeof finalPct !== 'undefined') setProgress(finalPct, txt || '');
        }
        function failProgress(txt){
          stopSoftProgress(Math.max(progressValue, 100), txt || 'فشل التنفيذ');
          progressFill.style.width = '100%';
        }

        function bytesToHuman(b){
          b = Number(b||0);
          if(!b) return '';
          const u=['B','KB','MB','GB','TB'];
          let i=0;
          while(b>=1024 && i<u.length-1){ b/=1024; i++; }
          return (Math.round(b*100)/100)+' '+u[i];
        }

        function renderPreview(items){
          tbody.innerHTML='';
          (items||[]).forEach(it=>{
            const tr = document.createElement('tr');
            tr.innerHTML = `
              <td>${it.type||''}</td>
              <td>${it.username||''}</td>
              <td>${it.exists ? 'موجود' : 'جديد'}</td>
              <td>${(it.profile||it.service||'')}</td>
              <td>${(it.rate_limit||'') || (it.speed||'') || ''}</td>
              <td>${it.limit_bytes_total ? bytesToHuman(it.limit_bytes_total) : ((it.limit_bytes_in||it.limit_bytes_out) ? (bytesToHuman(it.limit_bytes_in)+' / '+bytesToHuman(it.limit_bytes_out)) : '')}</td>
              <td>${(it.disabled ? 'معطّل' : '')}${(it.comment ? (' '+it.comment) : '')}</td>
            `;
            tbody.appendChild(tr);
          });
          table.style.display = 'table';
        }

        btnPreview.addEventListener('click', async ()=>{
          btnImport.disabled = true;
          setStatus('...جاري المعاينة', true);
          summaryBox.style.display='none';
          table.style.display='none';
          progressFill.style.width='0%';
          startSoftProgress('جاري قراءة الحسابات من MikroTik للمعاينة...');
          try {
            const d = await fetchJson('api/mikrotik_import_preview.php?'+q());
            if(!d.ok) throw new Error(d.error||'Error');
            renderPreview(d.preview||[]);
            summaryBox.innerHTML = `
              <div class="alert alert-secondary mb-0">
                <b>الإجمالي:</b> ${d.total||0}
                &nbsp; | &nbsp;
                <b>جديد:</b> ${d.new_count||0}
                &nbsp; | &nbsp;
                <b>موجود:</b> ${d.existing_count||0}
              </div>
            `;
            summaryBox.style.display='block';
            btnImport.disabled = (d.total||0) === 0;
            stopSoftProgress(100, 'اكتملت المعاينة: ' + (d.total||0) + ' حساب');
            setStatus('المعاينة جاهزة ✅', true);
          } catch(e){
            failProgress('فشل المعاينة');
            setStatus('فشل المعاينة ❌ ' + (e && e.message ? e.message : ''), false);
          }
        });

        btnImport.addEventListener('click', async ()=>{
          btnImport.disabled = true;
          setStatus('...جاري الاستيراد', true);
          startSoftProgress('جاري تنفيذ الاستيراد من MikroTik...');
          try {
            const d = await fetchJson('api/mikrotik_import_run.php?'+q(), {method:'POST'});
            if(!d.ok) throw new Error(d.error||'Error');
            stopSoftProgress(100, `اكتمل الاستيراد — إضافة: ${d.inserted||0} | تحديث: ${d.updated||0} | تخطي: ${d.skipped||0}`);
            setStatus(`تم الاستيراد ✅ (تمت الإضافة: ${d.inserted||0} | تحديث: ${d.updated||0} | تخطي: ${d.skipped||0})`, true);
          } catch(e){
            failProgress('فشل الاستيراد');
            setStatus('فشل الاستيراد ❌ ' + (e && e.message ? e.message : ''), false);
            btnImport.disabled = false;
          }
        });
      })();
      </script>

    </div>
  </section>
</div>

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