import {nativeVlElement, define} from '/node_modules/vl-ui-core/dist/vl-core.js';

/**
 * Gebruik de button mixin in combinatie met button elementen.
 * @mixin vlButtonElement
 *
 * @param {Object} SuperClass - Class die als base class gebruikt zal worden.
 * @return {Object} class
 */
export const vlButtonElement = (SuperClass) => {
  return class extends nativeVlElement(SuperClass) {
    static get _observedAttributes() {
      return [];
    }

    static get _observedClassAttributes() {
      return ['disabled', 'error', 'block', 'large', 'wide', 'narrow', 'secondary', 'tertiary', 'loading'];
    }

    connectedCallback() {
      this.classList.add('vl-button');
      setTimeout(() => {
        this._setIconClass();
      });
    }

    get _classPrefix() {
      return 'vl-button--';
    }

    _setIconClass() {
      const icon = this.querySelector('[is="vl-icon"]');
      if (icon) {
        let suffix = '';
        suffix += icon.hasAttribute('data-vl-before') || icon.hasAttribute('before') ? '-before' : '';
        suffix += icon.hasAttribute('data-vl-after') || icon.hasAttribute('after') ? '-after' : '';
        this.classList.add(this._classPrefix + 'icon' + suffix);
        icon.classList.add('vl-button__icon');
        if (suffix) {
          icon.classList.add('vl-button__icon-' + suffix);
        }
        icon.classList.remove('vl-icon--before');
        icon.classList.remove('vl-icon--after');
      }
    }
  };
};

export const VlButtonElement = vlButtonElement;

/**
 * VlButton
 * @class
 * @classdesc Gebruik de vl-button om een CTA toe te voegen. Het type call-to-action wordt bepaald door het label of de pictogram.
 *
 * @extends HTMLButtonElement
 * @mixes vlButtonElement
 *
 * @property {boolean} data-vl-disabled - Attribuut wordt gebruikt om aan de gebruiker aan te duiden dat de functionaliteit niet actief is.
 * @property {boolean} data-vl-error - Attribuut wordt gebruikt om het belang of de gevolgen van een actie te benadrukken.
 * @property {boolean} data-vl-block - Attribuut wordt gebruikt om ervoor te zorgen dat de knop getoond wordt als een block element en bijgevol de breedte van de parent zal aannemen.
 * @property {boolean} data-vl-large - Attribuut wordt gebruikt om de aandacht van de gebruiker te trekken door de font-size te vergroten.
 * @property {boolean} data-vl-wide - Attribuut zorgt ervoor dat de knop breder op het scherm zal getoond worden.
 * @property {boolean} data-vl-narrow - Attribuut zorgt ervoor dat de knop smaller op het scherm zal getoond worden.
 * @property {boolean} data-vl-loading - Attribuut wordt gebruikt om aan de gebruiker aan te geven dat zijn actie momenteel verwerkt wordt.
 * @property {boolean} data-vl-secondary - Attribuut wordt gebruikt in combinatie met een gewone knop om alternatieve acties te voorzien.
 * @property {boolean} data-vl-tertiary - Attribuut wordt gebruikt in combinatie met gewone en secondary knoppen om alternatieve acties te voorzien.
 *
 * @see {@link https://www.github.com/milieuinfo/webcomponent-vl-ui-button/releases/latest|Release notes}
 * @see {@link https://www.github.com/milieuinfo/webcomponent-vl-ui-button/issues|Issues}
 * @see {@link https://webcomponenten.omgeving.vlaanderen.be/demo/vl-button.html|Demo}
 */
export class VlButton extends vlButtonElement(HTMLButtonElement) { }

/**
 * VlLinkButton
 * @class
 * @classdesc Gebruik de vl-link-button om een CTA toe te voegen.
 *
 * @extends HTMLAnchorElement
 *
 * @see {@link https://www.github.com/milieuinfo/webcomponent-vl-ui-link/releases/latest|Release notes}
 * @see {@link https://www.github.com/milieuinfo/webcomponent-vl-ui-link/issues|Issues}
 * @see {@link https://webcomponenten.omgeving.vlaanderen.be/demo/vl-link.html|Demo}
 */
export class VlLinkButton extends vlButtonElement(HTMLAnchorElement) { }

define('vl-button', VlButton, {extends: 'button'});
define('vl-link-button', VlLinkButton, {extends: 'a'});