(() => {
  'use strict';
  const BREAKPOINT = 512;
  const logo = document.querySelector('.js-headerLogo');
  const form = document.querySelector('.js-searchForm');
  const button = document.querySelector('.js-searchFormSubmit');
  const input = form.querySelector('input');

  renderForm();

  window.addEventListener('resize', renderForm);

  function renderForm() {
    if (window.innerWidth > BREAKPOINT) {
      logo.classList.remove('Header-logo--hidden');
      form.classList.remove('SearchForm--open');
      input.removeEventListener('focus', showSearchBox);
      input.removeEventListener('keypress', handleKeypress);
      input.removeEventListener('focusout', hideSearchBox);
    } else {
      button.addEventListener('click', handleSearchClick);
      input.addEventListener('focus', showSearchBox);
      input.addEventListener('keypress', handleKeypress);
      input.addEventListener('focusout', hideSearchBox);
    }
  }

  /**
   * Submits form if Enter key is pressed
   * @param {KeyboardEvent} e
   */
  function handleKeypress(e) {
    if (e.key === 'Enter') form.submit();
  }

  /**
   * Shows the search box when it receives focus (expands it from
   * just the spyglass if we're on mobile).
   */
  function showSearchBox() {
    logo.classList.add('Header-logo--hidden');
    form.classList.add('SearchForm--open');
  }

  /**
   * Hides the search box (shrinks to just the spyglass icon).
   */
  function hideSearchBox() {
    logo.classList.remove('Header-logo--hidden');
    form.classList.remove('SearchForm--open');
  }

  /**
   * Expands the searchbox so input is visible and gives
   * the input focus.
   * @param {MouseEvent} e
   */
  function handleSearchClick(e) {
    e.preventDefault();

    showSearchBox();
    input.focus();
  }

  /**
   * Focus search input if '/' key is pressed.
   */
  document.addEventListener('keypress', e => {
    const t = e.target
    if (
      !handler.target &&
      (t?.tagName === 'INPUT' || t?.tagName === 'SELECT' || t?.tagName === 'TEXTAREA')
    ) {
      return;
    }
    if (t?.isContentEditable) {
      return;
    }
    if (
      (handler.withMeta && !(e.ctrlKey || e.metaKey)) ||
      (!handler.withMeta && (e.ctrlKey || e.metaKey))
    ) {
      return;
    }
    if (e.key === '/') {
      const searchInput = Array.from(
        document.querySelectorAll('.js-searchForm input')
      ).pop();
      // Favoring the Firefox quick find feature over search input
      // focus. See: https://github.com/golang/go/issues/41093.
      if (searchInput && !window.navigator.userAgent.includes('Firefox')) {
        e.preventDefault();
        searchInput.focus();
      }
    }
  })
})();
