import { Sidebar } from './js/sidebar';
import './scss/app.scss'

document.addEventListener('DOMContentLoaded', function() {
  initSearch();
  initSidebar();
  initToggle();
});

function initToggle() {
  // get filter btns & set object sessionStorage
  const btns = <NodeListOf<HTMLButtonElement>>document.querySelectorAll('.filter-trips-js');
  let filterObject = new Map();

  if(btns) {
    Array.prototype.forEach.call(btns, (btn: HTMLButtonElement) => {
      filterObject.set(btn.dataset.action, btn.ariaPressed);
     
      btn.addEventListener('click', () => {
        let filter = sessionStorage.getItem('tripsFilter');
        if(filter) {
          let filterMap = new Map(JSON.parse(filter));
          for (let entry of filterMap.entries()) {
            if(entry[0] === btn.dataset.action && entry[1] !== 'true') {
              filterMap.set(entry[0],'true');
            } else {
              filterMap.set(entry[0],'false');
            }
          }
          sessionStorage.setItem('tripsFilter', JSON.stringify( Array.from(filterMap.entries())));
        }
        resetFilteredElements();
        if(btn.getAttribute('aria-pressed') === 'false'){
          Array.prototype.forEach.call(btns, (b: HTMLButtonElement) => {
            b.setAttribute('aria-pressed', 'false'); 
          });
          triggerFilterAction(btn.dataset.action);
        } else {
          btn.setAttribute('aria-pressed', 'false'); 
        }
      });
    }); 
  }

  let filter = sessionStorage.getItem('tripsFilter');
  if(filter) {
    let filterMap = new Map(JSON.parse(filter));
    for (let entry of filterMap.entries()) {
      if(entry[1] === 'true') {
        triggerFilterAction(entry[0]);
      }
    }
  } else {
    sessionStorage.setItem('tripsFilter', JSON.stringify( Array.from(filterObject.entries())));
  }
}

function resetFilteredElements() {
  const hiddenElements = document.querySelectorAll('.reset-js.hidden');
  if(hiddenElements) {
    Array.prototype.forEach.call(hiddenElements, (hiddenElement: HTMLButtonElement) => {
      hiddenElement.classList.remove('hidden');
    });
  }
}

function triggerFilterAction(activeFilter: any) {
  const activeBtn = document.querySelector('button[data-action="' + activeFilter + '"]');
  if(activeBtn) {
    activeBtn.setAttribute('aria-pressed', 'true'); 

    filterAction(activeFilter);
  } 
}

function filterAction(activeFilter: string) {
  switch(activeFilter) {
    case 'filter-days': {
      filterDays();
      break;
    }
    case 'filter-coxs': {
      filterCoxs();
      break;
    }
    case 'filter-months': {
      filterMonths(activeFilter)
      break;
    }
  }
}

function filterDays() {
  const daysNoTrips = document.querySelectorAll('div[data-trips="0"]');
  Array.prototype.forEach.call(daysNoTrips, (day: HTMLElement) => {
    day.classList.toggle('hidden');
  });
}

function filterCoxs() {
  const noCoxNeeded = document.querySelectorAll('div[data-coxneeded="false"]');
  Array.prototype.forEach.call(noCoxNeeded, (notNeeded: HTMLElement) => {
    notNeeded.classList.toggle('hidden');
  });
}

function filterMonths(action: string) {
  const months = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'];
  const monthToggle = <HTMLButtonElement>document.querySelector('button[data-action="' + action + '"]');
  if(monthToggle) {
      const currentMonth = monthToggle.dataset.month;
      
      if(currentMonth) {
        const index = months.indexOf(currentMonth);
        if (index > -1) { // only splice array when item is found
          months.splice(index, 1); // 2nd parameter means remove one item only
        }

        Array.prototype.forEach.call(months, (month: HTMLElement) => {
          const notThisMonth = document.querySelectorAll('div[data-month="' + month + '"]');
          Array.prototype.forEach.call(notThisMonth, (notThisMonth: HTMLElement) => {
            notThisMonth.classList.toggle('hidden');
          });
        });
      }
    }
  }

function initSearch() {
  const input = <HTMLInputElement>document.querySelector('#filter-js');

  if(input) {
    filterElements(input.value);

    input.addEventListener('input', () => {
      filterElements(input.value);
    });
  }
}

function filterElements(input: string) {
  const elements = document.querySelectorAll('form[data-filterable="true"]');
  let resultWrapper = <HTMLElement>document.querySelector('#filter-result-js'),
      amountShownElements = 0;

  Array.prototype.forEach.call(elements, (element: HTMLElement) => {
    // set both strings (input & dataset filter) to lowercase to not be case sensitive
    let filterString = element.dataset.filter?.toLocaleLowerCase();
    
    // bulk hide all elements
    element.style.display = 'none';

    // show if input matches
    if(filterString?.includes(input.toLocaleLowerCase())) {
      element.style.display = 'flex';
      amountShownElements ++;
    }
  });

  if(resultWrapper) {
    resultWrapper.innerHTML = (amountShownElements === 0 ? 'Kein Ergebnis gefunden' : '<strong>' + amountShownElements + '</strong>' + (amountShownElements > 1 ? ' Ergebnisse' : ' Ergebnis') + ' gefunden');
  }
}

function initSidebar() {
  const sidebarTrigger = <NodeListOf<HTMLElement>>document.querySelectorAll('[data-trigger]');

  if(sidebarTrigger) {
    Array.prototype.forEach.call(sidebarTrigger, (triggerElement: HTMLElement) => {
      if(triggerElement.dataset.trigger) {
        const sidebar = new Sidebar(triggerElement.dataset.trigger);

        triggerElement.addEventListener('click', (e) => {
          e.preventDefault();
          if(triggerElement.dataset.trigger === 'sidebar') {
            initTripSidebar(triggerElement);
          }  

          sidebar.toggle();
        });
      }
    });
  }
}

function initTripSidebar(triggerElement: HTMLElement) {
  const sidebarElement = <HTMLElement>document.querySelector('#sidebar');
  if(sidebarElement && triggerElement.dataset.body && triggerElement.dataset.header) {
    let body = <HTMLElement>document.querySelector(triggerElement.dataset.body);
    let bodyElement = <HTMLElement>body.cloneNode(true);
    let bodyContainerElement = <HTMLElement>sidebarElement.querySelector('.body-js');
    
    /* Quickfix duplicate ids checkboxes */
    const checkboxes = <NodeListOf<HTMLElement>>bodyElement.querySelectorAll('input[type="checkbox"]');

    Array.prototype.forEach.call(checkboxes, (checkbox: HTMLElement) => {
      if(checkbox) {
        checkbox.parentElement?.setAttribute('for', checkbox.id + 'js');
        checkbox.id += 'js';
      }
    });

    if(bodyContainerElement) {
      bodyContainerElement.innerHTML = '';
      bodyContainerElement.append(bodyElement);
    }
    if(triggerElement.dataset.day) {
      let hiddenElement = <HTMLInputElement>bodyElement.querySelector('.day-js');
      if(hiddenElement) {
        hiddenElement.value = triggerElement.dataset.day;
      }
    }

    let headerElement = sidebarElement.querySelector('.header-js');
    if(headerElement) {
      headerElement.innerHTML = triggerElement.dataset.header;
    }
  }
}