/**
 * div
 *   div.js-show-hide__toggle
 *     toggle here
 *   div
 *     content here
 */

document.addEventListener('setup', function(e) {
  if (e.detail.module && e.detail.module !== 'showHide')
    return;

  var LSNAME = 'SHOW_HIDE';

  function addEventHandler(el) {
    el.addEventListener('click', function elClickListener() {
      var newState = el.parentElement.classList.toggle('js-show-hide--collapsed');
      updateLSState(el.dataset.shIndex || null, newState);
    });
  }

  function updateLSState(index, state) {
    if (!index) {
      return false;
    }
    var lsData = fromLocalStorage();
    lsData[index] = state;
    window.localStorage.setItem(LSNAME, JSON.stringify(lsData));
  }

  function collapsedStateInLocalStorage(index) {
    return fromLocalStorage()[index] || null;
  }

  function fromLocalStorage() {
    return JSON.parse(window.localStorage.getItem(LSNAME)) || {};
  }

  Array
    .from(e.detail.scope.querySelectorAll('.js-show-hide__toggle'))
    .forEach(function(el) {
      var index = el.dataset.shIndex || null;
      el.parentElement.classList.toggle(
        'js-show-hide--collapsed',
        collapsedStateInLocalStorage(index) || el.dataset.collapsed === 'true'
      );
      Array.from(el.parentElement.children).forEach(function(el) {
        if (!el.classList.contains('js-show-hide__toggle')) {
          el.classList.add('js-show-hide__target');
        }
      });
      addEventHandler(el);
  });
});

document.addEventListener('DOMContentLoaded', function() {
  document.dispatchEvent(new CustomEvent('setup', { detail: { scope: document.body, module: 'showHide' }, bubbles: true, cancelable: true }))
});
