/**
 * AJAX list navigation — filtrare/paginare fără refresh complet de pagină.
 *
 * Cum funcționează:
 *  - Interceptează submit-ul formularelor de filtre (marcate cu [data-ajax-filters])
 *    și click-urile pe link-urile de paginare (href care începe cu „?").
 *  - Face fetch la URL-ul nou, extrage <main> din răspuns și înlocuiește DOAR
 *    conținutul din <main>. Restul paginii (sidebar, header) rămâne neatins.
 *  - Alpine.js re-inițializează automat componentele din DOM-ul nou inserat
 *    (MutationObserver), deci tabelul se re-randează cu datele filtrate.
 *  - Actualizează URL-ul (history.pushState) ca să meargă Back/Forward + refresh.
 *
 * Fallback: la orice eroare de fetch/parse se face navigare clasică (full reload),
 * deci comportamentul nu se „strică” niciodată — în cel mai rău caz e ca înainte.
 *
 * Delegarea e pe `document`, ca să supraviețuiască înlocuirilor de innerHTML.
 */
(function () {
  'use strict';

  // Polyfill minimal pentru requestSubmit (browsere vechi): declanșează evenimentul
  // submit (care e prins de delegarea de mai jos) sau, dacă nu e anulat, submit real.
  if (typeof HTMLFormElement !== 'undefined' && !HTMLFormElement.prototype.requestSubmit) {
    HTMLFormElement.prototype.requestSubmit = function () {
      if (this.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }))) {
        this.submit();
      }
    };
  }

  function getMain() { return document.querySelector('main'); }

  // Reține câmpul de filtru focusat (ex: search) + poziția cursorului, ca să-l
  // putem restaura după ce înlocuim conținutul (altfel utilizatorul „iese" din
  // câmp la fiecare literă scrisă).
  function captureFocus() {
    var el = document.activeElement;
    if (!el || !el.name || !el.closest || !el.closest('[data-ajax-filters]')) return null;
    var tag = el.tagName.toLowerCase();
    if (tag !== 'input' && tag !== 'textarea') return null;
    var info = { name: el.name };
    try { info.selStart = el.selectionStart; info.selEnd = el.selectionEnd; } catch (e) {}
    return info;
  }

  function restoreFocus(info) {
    if (!info) return false;
    var nameSel = (window.CSS && CSS.escape) ? CSS.escape(info.name) : info.name;
    var el = document.querySelector('[data-ajax-filters] [name="' + nameSel + '"]');
    if (!el) return false;
    el.focus({ preventScroll: true });
    try {
      var len = el.value.length;
      var s = info.selStart != null ? Math.min(info.selStart, len) : len;
      var e = info.selEnd != null ? Math.min(info.selEnd, len) : s;
      el.setSelectionRange(s, e);
    } catch (e2) {}
    return true;
  }

  function setLoading(on) {
    var m = getMain();
    if (!m) return;
    m.style.transition = 'opacity .12s ease';
    m.style.opacity = on ? '0.55' : '';
    m.style.pointerEvents = on ? 'none' : '';
  }

  async function ajaxNav(url, push) {
    var main = getMain();
    if (!main || !window.history || !window.DOMParser) { window.location = url; return; }
    var focusInfo = captureFocus(); // reține search-ul focusat înainte de swap
    setLoading(true);
    try {
      var r = await fetch(url, {
        headers: { 'X-Requested-With': 'XMLHttpRequest' },
        credentials: 'same-origin'
      });
      if (!r.ok) throw new Error('HTTP ' + r.status);
      var html = await r.text();
      var doc = new DOMParser().parseFromString(html, 'text/html');
      var newMain = doc.querySelector('main');
      if (!newMain) throw new Error('main lipsă în răspuns');
      main.innerHTML = newMain.innerHTML;
      if (push !== false) history.pushState({ ajaxList: true }, '', url);
      // Restaurează focusul pe câmpul de filtru (search). Dacă nu era niciun câmp
      // focusat (ex: paginare, schimbare select), derulează sus.
      if (!restoreFocus(focusInfo)) {
        window.scrollTo({ top: 0, behavior: 'auto' });
      }
    } catch (e) {
      window.location = url; // fallback sigur: navigare clasică
      return;
    } finally {
      setLoading(false);
    }
  }
  window.ajaxNav = ajaxNav;

  // Construiește URL-ul (?key=val) dintr-un formular GET, ignorând valorile goale.
  function filterFormUrl(form) {
    var params = new URLSearchParams();
    new FormData(form).forEach(function (v, k) {
      if (v !== '' && v != null) params.append(k, v);
    });
    params.delete('page'); // orice schimbare de filtru resetează la pagina 1
    var qs = params.toString();
    return location.pathname + (qs ? '?' + qs : '');
  }

  // Submit pe formularele de filtre → AJAX
  document.addEventListener('submit', function (e) {
    var form = e.target;
    if (form && form.matches && form.matches('[data-ajax-filters]')) {
      e.preventDefault();
      ajaxNav(filterFormUrl(form));
    }
  });

  // Click pe link de paginare (href începe cu „?") din interiorul <main> → AJAX
  document.addEventListener('click', function (e) {
    if (e.defaultPrevented || e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;
    var a = e.target.closest ? e.target.closest('a[href]') : null;
    var main = getMain();
    if (!a || !main || !main.contains(a)) return;
    var href = a.getAttribute('href');
    if (a.hasAttribute('data-ajax') || (href && href.charAt(0) === '?')) {
      e.preventDefault();
      ajaxNav(location.pathname + href);
    }
  });

  // Back / Forward din browser
  window.addEventListener('popstate', function () {
    if (document.querySelector('[data-ajax-filters]')) {
      ajaxNav(location.href, false);
    }
  });
})();
