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';

/**
 * VlAccordion
 * @class
 * @classdesc Deccordion component kan gebruikt worden om informatie te tonen of te verbergen aan de hand van een toggle.
 *
 * @extends HTMLElement
 * @mixes vlElement
 *
 * @property {string} data-vl-toggle-text - Attribuut wordt gebruikt als tekst waarop de gebruiker kan klikken om de accordion te openen en te sluiten.
 * @property {string} data-vl-open-toggle-text - Attribuut wordt gebruikt als tekst wanneer de gebruiker de accordion geopend heeft.
 * @property {string} data-vl-close-toggle-text - Attribuut wordt gebruikt als tekst wanneer de gebruiker de accordion gesloten heeft.
 *
 * @see {@link https://www.github.com/milieuinfo/webcomponent-vl-ui-accordion/releases/latest|Release notes}
 * @see {@link https://www.github.com/milieuinfo/webcomponent-vl-ui-accordion/issues|Issues}
 * @see {@link https://webcomponenten.omgeving.vlaanderen.be/demo/vl-accordion.html|Demo}
 *
 */
export class VlAccordion extends vlElement(HTMLElement) {
  static get _observedAttributes() {
    return ['toggle-text', 'open-toggle-text', 'close-toggle-text'];
  }

  constructor() {
    super(`
      <style>
        @import '/src/style.css';
      </style>

      <div class="js">
        <div class="vl-accordion" data-vl-accordion>
          <button class="vl-toggle vl-link vl-link--bold" data-vl-accordion-toggle>
            <i class="vl-accordion__icon vl-link__icon vl-link__icon--before vl-toggle__icon vl-vi vl-vi-arrow-right-fat" aria-hidden="true"></i>
            <slot name="title" class="vl-accordion__title"></slot>
          </button>
          <div class="vl-accordion__content js-vl-accordion__content">
            <div class="vl-accordion__panel">
              <slot id="accordion-slot"></slot>
            </div>
          </div>
        </div>
      </div>
    `);
  }

  connectedCallback() {
    this.dress();
    if (this._hasTitleSlot()) {
      this._propagateTitleSlotClickToAccordion();
    }
  }

  _propagateTitleSlotClickToAccordion() {
    this._titleElement.addEventListener('click', (event) => {
      event.stopPropagation();
      this._buttonElement.click();
    });
  }

  _hasTitleSlot() {
    return this._titleElement.assignedElements().length > 0;
  }

  get _accordionElement() {
    return this._element.querySelector('[data-vl-accordion]');
  }

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

  get _titleElement() {
    return this._buttonElement.querySelector('slot[name="title"]');
  }

  get _openToggleTextAttribute() {
    return this.getAttribute('open-toggle-text');
  }

  get _closeToggleTextAttribute() {
    return this.getAttribute('close-toggle-text');
  }

  get _dressedAttribute() {
    return this.getAttribute('accordion-dressed');
  }

  get _isDressed() {
    return !!this._dressedAttribute;
  }

  get _isOpen() {
    return this._accordionElement.classList.contains('js-vl-accordion--open');
  }

  /**
   * Activeer de accordion functionaliteit.
   *
   * @return {void}
   */
  dress() {
    if (!this._isDressed) {
      vl.accordion.dress(this._buttonElement);
    }
  }

  /**
   * Opent de accordion.
   *
   * @return {void}
   */
  open() {
    vl.accordion.open(this._accordionElement);
  }

  /**
   * Sluit de accordion.
   *
   * @return {void}
   */
  close() {
    if (this._isOpen) {
      this.toggle();
    }
  }

  /**
   * Opent of sluit de accordion afhankelijk van de huidige status (open of gesloten) van de accordion.
   *
   * @return {void}
   */
  toggle() {
    vl.accordion.toggle(this._accordionElement);
  }

  _toggleTextChangedCallback(oldValue, newValue) {
    this._titleElement.textContent = newValue;
  }

  _openToggleTextChangedCallback(oldValue, newValue) {
    this._titleElement.classList.add('js-vl-accordion__toggle__text');
    this._titleElement.setAttribute('data-vl-accordion-open-text', newValue);
  }

  _closeToggleTextChangedCallback(oldValue, newValue) {
    this._titleElement.classList.add('js-vl-accordion__toggle__text');
    this._titleElement.setAttribute('data-vl-accordion-close-text', newValue);
  }
}

define('vl-accordion', VlAccordion);