import {ComponentLabels} from '../../site-header/site-header';

export interface MenuLanguage {
  langCode: string;
  url: string;
  abbr: string;
  label: string;
  isActive?: boolean;
  isDisabled?: boolean;
}

import {Component, h, Prop, Host, Watch, Element, Listen, State, Event, EventEmitter} from '@stencil/core';

@Component({
  tag: 'hy-menu-language',
  styleUrl: 'menu-language.scss',
  shadow: true,
})
export class MenuLanguage {
  @Element() el: HTMLElement;
  @Prop() dataMenuLanguage: MenuLanguage[] | string;
  @Prop() isMobile: boolean = false;
  @Prop() labels?: ComponentLabels[] | string;
  @State() isMenuOpen: boolean = false;

  @Event() menuLanguageToggled: EventEmitter;

  private _dataMenuLanguage: MenuLanguage[];
  private _labels: ComponentLabels[];

  @Watch('dataMenuLanguage') dataMenuLanguageWatcher(data: MenuLanguage[] | string) {
    this._dataMenuLanguage = typeof data === 'string' ? JSON.parse(data) : data;
  }

  @Watch('labels') labelsWatcher(data: ComponentLabels[] | string) {
    this._labels = typeof data === 'string' ? JSON.parse(data) : data;
  }

  // Close the language menu if user clicks anywhere outside the Menu language component.
  @Listen('click', {target: 'window'})
  handleOutsideMenuClick(event) {
    this.isMenuOpen = false;
    event.stopPropagation();
  }

  // CLose the language menu if user opens the desktop menu panel.
  @Listen('menuDesktopToggled', {target: 'document'})
  desktopMenuToggled() {
    this.isMenuOpen = false;
  }

  // CLose the language menu if user opens the search panel
  @Listen('searchPanelToggled', {target: 'document'})
  searchPanelToggled() {
    this.isMenuOpen = false;
  }

  @Listen('focus')
  handleComponentFocus(event) {
    // Close desktop menu panel if it's open.
    this.menuLanguageToggled.emit();

    event.stopPropagation();
  }

  @Listen('click')
  handleComponentClick(event) {
    this.isMenuOpen = !this.isMenuOpen;
    const languageMenuSelector = event.target as HTMLElement;

    if (this.isMenuOpen) {
      // Close desktop menu panel if it's open.
      this.menuLanguageToggled.emit();

      let hyHeader = this.el.closest('.hy-site-header') as HTMLElement;
      let rectHeader = hyHeader.getBoundingClientRect();
      let rectLangMenu = languageMenuSelector.getBoundingClientRect();

      const headerHeight = `${languageMenuSelector.offsetHeight + rectHeader.bottom + 8 - rectLangMenu.bottom}px`;
      const languagePanel = languageMenuSelector.shadowRoot.querySelectorAll(
        `.menu--language__dropdown`
      )[0] as HTMLElement;
      languagePanel.style.top = headerHeight;
    }

    event.stopPropagation();
  }

  componentWillRender() {
    this.dataMenuLanguageWatcher(this.dataMenuLanguage);
    this.labelsWatcher(this.labels);
  }

  render() {
    const black = 'var(--brand-main-nearly-black)';

    return this.isMobile ? (
      <Host class={'menu--language'}>
        {this._dataMenuLanguage.map((item) => {
          return (
            <hy-menu-language-item
              lang-code={item.langCode}
              url={item.url}
              label={item.label}
              abbr={item.abbr}
              is-active={item.isActive}
              is-disabled={item.isDisabled}
              is-mobile={this.isMobile}
            />
          );
        })}
      </Host>
    ) : (
      <Host
        class={{
          'menu--language': true,
          'menu--language__is-open': this.isMenuOpen,
        }}
      >
        <button
          class={{
            'menu--language__toggle': true,
            'is-open': this.isMenuOpen,
          }}
          aria-label={this.isMenuOpen ? this._labels['close'] : this._labels['open']}
        >
          <hy-icon class={'menu--language__globe-icon'} icon={'hy-icon-globe'} size={14} fill={black} />
          <span>
            {this._dataMenuLanguage.map((item) => {
              if (item.isActive) {
                return item.langCode;
              }
            })}
          </span>
          <hy-icon class={'menu--language__toggle__caret'} icon={'hy-icon-caret-down'} size={8} fill={black} />
        </button>
        <div
          class={{
            'menu--language__dropdown': true,
            'is-open': this.isMenuOpen,
          }}
        >
          {this._dataMenuLanguage.map((item) => {
            return (
              <hy-menu-language-item
                lang-code={item.langCode}
                url={item.url}
                label={item.label}
                abbr={item.abbr}
                is-active={item.isActive}
                is-disabled={item.isDisabled}
                is-mobile={this.isMobile}
              />
            );
          })}
        </div>
      </Host>
    );
  }
}