/**
 * @file
 * Customization of comments.
 */

((Drupal, once) => {
  /**
   * Initialize show/hide button for the comments.
   *
   * @param {Element} comments
   *   The comment wrapper element.
   */
  function init(comments) {
    comments
      .querySelectorAll('[data-drupal-selector="comment"]')
      .forEach((comment) => {
        if (
          comment.nextElementSibling != null &&
          comment.nextElementSibling.matches('.indented')
        ) {
          comment.classList.add('has-children');
        }
      });

    comments.querySelectorAll('.indented').forEach((commentGroup) => {
      const showHideWrapper = document.createElement('div');
      showHideWrapper.setAttribute('class', 'show-hide-wrapper');

      const toggleCommentsBtn = document.createElement('button');
      toggleCommentsBtn.setAttribute('type', 'button');
      toggleCommentsBtn.setAttribute('aria-expanded', 'true');
      toggleCommentsBtn.setAttribute('class', 'show-hide-btn');
      toggleCommentsBtn.innerText = Drupal.t('Replies');

      commentGroup.parentNode.insertBefore(showHideWrapper, commentGroup);
      showHideWrapper.appendChild(toggleCommentsBtn);

      toggleCommentsBtn.addEventListener('click', (e) => {
        commentGroup.classList.toggle('hidden');
        e.currentTarget.setAttribute(
          'aria-expanded',
          commentGroup.classList.contains('hidden') ? 'false' : 'true',
        );
      });
    });
  }

  /**
   * Attaches the comment behavior to comments.
   *
   * @type {Drupal~behavior}
   *
   * @prop {Drupal~behaviorAttach} attach
   *   Attaches the show/hide behavior for indented comments.
   */
  Drupal.behaviors.comments = {
    attach(context) {
      once('comments', '[data-drupal-selector="comments"]', context).forEach(
        init,
      );
    },
  };
})(Drupal, once);