<?php
$page_title = 'إدارة الشبكة';
require_once __DIR__ . '/auth.php';
require_login();
if(function_exists('require_perm')) require_perm('can_settings');
$UA_FORCE_DESIGN_V2 = true;
$uaAndroidComms = ((string)($_GET['ua_android'] ?? '') === '1')
  || stripos((string)($_SERVER['HTTP_USER_AGENT'] ?? ''), 'NetworkCustomersAndroid/') !== false;
$UA_PAGE_CSS = ['assets/css/pages/automation_comms_admin.css'];
if ($uaAndroidComms) $UA_PAGE_CSS[] = 'assets/css/android_automation_comms.css';
require_once __DIR__ . '/header.php';
require_once __DIR__ . '/sidebar.php';

$comms_active = 'home';
require_once __DIR__ . '/comms_admin_lib.php';
require_once __DIR__ . '/db_bootstrap.php';

$conn = ensure_db(false);
if ($conn && ($conn instanceof mysqli)) {
  comms_ensure_tables($conn);
}

$embed = isset($_GET['embed']) ? 1 : 0;
if ($uaAndroidComms && !$embed) {
  require __DIR__ . '/android_automation_comms.php';
  require_once __DIR__ . '/footer.php';
  exit;
}
?>
<div class="content-wrapper ua-comms-page ua-extracted-page" dir="rtl">
  <section class="content ua-comms-content">

    <div class="ua-comms-head">
      <div class="ua-comms-head__text">
        <span class="ua-comms-kicker"><i class="fa fa-sitemap"></i> مركز إدارة الشبكة</span>
        <h1>إدارة الشبكة</h1>
        <p>تنظيم الراوترات والقطاعات وتوزيع المشتركين والمعالجات الآمنة من مكان واحد، بدون تغيير أي إعداد فعلي إلا بعد التأكيد.</p>
      </div>
      <div class="ua-comms-head__actions">
        <button type="button" class="ua-comms-btn ua-comms-btn--primary" data-ua-open-modal="#commsWizardModal">
          <i class="fa fa-magic"></i><span>معالج الإعداد</span>
        </button>
        <a class="ua-comms-btn ua-comms-btn--gold" href="wizard_network.php">
          <i class="fa fa-bolt"></i><span>المعالج الذكي</span>
        </a>
      </div>
    </div>

    <div class="ua-comms-grid">
      <article class="ua-comms-card ua-comms-card--main">
        <div class="ua-comms-card__icon"><i class="fa fa-magic"></i></div>
        <div class="ua-comms-card__body">
          <div class="ua-comms-card__top">
            <h2>معالج الإعداد السريع</h2>
            <span>خطوة بخطوة</span>
          </div>
          <p>تجهيز الراوترات، اختيار السيناريو، تعريف القطاعات، ثم اختبار الاتصال قبل أي تطبيق.</p>
          <button type="button" class="ua-comms-btn ua-comms-btn--primary" data-ua-open-modal="#commsWizardModal">
            <i class="fa fa-play"></i><span>فتح المعالج</span>
          </button>
        </div>
      </article>

      <article class="ua-comms-card ua-comms-card--main">
        <div class="ua-comms-card__icon"><i class="fa fa-shield"></i></div>
        <div class="ua-comms-card__body">
          <div class="ua-comms-card__top">
            <h2>المعالج الذكي</h2>
            <span>Detect / Test / Ensure</span>
          </div>
          <p>تشخيص الشبكة واقتراح الإعدادات وتنفيذ Ensure من صفحة مستقلة بعد المراجعة فقط.</p>
          <a class="ua-comms-btn ua-comms-btn--success" href="wizard_network.php">
            <i class="fa fa-external-link"></i><span>فتح المعالج الذكي</span>
          </a>
        </div>
      </article>

      <article class="ua-comms-card">
        <div class="ua-comms-card__icon"><i class="fa fa-server"></i></div>
        <div class="ua-comms-card__body">
          <div class="ua-comms-card__top"><h2>الراوترات</h2><span>API</span></div>
          <p>تعريف أجهزة MikroTik وحفظ بيانات الاتصال والأدوار.</p>
          <a class="ua-comms-btn ua-comms-btn--dark" href="routers.php"><i class="fa fa-cog"></i><span>إدارة الراوترات</span></a>
        </div>
      </article>

      <article class="ua-comms-card">
        <div class="ua-comms-card__icon"><i class="fa fa-sitemap"></i></div>
        <div class="ua-comms-card__body">
          <div class="ua-comms-card__top"><h2>القطاعات VLAN</h2><span>VLAN</span></div>
          <p>ربط القطاعات بالراوترات وتجهيز Trunk وBridge وProfile.</p>
          <a class="ua-comms-btn ua-comms-btn--dark" href="sectors.php"><i class="fa fa-list"></i><span>إدارة القطاعات</span></a>
        </div>
      </article>

      <article class="ua-comms-card">
        <div class="ua-comms-card__icon"><i class="fa fa-users"></i></div>
        <div class="ua-comms-card__body">
          <div class="ua-comms-card__top"><h2>توزيع المشتركين</h2><span>Assign</span></div>
          <p>توزيع المشتركين على القطاعات والخطط بشكل منظم.</p>
          <a class="ua-comms-btn ua-comms-btn--dark" href="subscribers_distribution.php"><i class="fa fa-random"></i><span>فتح التوزيع</span></a>
        </div>
      </article>
    </div>

    <?php if($embed): ?>
      <div class="ua-comms-note"><b>ملاحظة:</b> هذه الصفحة تعمل داخل نافذة مضمّنة، وقد تفتح الروابط في نافذة جديدة.</div>
    <?php endif; ?>

  </section>
</div>

<div class="ua-comms-modal" id="commsWizardModal" aria-hidden="true">
  <div class="ua-comms-modal__backdrop" data-ua-close-modal></div>
  <div class="ua-comms-modal__dialog" role="dialog" aria-modal="true" aria-labelledby="commsWizardTitle">
    <div class="ua-comms-modal__head">
      <div>
        <span>Quick Setup Wizard</span>
        <h3 id="commsWizardTitle">معالج الإعداد السريع</h3>
      </div>
      <button type="button" class="ua-comms-window-btn" data-ua-close-modal aria-label="إغلاق">×</button>
    </div>

    <div class="ua-comms-steps" id="cwSteps">
      <button type="button" class="is-active" data-step="0">1 <span>الراوترات</span></button>
      <button type="button" data-step="1">2 <span>السيناريو</span></button>
      <button type="button" data-step="2">3 <span>القطاعات</span></button>
      <button type="button" data-step="3">4 <span>الفحص</span></button>
    </div>

    <div class="ua-comms-modal__body">
      <div class="cw-pane is-active" id="cwStep1" data-step-pane="0">
        <div class="ua-comms-form-grid ua-comms-form-grid--top">
          <label class="ua-comms-field">
            <span>عدد الراوترات</span>
            <select id="cwRouterCount">
              <option value="1">1</option>
              <option value="2" selected>2</option>
              <option value="3">3</option>
              <option value="4">4</option>
            </select>
          </label>
          <div class="ua-comms-field ua-comms-field--button">
            <button class="ua-comms-btn ua-comms-btn--dark" type="button" id="cwBuildRouters"><i class="fa fa-plus"></i><span>توليد النماذج</span></button>
          </div>
        </div>
        <div class="ua-comms-form-stack" id="cwRoutersWrap"></div>
        <div class="ua-comms-alert ua-comms-alert--info"><b>ملاحظة:</b> يتم حفظ بيانات الراوترات في قاعدة البيانات فقط، ولا يتم تنفيذ أوامر MikroTik من هذه الخطوة.</div>
      </div>

      <div class="cw-pane" id="cwStep2" data-step-pane="1">
        <label class="ua-comms-field ua-comms-field--wide">
          <span>اختر السيناريو</span>
          <select id="cwScenario">
            <option value="standard" selected>قالب الشبكة القياسي - VLAN + PPPoE لكل VLAN</option>
            <option value="single">قالب راوتر واحد</option>
            <option value="dhcp_queues">DHCP + Queues</option>
            <option value="hotspot">Hotspot</option>
            <option value="hybrid">Hybrid - PPPoE + Hotspot</option>
          </select>
        </label>
        <div class="ua-comms-alert ua-comms-alert--warn">اختيار السيناريو هنا يحفظ طريقة التنظيم المقترحة فقط، والتنفيذ الفعلي يتم لاحقاً من خطوة الفحص أو المعالج الذكي.</div>
      </div>

      <div class="cw-pane" id="cwStep3" data-step-pane="2">
        <div class="ua-comms-form-grid ua-comms-form-grid--top">
          <label class="ua-comms-field">
            <span>عدد القطاعات</span>
            <select id="cwSectorCount">
              <option value="1">1</option>
              <option value="2" selected>2</option>
              <option value="3">3</option>
              <option value="4">4</option>
              <option value="6">6</option>
              <option value="8">8</option>
            </select>
          </label>
          <div class="ua-comms-field ua-comms-field--button">
            <button class="ua-comms-btn ua-comms-btn--dark" type="button" id="cwBuildSectors"><i class="fa fa-plus"></i><span>توليد القطاعات</span></button>
          </div>
        </div>
        <div class="ua-comms-form-stack" id="cwSectorsWrap"></div>
        <div class="ua-comms-alert ua-comms-alert--info"><b>الـ Pool:</b> سيتم اقتراح Pool مختلف لكل VLAN تلقائياً بصيغة 10.10.VLAN.0/24.</div>
      </div>

      <div class="cw-pane" id="cwStep4" data-step-pane="3">
        <div class="ua-comms-alert ua-comms-alert--success"><b>اختبار سريع:</b> افحص اتصال API وكشف المنافذ المقترحة قبل التطبيق.</div>
        <div class="ua-comms-form-grid">
          <label class="ua-comms-field">
            <span>IP ترانزيت Router1</span>
            <input type="text" id="cwR1TransitIP" value="10.255.255.1/30" placeholder="10.255.255.1/30">
          </label>
          <label class="ua-comms-field">
            <span>IP ترانزيت Router2</span>
            <input type="text" id="cwR2TransitIP" value="10.255.255.2/30" placeholder="10.255.255.2/30">
          </label>
        </div>
        <div class="ua-comms-action-row">
          <button type="button" class="ua-comms-btn ua-comms-btn--primary" id="cwDetectLinks"><i class="fa fa-search"></i><span>كشف الربط تلقائياً</span></button>
          <button type="button" class="ua-comms-btn ua-comms-btn--success" id="cwRunTests"><i class="fa fa-check-circle"></i><span>تشغيل الاختبار</span></button>
          <button type="button" class="ua-comms-btn ua-comms-btn--gold" id="cwOpenApply"><i class="fa fa-shield"></i><span>تطبيق الآن Ensure</span></button>
        </div>
        <div id="cwDetectResults" class="ua-comms-results"></div>
        <div id="cwTestResults" class="ua-comms-results"></div>
      </div>
    </div>

    <div class="ua-comms-modal__foot">
      <button type="button" class="ua-comms-btn ua-comms-btn--ghost" data-ua-close-modal>إغلاق</button>
      <div class="ua-comms-modal__nav">
        <button type="button" class="ua-comms-btn ua-comms-btn--dark" id="cwPrev"><i class="fa fa-chevron-right"></i><span>السابق</span></button>
        <button type="button" class="ua-comms-btn ua-comms-btn--primary" id="cwNext"><span>التالي</span><i class="fa fa-chevron-left"></i></button>
        <button type="button" class="ua-comms-btn ua-comms-btn--success" id="cwSaveAll"><i class="fa fa-save"></i><span>حفظ الإعدادات</span></button>
      </div>
    </div>
  </div>
</div>

<script>
(function(){
  'use strict';
  function qs(sel, root){ return (root || document).querySelector(sel); }
  function qsa(sel, root){ return Array.prototype.slice.call((root || document).querySelectorAll(sel)); }
  function byId(id){ return document.getElementById(id); }
  function esc(value){
    return String(value == null ? '' : value).replace(/[&<>"']/g, function(ch){
      return {'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#039;'}[ch];
    });
  }
  function setBusy(btn, busy){ if (btn) btn.disabled = !!busy; }

  var currentStep = 0;
  var MODELS = ['hEX (RB750Gr3)','hEX S','hAP ac2','hAP ac3','hAP ax2','hAP ax3','CCR1009','CCR2004','CCR2116','RB4011','RB3011','RB5009','CRS3xx (Switch)','CRS1xx (Switch)','Chateau LTE','Chateau 5G','Other'];

  function modelOptions(){
    return MODELS.map(function(m){ return '<option value="' + esc(m) + '">' + esc(m) + '</option>'; }).join('');
  }

  function openModal(selector){
    var modal = typeof selector === 'string' ? qs(selector) : selector;
    if (!modal) return;
    modal.classList.add('is-open');
    modal.setAttribute('aria-hidden','false');
    document.documentElement.classList.add('ua-modal-open');
    document.body.style.overflow = 'hidden';
    showStep(0);
  }
  function closeModal(modal){
    modal = modal || qs('.ua-comms-modal.is-open');
    if (!modal) return;
    modal.classList.remove('is-open');
    modal.setAttribute('aria-hidden','true');
    document.documentElement.classList.remove('ua-modal-open');
    document.body.style.overflow = '';
  }
  function showStep(index){
    var panes = qsa('[data-step-pane]');
    if (!panes.length) return;
    currentStep = Math.max(0, Math.min(index, panes.length - 1));
    panes.forEach(function(pane){ pane.classList.toggle('is-active', Number(pane.getAttribute('data-step-pane')) === currentStep); });
    qsa('#cwSteps [data-step]').forEach(function(btn){ btn.classList.toggle('is-active', Number(btn.getAttribute('data-step')) === currentStep); });
  }

  function postJson(url, data){
    return fetch(url, {
      method: 'POST',
      credentials: 'same-origin',
      headers: {'Content-Type': 'application/json'},
      body: JSON.stringify(data || {})
    }).then(function(response){
      return response.text().then(function(text){
        try { return JSON.parse(text); }
        catch(e){ return {ok:false, msg:'الرد ليس JSON، ربما انتهت الجلسة أو حدث تحويل إلى صفحة الدخول.', raw:(text || '').slice(0, 220)}; }
      });
    });
  }

  function routerCard(index){
    var n = index + 1;
    var defaultRole = index === 0 ? 'uplink' : (index === 1 ? 'pppoe' : 'monitor');
    function roleOption(value, label){
      return '<option value="' + value + '"' + (defaultRole === value ? ' selected' : '') + '>' + label + '</option>';
    }
    return '<div class="ua-router-card" data-router-idx="' + index + '">'
      + '<div class="ua-router-card__head"><span>Router ' + n + '</span><span>API</span></div>'
      + '<div class="ua-router-card__grid">'
      + '<label>الاسم<input class="cw-r-name" value="Router' + n + '"></label>'
      + '<label>IP / Host<input class="cw-r-host" placeholder="192.168.88.1"></label>'
      + '<label>API Port<input class="cw-r-port" value="8728"></label>'
      + '</div>'
      + '<div class="ua-router-card__grid">'
      + '<label>Username<input class="cw-r-user" placeholder="admin"></label>'
      + '<label>Password<input class="cw-r-pass" type="password" placeholder="••••••"></label>'
      + '<label>الموديل<select class="cw-r-model">' + modelOptions() + '</select></label>'
      + '</div>'
      + '<div class="ua-router-card__grid ua-two">'
      + '<label>الدور<select class="cw-r-role">'
      + roleOption('uplink', 'Uplink Internet')
      + roleOption('pppoe', 'PPPoE / Core')
      + roleOption('monitor', 'Monitoring')
      + roleOption('other', 'Other')
      + '</select></label>'
      + '<div class="ua-router-card__test"><button type="button" class="ua-comms-btn ua-comms-btn--dark cw-test-router"><i class="fa fa-plug"></i><span>Test API</span></button><span class="ua-status-msg cw-test-msg"></span></div>'
      + '</div>'
      + '</div>';
  }

  function sectorCard(index){
    var n = index + 1;
    return '<div class="ua-router-card" data-sector-idx="' + index + '">'
      + '<div class="ua-router-card__head"><span>Sector ' + n + '</span><span>VLAN</span></div>'
      + '<div class="ua-router-card__grid">'
      + '<label>اسم القطاع<input class="cw-s-name" placeholder="Tower1 - SectorA"></label>'
      + '<label>VLAN ID<input class="cw-s-vlan" placeholder="10"></label>'
      + '<label>Trunk<input class="cw-s-trunk" value="ether2"></label>'
      + '</div>'
      + '<div class="ua-router-card__grid ua-two">'
      + '<label>Bridge<input class="cw-s-bridge" value="bridge-pppoe"></label>'
      + '<label>PPPoE Profile اختياري<input class="cw-s-profile" placeholder="default"></label>'
      + '</div>'
      + '</div>';
  }

  function buildRouters(){
    var count = parseInt((byId('cwRouterCount') || {}).value || '2', 10);
    var wrap = byId('cwRoutersWrap');
    if (!wrap) return;
    wrap.innerHTML = '';
    for (var i = 0; i < count; i++) wrap.insertAdjacentHTML('beforeend', routerCard(i));
  }
  function buildSectors(){
    var count = parseInt((byId('cwSectorCount') || {}).value || '2', 10);
    var wrap = byId('cwSectorsWrap');
    if (!wrap) return;
    wrap.innerHTML = '';
    for (var i = 0; i < count; i++) wrap.insertAdjacentHTML('beforeend', sectorCard(i));
  }

  function gather(){
    var routers = qsa('#cwRoutersWrap [data-router-idx]').map(function(card){
      return {
        name: (qs('.cw-r-name', card) || {}).value || '',
        host: (qs('.cw-r-host', card) || {}).value || '',
        api_port: parseInt((qs('.cw-r-port', card) || {}).value || '8728', 10),
        username: (qs('.cw-r-user', card) || {}).value || '',
        password: (qs('.cw-r-pass', card) || {}).value || '',
        model: (qs('.cw-r-model', card) || {}).value || '',
        role: (qs('.cw-r-role', card) || {}).value || ''
      };
    });
    var sectors = qsa('#cwSectorsWrap [data-sector-idx]').map(function(card){
      return {
        name: (qs('.cw-s-name', card) || {}).value || '',
        vlan_id: parseInt((qs('.cw-s-vlan', card) || {}).value || '0', 10),
        trunk_interface: (qs('.cw-s-trunk', card) || {}).value || 'ether2',
        bridge_name: (qs('.cw-s-bridge', card) || {}).value || 'bridge-pppoe',
        pppoe_profile: (qs('.cw-s-profile', card) || {}).value || ''
      };
    });
    return {scenario: (byId('cwScenario') || {}).value || 'standard', routers: routers, sectors: sectors};
  }

  function resultBox(type, html){
    var tone = type === 'bad' ? 'ua-comms-alert--warn' : (type === 'ok' ? 'ua-comms-alert--success' : 'ua-comms-alert--info');
    return '<div class="ua-result-card ' + tone + '">' + html + '</div>';
  }

  function saveAndNext(btn){
    setBusy(btn, true);
    postJson('api/comms_wizard_save.php', gather()).then(function(res){
      setBusy(btn, false);
      if (!res || !res.ok) {
        alert('فشل حفظ الإعدادات: ' + (res && res.msg ? res.msg : ''));
        return;
      }
      showStep(currentStep + 1);
    }).catch(function(){
      setBusy(btn, false);
      alert('خطأ اتصال أثناء الحفظ.');
    });
  }

  function saveAll(btn){
    setBusy(btn, true);
    postJson('api/comms_wizard_save.php', gather()).then(function(res){
      setBusy(btn, false);
      alert(res && res.ok ? 'تم حفظ الإعدادات بنجاح.' : ('فشل الحفظ: ' + (res && res.msg ? res.msg : '')));
      if (res && res.ok) showStep(3);
    }).catch(function(){
      setBusy(btn, false);
      alert('خطأ اتصال أثناء الحفظ.');
    });
  }

  function detectLinks(btn){
    var out = byId('cwDetectResults');
    if (!out) return;
    out.innerHTML = resultBox('info', 'جارٍ كشف الروابط المقترحة...');
    setBusy(btn, true);
    postJson('api/comms_wizard_detect_links.php', gather()).then(function(res){
      setBusy(btn, false);
      if (!res || !res.ok) {
        out.innerHTML = resultBox('bad', esc(res && res.msg ? res.msg : 'فشل كشف الربط.'));
        return;
      }
      var links = res.links || (res.result && res.result.links) || {};
      out.innerHTML = resultBox('ok', '<b>الروابط المكتشفة</b>'
        + '<div>WAN Router1: <b>' + esc(links.wan_uplink || '-') + '</b></div>'
        + '<div>Transit Router1: <b>' + esc(links.transit_uplink || '-') + '</b></div>'
        + '<div>Transit Router2: <b>' + esc(links.transit_pppoe || '-') + '</b></div>'
        + '<div>Trunk Router2: <b>' + esc(links.trunk_pppoe || '-') + '</b></div>');
    }).catch(function(){
      setBusy(btn, false);
      out.innerHTML = resultBox('bad', 'خطأ اتصال أثناء كشف الربط.');
    });
  }

  function runTests(btn){
    var out = byId('cwTestResults');
    if (!out) return;
    out.innerHTML = resultBox('info', 'جارٍ تشغيل الاختبار...');
    setBusy(btn, true);
    postJson('api/comms_wizard_test_all.php', {}).then(function(res){
      setBusy(btn, false);
      if (!res || !res.ok) {
        out.innerHTML = resultBox('bad', esc(res && res.msg ? res.msg : 'فشل الاختبار.'));
        return;
      }
      var rows = (res.items || []).map(function(item, index){
        return '<tr><td>' + (index + 1) + '</td><td>' + esc(item.name || '-') + '</td><td>' + (item.ok ? '✅ OK' : '❌ Fail') + '</td></tr>';
      }).join('');
      out.innerHTML = resultBox('ok', '<b>نتيجة الاختبار</b><table><thead><tr><th>#</th><th>العنصر</th><th>الحالة</th></tr></thead><tbody>' + (rows || '<tr><td colspan="3">لا توجد عناصر.</td></tr>') + '</tbody></table>');
    }).catch(function(){
      setBusy(btn, false);
      out.innerHTML = resultBox('bad', 'خطأ أثناء الاختبار.');
    });
  }

  function applyEnsure(btn){
    var out = byId('cwTestResults');
    if (!out) return;
    out.innerHTML = resultBox('info', 'جارٍ تطبيق Ensure...');
    setBusy(btn, true);
    postJson('api/comms_wizard_apply.php', {
      r1_transit_ip: (byId('cwR1TransitIP') || {}).value || '10.255.255.1/30',
      r2_transit_ip: (byId('cwR2TransitIP') || {}).value || '10.255.255.2/30'
    }).then(function(res){
      setBusy(btn, false);
      if (!res || !res.ok) {
        var msg = (res && (res.error || res.msg || (res.result && (res.result.msg || res.result.error)))) || 'فشل التطبيق.';
        out.innerHTML = resultBox('bad', esc(msg));
        return;
      }
      var html = '<b>تم تنفيذ Ensure</b>';
      var links = res.detect && res.detect.links ? res.detect.links : null;
      if (links) {
        html += '<div class="ua-u-mt-8">WAN: <b>' + esc(links.wan_uplink || '-') + '</b> | Transit R1: <b>' + esc(links.transit_uplink || '-') + '</b> | Transit R2: <b>' + esc(links.transit_pppoe || '-') + '</b> | Trunk: <b>' + esc(links.trunk_pppoe || '-') + '</b></div>';
      }
      if (Array.isArray(res.sectors) && res.sectors.length) {
        html += '<table><thead><tr><th>#</th><th>Sector</th><th>Status</th></tr></thead><tbody>';
        res.sectors.forEach(function(s, index){ html += '<tr><td>' + (index + 1) + '</td><td>' + esc(s.sector_name || s.msg || ('Sector ' + (index + 1))) + '</td><td>' + (s.ok ? '✅ ' : '❌ ') + esc(s.msg || '') + '</td></tr>'; });
        html += '</tbody></table>';
      }
      out.innerHTML = resultBox('ok', html);
    }).catch(function(err){
      setBusy(btn, false);
      out.innerHTML = resultBox('bad', esc(err && err.message ? err.message : 'خطأ أثناء التطبيق.'));
    });
  }

  document.addEventListener('click', function(ev){
    var opener = ev.target.closest('[data-ua-open-modal]');
    if (opener) { ev.preventDefault(); openModal(opener.getAttribute('data-ua-open-modal')); return; }
    if (ev.target.closest('[data-ua-close-modal]')) { ev.preventDefault(); closeModal(); return; }
    var stepBtn = ev.target.closest('#cwSteps [data-step]');
    if (stepBtn) { ev.preventDefault(); showStep(Number(stepBtn.getAttribute('data-step') || 0)); return; }
    var testBtn = ev.target.closest('.cw-test-router');
    if (testBtn) {
      ev.preventDefault();
      var card = testBtn.closest('[data-router-idx]');
      var out = qs('.cw-test-msg', card);
      if (out) { out.textContent = '...'; out.className = 'ua-status-msg cw-test-msg'; }
      postJson('api/comms_wizard_test.php', {
        host: (qs('.cw-r-host', card) || {}).value || '',
        api_port: parseInt((qs('.cw-r-port', card) || {}).value || '8728', 10),
        username: (qs('.cw-r-user', card) || {}).value || '',
        password: (qs('.cw-r-pass', card) || {}).value || ''
      }).then(function(res){
        if (!out) return;
        out.textContent = res && res.ok ? 'OK' : 'Fail';
        out.classList.add(res && res.ok ? 'ok' : 'bad');
      }).catch(function(){ if (out) { out.textContent = 'Error'; out.classList.add('bad'); } });
    }
  });

  document.addEventListener('keydown', function(ev){ if (ev.key === 'Escape') closeModal(); });
  document.addEventListener('DOMContentLoaded', function(){
    buildRouters();
    buildSectors();
    var buildRoutersBtn = byId('cwBuildRouters'); if (buildRoutersBtn) buildRoutersBtn.addEventListener('click', buildRouters);
    var buildSectorsBtn = byId('cwBuildSectors'); if (buildSectorsBtn) buildSectorsBtn.addEventListener('click', buildSectors);
    var prev = byId('cwPrev'); if (prev) prev.addEventListener('click', function(){ showStep(currentStep - 1); });
    var next = byId('cwNext'); if (next) next.addEventListener('click', function(){ saveAndNext(next); });
    var save = byId('cwSaveAll'); if (save) save.addEventListener('click', function(){ saveAll(save); });
    var detect = byId('cwDetectLinks'); if (detect) detect.addEventListener('click', function(){ detectLinks(detect); });
    var run = byId('cwRunTests'); if (run) run.addEventListener('click', function(){ runTests(run); });
    var apply = byId('cwOpenApply'); if (apply) apply.addEventListener('click', function(){ applyEnsure(apply); });
  });
})();
</script>
<?php if(!$embed) require_once __DIR__ . '/footer.php'; ?>
