const $ = require('jquery');
import {StudioPreviewUtil} from "../utils/StudioPreviewUtil";
import IHK from '../ihk';
import 'jquery.easing';


class Header {
  constructor(header) {
    this.header = header.addClass('initiated');
    this.window = $(window);
    this.body = $('body');
    this.overlayOpen = false;
    this.showOpenedNav = this.header.find('.primary').data("show-opened-menu");
    const t =  this;

    this.initLogo();
    this.initTopLink();
    this.initScroll();
    this.initSearch();
    this.initPrimaryNav();
    this.initSecondaryNav();
    this.initToggling();
    this.initLanguage();

    if(this.showOpenedNav){
      t.header.find('.toggle-nav').click();
    }

    this.body.on('open-navigation', function (event, data) {
      if (data.openMenu) {
        t.header.find('.toggle-nav').click();
      }
      t.initPrimaryNav(data.rootUrl);
    });
  }

  initLogo() {
    const t = this;
    const logo = t.header.find('.logo');
    const img = logo.find('img');
    const overlay = $('<span class="logo-overlay" />').appendTo(logo);
    const browser = IHK.getBrowser();
    t.resizeTimeout = 0;

    t.window.on('resize load', function () {
      if (img.height() < 44) {
        overlay.css('left', img.height() * 2.1);
      }
    })

    if (browser.name === 'ie') {
      img.attr('src', img.attr('src').split('svg').join('png'));
    }
  };

  initTopLink() {
    const t = this;
    const toplink = $('<a href="#" class="toplink" tabindex="-1" />').text('Top').prependTo(t.header);

    toplink.on('click', function (e) {
      e.preventDefault();
      $('html, body').animate({'scrollTop': 0}, Math.round($(window).scrollTop() / 12 + 300), 'easeOutQuad');
    })
  }

  initSearch() {
    const t = this;
    const formNav = $('<div class="form-nav" />').appendTo(t.header.find('.search form'));

    t.header.find('nav .secondary').clone().appendTo(formNav);
    t.header.find('nav .meta').clone().appendTo(formNav);

    t.header.find('.open-search, .close-search').on('click', function (e) {
      t.header.toggleClass('search-open').removeClass('nav-open');
      if (t.header.hasClass('search-open')) {
        setTimeout(function () {
          t.header.find('.search-field').focus();
        }, 200)
      }
      t.toggleContentScroll();
    })
  };

  initScroll() {
    const t = this;

    window.addEventListener("scroll", function () {
      window.requestAnimationFrame(function () {
        t.checkScroll();
      })
    }, {passive: true});
  };

  checkScroll() {
    const t = this;
    const st = t.window.scrollTop();

    if (t.overlayOpen || $('.gallery-popup.open').length) {
      return false;
    }

    if (st > 59) {
      t.header.addClass('scrolled');
    } else {
      t.header.removeClass('scrolled');
    }

    if (st > t.window.height() * 1.2) {
      t.header.addClass('show-toplink');
    }
    else {
      t.header.removeClass('show-toplink');
    }
  }

  initToggling() {
    this.header.find('.overlay-holder').on('click touch', this.toggleNavigation.bind(this));
    this.header.find('.toggle-nav').on('click touch', this.toggleNavigation.bind(this));
  };

  toggleNavigation() {
    const t = this;
    if (StudioPreviewUtil.isStudioPreview()) {
      $("html").stop().animate({'scrollTop': 0}, 300, 'swing', function () {
        t.header.toggleClass('nav-open');
        t.toggleContentScroll();
      });
    } else {
      t.header.toggleClass('nav-open');
      t.toggleContentScroll();
    }
  };

  initPrimaryNav(optionalRootUrl) {
    const t = this;
    const primary = t.header.find('.primary');

    $(primary).empty()
    t.baseUrl = primary.attr('data-base-url');
    t.rootUrl = primary.attr('data-root-url');

    if (optionalRootUrl) {
      t.rootUrl = optionalRootUrl;
      primary.off('click', 'a');
    }

    primary.append($('<ul class="current" />').attr('data-json', t.baseUrl + t.rootUrl));

    primary.on('click', 'a', function (e) {
      const a = $(this);
      const li = a.parent();
      const ul = li.parent('ul');

      if (li.hasClass('deep')) {
        e.preventDefault();

        if (a.siblings('ul').length) {
          ul.removeClass('current');
          t.toTop(ul);
          a.siblings('ul').addClass('current');
          li.addClass('open');
          t.manageTabIndex();
        } else {
          const deepUl = $('<ul />').attr('data-json', a.attr('href')).appendTo(li);
          t.loadNav(deepUl);
        }
      } else if (li.hasClass('back')) {
        e.preventDefault();
        t.toTop(ul);

        if (ul.closest('li').length) {
          ul.removeClass('current')
            .closest('li').removeClass('open')
            .parent('ul').addClass('current');
          t.manageTabIndex();
        } else {
          const backUl = $('<ul />').attr('data-json', a.attr('href')).insertBefore(ul);
          t.loadNav(backUl);
        }
      }
    });

    t.loadNav(t.header.find('.primary ul'));
  }

  initSecondaryNav() {
    // secondary-nav-item
    const t = this;
    const $secondary = t.header.find("nav").find(".secondary");
    const $secondaryItems = $secondary.find(".secondary-nav-item");
    $.each($secondaryItems, function (index,element) {
      $(element).on("click", function (e) {
        if($(element).data("is-channel")){
          e.preventDefault();
          const elementRootUrl= $(this).data("root-url");
          t.initPrimaryNav(elementRootUrl);
        } else {
          return true;
        }
      });
    });
  }

  loadNav(ul) {
    const t = this;
    const currentPageId = t.header.find('.primary').data("page-content-id");

    if (ul.parent('li').length) {
      ul.addClass('current');
      setTimeout(function () {
        const parentUl = ul.addClass('loading').parent('li').addClass('open')
          .closest('.current').removeClass('current');
        t.toTop(parentUl);
      }, 20)
    }

    $.ajax({
      url: ul.attr('data-json'),
      type: "GET",
      dataType: "json",
      xhrFields: {withCredentials: true}
    }).done(function (data) {
      ul.attr('data-cm-metadata', '[{"_":{"$Ref":"content/' + data.tocListId + '"}}]');
      if (data.parentId) {
        $('<li class="back" />').appendTo(ul)
          .append($('<a />').attr('href', t.baseUrl + data.parentId).text(data.title));
      }
      if(!data.hideOverview) {
        if (data.showOverview) {
          const overviewElement = $('<li class="overview" />');
          overviewElement.appendTo(ul)
            .append($('<a />').attr('href', data.url).text(window.ihk.translations.overview));

          if (data.contentId === currentPageId.toString()) {
            overviewElement.find("a").addClass("active");
          }
        }
      }
      const parentElement = data;
      $.each(data.items, function () {
        let li = $('<li />').attr('data-id', this.contentId).attr('data-cm-metadata', '[{"_":{"$Ref":"content/' + this.contentId + '"}}]').appendTo(ul),
          a = $('<a />').html(this.title).appendTo(li);

        switch (this.type) {
          case "CMChannel" :
            li.addClass('deep');
            a.attr('href', t.baseUrl + this.contentId);
            break;
          case "CMArticle" :
            li.addClass('link');
            a.attr('href', this.url);
            break;
          default :
            li.addClass('miscellaneous');
            li.attr('data-type', this.type);
            a.attr('href', this.url);
        }

        if (this.linktype == 'external') {
          li.addClass('external');
          $(li).find("a").attr("target","_blank")
        }

        if (this.viewType === 'onlinemagazinstart') {
          // todo als link
          li.removeClass('deep');
          li.addClass('magazine-nav');
          $(li).find("a").attr("href",this.url);
          if (this.titleImage) {
            a.text('').append($('<img src="' + this.titleImage + '" alt="' + this.title + '" />'))
          }
        }
        if (this.viewType === 'themenseite' && !parentElement.root) {
          li.addClass('overview');
          li.removeClass('deep');
          a.attr('href', this.url);
        }

        if (this.trackCode && this.trackCode.length > 0) {
          $(li).find("a").attr("onmousedown", this.trackCode);
        }

        if (this.restrictedTo && this.restrictedTo.indexOf('extranet') > -1) {
          li.addClass('extranet');
        } else if (this.restrictedTo && this.restrictedTo.indexOf('intranet') > -1) {
          li.addClass('intranet');
        }

        if (this.doctype &&
          (this.doctype.indexOf('Datei') > -1 || this.doctype.indexOf('PDF') > -1 || this.doctype.indexOf('PIC') > -1)) {
          li.addClass('download');
        }

        if(this.contentId === currentPageId.toString()){
          $(li).find("a").addClass("active");
        }
      });

      ul.addClass('current').attr('data-id', data.contentId);

      if (ul.parent('li').length) {
        setTimeout(function () {
          const parentUl = ul.removeClass('loading').parent('li').addClass('open')
            .closest('.current').removeClass('current');
          t.toTop(parentUl);
          t.manageTabIndex();
        }, 20)
      } else if (ul.next('ul').length) {
        const innerUl = ul.next('ul');
        let wrapperLi = ul.find('li[data-id="' + innerUl.attr('data-id') + '"]').addClass('open');

        if (!wrapperLi.length) {
          wrapperLi = $('<li />').addClass('open').appendTo(ul);
        }

        wrapperLi.append(innerUl);

        setTimeout(function () {
          innerUl.removeClass('current');
          wrapperLi.removeClass('open');
          t.manageTabIndex();
        }, 20)
      }
    })
  }

  toggleContentScroll() {
    const t = this;

    if (t.header.hasClass('nav-open') || t.header.hasClass('search-open')) {
      t.overlayOpen = true;
      this.body.trigger('overlay-open');
      t.body.css('top', (t.window.scrollTop() * -1) + 'px').addClass('nav-open');
      if (t.header.hasClass('search-open')) {
        t.body.addClass('search-open');
      }
    } else {
      t.overlayOpen = false;
      this.body.trigger('overlay-close');
      const top = Math.abs(parseInt(t.body.css('top')));
      t.body.removeClass('nav-open').removeClass('search-open').removeAttr('style');
      t.window.scrollTop(top);
    }
  }

  initLanguage() {
    const lang = this.header.find('.language');

    lang.find('button').on('click', function (e) {
      lang.toggleClass('open');
    })

    lang.on('click', function (e) {
      e.stopPropagation();
    })

    this.body.on('click', function () {
      lang.removeClass('open');
    })

    lang.siblings().find('a').on('focus', function () {
      lang.removeClass('open');
    })
  }

  manageTabIndex() {
    this.header.find('.primary a').attr('tabindex', '-1');
    this.header.find('.primary .current > li > a').removeAttr('tabindex');
  }

  toTop(ul) {
    if (ul.scrollTop() > 0) {
      ul.animate({'scrollTop': 0}, 300, 'swing');
    }
  }
}

$('body').on('ihk-init', function () {
  $('.page-header:not(.initiated)').each(function (i) {
    new Header($('.page-header'));
  });

});
