import {vlElement, define} from '/node_modules/vl-ui-core/dist/vl-core.js';
import '/node_modules/@govflanders/vl-ui-util/dist/js/util.js';
import '/node_modules/@govflanders/vl-ui-accordion/dist/js/accordion.js';

/**
 * VlInfoTile
 * @class
 * @classdesc
 *
 * @extends HTMLElement
 * @mixes vlElement
 *
 * @property {boolean} data-vl-auto-open - Attribuut wordt gebruikt om de info tile bij rendering meteen te openen.
 * @property {boolean} data-vl-toggleable - Attribuut wordt gebruikt om mogelijk te maken dat de info tile geopend en gesloten kan worden.
 *
 * @see {@link https://www.github.com/milieuinfo/webcomponent-vl-ui-info-tile/releases/latest|Release notes}
 * @see {@link https://www.github.com/milieuinfo/webcomponent-vl-ui-info-tile/issues|Issues}
 * @see {@link https://webcomponenten.omgeving.vlaanderen.be/demo/vl-info-tile.html|Demo}
 *
 */
export class VlInfoTile extends vlElement(HTMLElement) {
  static get _observedAttributes() {
    return ['auto-open', 'toggleable'];
  }

  constructor() {
    super(`
      <style>
        @import '/src/style.css';
      </style>
      <div class="vl-info-tile">
        <header class="vl-info-tile__header" role="presentation">
          <div id="wrapper" class="vl-info-tile__header__wrapper">
            <h3 id="title" class="vl-info-tile__header__title">
              <slot name="title"></slot><slot name="title-label"></slot>
            </h3>
            <p class="vl-info-tile__header__subtitle">
              <slot name="subtitle"></slot>
            </p>
          </div>
        </header>

        <div class="vl-info-tile__content">
          <slot name="content"></slot>
        </div>

        <footer class="vl-info-tile__footer">
          <slot name="footer"></slot>
        </footer>
      </div>
    `);
  }

  connectedCallback() {
    this.__processAutoOpen();
    this.__processSlots();
  }

  /**
   * Geeft terug of de info-tile togglebaar is.
   * @return {boolean}
   */
  get isToggleable() {
    return this.getAttribute('toggleable') != undefined;
  }

  /**
   * Geeft terug of de info-tile geopend is.
   * @return {boolean}
   */
  get isOpen() {
    if (this.isToggleable) {
      return this._element.classList.contains('js-vl-accordion--open');
    } else {
      return true;
    }
  }

  get _headerWrapperElement() {
    return this._element.querySelector('#wrapper');
  }

  get _titleElement() {
    return this._headerWrapperElement.querySelector('#title');
  }

  get _titleLabelSlot() {
    return this.querySelector('[slot=\'title-label\']');
  }

  get _titleLabelSlotElement() {
    return this._titleElement.querySelector('[name="title-label"]');
  }

  get _buttonElement() {
    return this._element.querySelector('button');
  }

  /**
   * Toggle de info-tile om deze te openen of sluiten.
   */
  toggle() {
    this._toggleElement.click();
  }

  /**
   * Open de info-tile als deze nog niet geopend werd.
   */
  open() {
    if (!this.isOpen) {
      this.toggle();
    }
  }

  /**
   * Sluit de info-tile als deze nog niet gesloten werd.
   */
  close() {
    if (this.isOpen) {
      this.toggle();
    }
  }

  get _toggleElement() {
    return this._shadow.querySelector('.js-vl-accordion__toggle');
  }

  get _subtitleElement() {
    return this._shadow.querySelector('slot[name="subtitle"]');
  }

  get _contentElement() {
    return this._shadow.querySelector('slot[name="content"]');
  }

  _toggleableChangedCallback(oldValue, newValue) {
    if (newValue != undefined) {
      this.__prepareAccordionElements();
      vl.accordion.dress(this._buttonElement);
      this.__preventContentClickPropagation();
    }
  }

  __prepareAccordionElements() {
    this._element.classList.add('js-vl-accordion');
    const button = this._template(`
      <button class="vl-toggle vl-link vl-link--bold js-vl-accordion__toggle">
        <i class="vl-link__icon vl-link__icon--before vl-toggle__icon vl-vi vl-vi-arrow-right-fat" aria-hidden="true"></i>
      </button>
    `).firstElementChild;
    button.appendChild(this._titleElement);
    this._headerWrapperElement.prepend(button);
  }

  __preventContentClickPropagation() {
    this._subtitleElement.addEventListener('click', (e) => e.stopPropagation());
    this._contentElement.addEventListener('click', (e) => e.stopPropagation());
  }

  __processAutoOpen() {
    if (this.isToggleable && this.dataset.vlAutoOpen != undefined) {
      this.open();
    }
  }

  __processSlots() {
    if (!this._titleLabelSlot) {
      this._titleLabelSlotElement.remove();
    }
    this._titleElement.addEventListener('click', (event) => {
      event.stopPropagation();
      this._buttonElement.click();
    });
  }
}

define('vl-info-tile', VlInfoTile);