(function () {
  "use strict";

  var defaultPageSizes = ["5", "10", "25", "all"];

  function getSearchTerms(value) {
    return value
      .toLocaleLowerCase()
      .trim()
      .split(/\s+/)
      .filter(Boolean);
  }

  function matchesSearchText(searchText, terms) {
    var normalized = searchText.toLocaleLowerCase();
    return terms.every(function (term) {
      return normalized.includes(term);
    });
  }

  function getFilteredItems(items, terms) {
    return items.filter(function (item) {
      return matchesSearchText(item.dataset.searchText || item.textContent || "", terms);
    });
  }

  function getPaginationState(totalItems, pageSizeValue, currentPage) {
    var showAll = pageSizeValue === "all";
    var pageSize = showAll
      ? Math.max(totalItems, 1)
      : Number.parseInt(pageSizeValue, 10);
    var safePageSize = Number.isFinite(pageSize) && pageSize > 0 ? pageSize : 10;
    var pageCount = Math.max(1, Math.ceil(totalItems / safePageSize));
    var safeCurrentPage = Math.min(Math.max(1, currentPage), pageCount);
    var start = (safeCurrentPage - 1) * safePageSize;

    return {
      showAll: showAll,
      pageSize: safePageSize,
      pageCount: pageCount,
      currentPage: safeCurrentPage,
      start: start,
      end: Math.min(start + safePageSize, totalItems)
    };
  }

  function setSearchQuery(nextUrl, searchInput) {
    var query = searchInput.value.trim();

    if (query) {
      nextUrl.searchParams.set("q", query);
    } else {
      nextUrl.searchParams.delete("q");
    }
  }

  function initPaginatedSearchList() {
    var root = document.querySelector("[data-meeting-archive]");

    if (!root) {
      return;
    }

    var items = Array.from(root.querySelectorAll(".meeting-item"));
    var searchControls = root.querySelector("[data-search-controls]");
    var searchInput = root.querySelector("[data-meeting-search]");
    var clearButton = root.querySelector("[data-search-clear]");
    var noResults = root.querySelector("[data-no-results]");
    var paginationControls = root.querySelector("[data-pagination-controls]");
    var pageSizeSelect = root.querySelector("[data-page-size]");
    var status = root.querySelector("[data-page-status]");
    var previousButton = root.querySelector("[data-page-previous]");
    var nextButton = root.querySelector("[data-page-next]");

    if (
      items.length === 0 ||
      !searchControls ||
      !searchInput ||
      !clearButton ||
      !noResults ||
      !paginationControls ||
      !pageSizeSelect ||
      !status ||
      !previousButton ||
      !nextButton
    ) {
      return;
    }

    var url = new URL(window.location.href);
    var requestedPageSize = url.searchParams.get("perPage");
    searchInput.value = url.searchParams.get("q") || "";

    if (requestedPageSize && defaultPageSizes.includes(requestedPageSize)) {
      pageSizeSelect.value = requestedPageSize;
    }

    var currentPage = Math.max(
      1,
      Number.parseInt(url.searchParams.get("page") || "1", 10) || 1
    );

    function renderPage(updateUrl) {
      var searchTerms = getSearchTerms(searchInput.value);
      var filteredItems = getFilteredItems(items, searchTerms);
      var pagination = getPaginationState(
        filteredItems.length,
        pageSizeSelect.value,
        currentPage
      );
      currentPage = pagination.currentPage;

      var visibleItems = new Set(
        filteredItems.slice(pagination.start, pagination.end)
      );

      items.forEach(function (item) {
        item.hidden = !visibleItems.has(item);
      });

      var label = searchTerms.length > 0 ? "matching meetings" : "meetings";
      status.textContent = filteredItems.length === 0
        ? "No meetings found"
        : pagination.showAll
          ? "Showing all " + filteredItems.length + " " + label
          : "Page " + pagination.currentPage + " of " + pagination.pageCount +
            " · Showing " + (pagination.start + 1) + "–" + pagination.end +
            " of " + filteredItems.length + " " + label;
      previousButton.disabled = pagination.currentPage === 1;
      nextButton.disabled = pagination.currentPage === pagination.pageCount;
      clearButton.hidden = searchTerms.length === 0;
      noResults.hidden = filteredItems.length > 0;

      if (updateUrl) {
        var nextUrl = new URL(window.location.href);
        nextUrl.searchParams.set("perPage", pageSizeSelect.value);
        setSearchQuery(nextUrl, searchInput);

        if (currentPage === 1) {
          nextUrl.searchParams.delete("page");
        } else {
          nextUrl.searchParams.set("page", String(currentPage));
        }

        window.history.replaceState({}, "", nextUrl);
      }
    }

    pageSizeSelect.addEventListener("change", function () {
      currentPage = 1;
      renderPage(true);
    });

    searchInput.addEventListener("input", function () {
      currentPage = 1;
      renderPage(true);
    });

    clearButton.addEventListener("click", function () {
      searchInput.value = "";
      currentPage = 1;
      renderPage(true);
      searchInput.focus();
    });

    previousButton.addEventListener("click", function () {
      currentPage -= 1;
      renderPage(true);
    });

    nextButton.addEventListener("click", function () {
      currentPage += 1;
      renderPage(true);
    });

    searchControls.hidden = false;
    paginationControls.hidden = false;
    renderPage(false);
  }

  function initSectionedSearchList() {
    var root = document.querySelector("[data-meeting-materials]");

    if (!root) {
      return;
    }

    var items = Array.from(root.querySelectorAll("[data-document-row]"));
    var sections = Array.from(root.querySelectorAll("[data-meeting-section]"));
    var controls = root.querySelector("[data-meeting-search-controls]");
    var searchInput = root.querySelector("[data-presentation-search]");
    var clearButton = root.querySelector("[data-meeting-search-clear]");
    var status = root.querySelector("[data-meeting-search-status]");
    var noResults = root.querySelector("[data-meeting-no-results]");

    if (
      items.length === 0 ||
      !controls ||
      !searchInput ||
      !clearButton ||
      !status ||
      !noResults
    ) {
      return;
    }

    searchInput.value = new URL(window.location.href).searchParams.get("q") || "";

    function renderResults(updateUrl) {
      var searchTerms = getSearchTerms(searchInput.value);
      var filteredItems = new Set(getFilteredItems(items, searchTerms));

      items.forEach(function (item) {
        item.hidden = !filteredItems.has(item);
      });

      sections.forEach(function (section) {
        var sectionItems = Array.from(
          section.querySelectorAll("[data-document-row]")
        );
        section.hidden = searchTerms.length > 0 && !sectionItems.some(function (item) {
          return !item.hidden;
        });
      });

      var matchCount = filteredItems.size;
      var itemLabel = items.length === 1 ? "document" : "documents";
      status.textContent = searchTerms.length === 0
        ? items.length + " posted " + itemLabel
        : matchCount + " of " + items.length + " posted " + itemLabel + " matched";
      clearButton.hidden = searchTerms.length === 0;
      noResults.hidden = matchCount > 0;

      if (updateUrl) {
        var nextUrl = new URL(window.location.href);
        setSearchQuery(nextUrl, searchInput);
        window.history.replaceState({}, "", nextUrl);
      }
    }

    searchInput.addEventListener("input", function () {
      renderResults(true);
    });

    clearButton.addEventListener("click", function () {
      searchInput.value = "";
      renderResults(true);
      searchInput.focus();
    });

    controls.hidden = false;
    renderResults(false);
  }

  initPaginatedSearchList();
  initSectionedSearchList();
})();
