<script>
(function () {
  var navData = <?= $govNavJson ?? '[]' ?>;
  var activeIdx = <?= (int) ($govActiveParentIdx ?? 0) ?>;
  var activeChildHref = <?= json_encode(strtolower(ltrim((string) ($govActiveChildHref ?? ''), '/')), JSON_UNESCAPED_UNICODE) ?>;
  var listEl = document.getElementById('portalSidebarList');
  var titleEl = document.getElementById('portalSidebarTitle');

  if (listEl && navData.length) {
    function renderSidebar(idx, overrideHref) {
      var parent = navData[idx];
      if (!parent) return;
      if (titleEl) titleEl.textContent = parent.name || 'MY MENU';
      listEl.innerHTML = '';
      var items = parent.children && parent.children.length ? parent.children : null;
      if (!items && parent.href) {
        items = [{ name: parent.name, url: parent.url, href: parent.href }];
      }
      if (!items || !items.length) {
        var empty = document.createElement('li');
        empty.innerHTML = '<span class="menu-sub" style="opacity:.65;">하위 메뉴 없음</span>';
        listEl.appendChild(empty);
        return;
      }
      // overrideHref 가 빈 문자열이면 "이 그룹에 일치 항목 없음" → 첫 항목 강조하지 않음
      var hasOverride = (typeof overrideHref === 'string');
      var activeHref = hasOverride ? overrideHref : activeChildHref;
      items.forEach(function (child, ci) {
        var li = document.createElement('li');
        var chHref = (child.href || '').toLowerCase().replace(/^\//, '');
        var on = activeHref ? (chHref === activeHref) : (hasOverride ? false : ci === 0);
        if (child.href) {
          li.innerHTML = '<a href="' + child.url + '" class="' + (on ? 'active' : '') + '">' + child.name + '</a>';
        } else {
          li.innerHTML = '<span class="menu-sub" style="opacity:.65;">' + child.name + '</span>';
        }
        listEl.appendChild(li);
      });
    }

    function setActiveTrigger(idx) {
      document.querySelectorAll('.portal-nav-trigger, .portal-nav-link[data-parent-idx]').forEach(function (el) {
        var n = parseInt(el.getAttribute('data-parent-idx'), 10);
        var on = n === idx;
        el.classList.toggle('is-active', on);
        if (el.classList.contains('portal-nav-trigger')) {
          el.setAttribute('aria-expanded', on ? 'true' : 'false');
        }
      });
    }

    document.querySelectorAll('.portal-nav-trigger[data-parent-idx]').forEach(function (btn) {
      btn.addEventListener('click', function (e) {
        e.preventDefault();
        var idx = parseInt(btn.getAttribute('data-parent-idx'), 10);
        setActiveTrigger(idx);
        renderSidebar(idx);
      });
    });

    setActiveTrigger(activeIdx);
    renderSidebar(activeIdx);

    // 워크스페이스 등 외부에서 "현재 보는 화면(URL)"에 맞춰 사이드바를 동기화하기 위한 공개 API
    function pathOf(u) {
      try { var a = new URL(u, location.origin); return (a.pathname + a.search).toLowerCase(); }
      catch (e) { return (u || '').toLowerCase(); }
    }
    function pathOnly(u) {
      try { return new URL(u, location.origin).pathname.toLowerCase().replace(/\/$/, ''); }
      catch (e) { return (u || '').toLowerCase(); }
    }
    // 현재 사이드바의 모든 소메뉴에서 강조(active)를 해제 — 메뉴에 없는 화면(대시보드 등)에서 사용
    function clearSidebarActive() {
      listEl.querySelectorAll('a').forEach(function (a) {
        a.classList.remove('active');
      });
    }
    window.govPortalNav = {
      // URL 로 소속 대메뉴/소메뉴를 찾아 사이드바 강조를 갱신. 일치 없으면(대시보드 등) 강조 해제.
      syncByUrl: function (url) {
        var target = pathOf(url), targetPath = pathOnly(url), fb = null;
        for (var p = 0; p < navData.length; p++) {
          var par = navData[p];
          var kids = (par.children && par.children.length) ? par.children : (par.href ? [par] : []);
          for (var i = 0; i < kids.length; i++) {
            if (!kids[i].url) continue;
            if (pathOf(kids[i].url) === target) { // 정확 일치(경로+쿼리)
              setActiveTrigger(p);
              renderSidebar(p, (kids[i].href || '').toLowerCase().replace(/^\//, ''));
              return true;
            }
            if (!fb && pathOnly(kids[i].url) === targetPath) { // 경로만 일치(쿼리 무시) 폴백
              fb = { p: p, href: (kids[i].href || '').toLowerCase().replace(/^\//, '') };
            }
          }
        }
        if (fb) {
          setActiveTrigger(fb.p);
          renderSidebar(fb.p, fb.href);
          return true;
        }
        // 어느 메뉴와도 일치하지 않으면(예: 업무 현황 대시보드) 화살표 강조 해제
        clearSidebarActive();
        return false;
      }
    };
  }

  var searchInput = document.getElementById('menuSearch') || document.getElementById('menuSearchStrip');

  function runMenuSearch(q) {
    if (!q || !navData.length) return false;
    q = q.toLowerCase();
    for (var p = 0; p < navData.length; p++) {
      var par = navData[p];
      if ((par.name || '').toLowerCase().indexOf(q) !== -1) {
        if (listEl) {
          document.querySelectorAll('.portal-nav-trigger[data-parent-idx]').forEach(function (btn) {
            if (parseInt(btn.getAttribute('data-parent-idx'), 10) === p) btn.click();
          });
        }
        return true;
      }
      var ch = par.children || [];
      for (var i = 0; i < ch.length; i++) {
        if ((ch[i].name || '').toLowerCase().indexOf(q) !== -1 && ch[i].url) {
          window.location.href = ch[i].url;
          return true;
        }
      }
    }
    return false;
  }

  if (searchInput && navData.length) {
    searchInput.addEventListener('keydown', function (e) {
      if (e.key !== 'Enter') return;
      var q = (searchInput.value || '').trim();
      if (!q) return;
      if (!runMenuSearch(q)) {
        alert('일치하는 메뉴가 없습니다.');
      }
    });
  }

  document.querySelectorAll('.menu-search-chip').forEach(function (chip) {
    chip.addEventListener('click', function (e) {
      e.preventDefault();
      var url = chip.getAttribute('data-url') || '';
      var kw = chip.getAttribute('data-keyword') || '';
      if (url) {
        window.location.href = url;
        return;
      }
      if (searchInput && kw) {
        searchInput.value = kw;
        if (!runMenuSearch(kw)) {
          alert('일치하는 메뉴가 없습니다.');
        }
      }
    });
  });
})();
</script>
