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

/**
 * VlContentHeader
 * @class
 * @classdesc
 *
 * @extends HTMLElement
 * @mixes vlElement
 *
 * @see {@link https://www.github.com/milieuinfo/webcomponent-vl-ui-content-header/releases/latest|Release notes}
 * @see {@link https://www.github.com/milieuinfo/webcomponent-vl-ui-content-header/issues|Issues}
 * @see {@link https://webcomponenten.omgeving.vlaanderen.be/demo/vl-content-header.html|Demo}
 *
 */
export class VlContentHeader extends vlElement(HTMLElement) {
  constructor() {
    super(`
      <style>
        @import '/src/style.css';
      </style>
        <header class="vl-content-header vl-content-header--large vl-content-header--show-mobile vl-content-header--has-context">
          <div class="vl-content-header__wrapper">
        <picture id="picture" class="vl-content-header__bg"></picture>
        <div class="vl-layout">
          <div class="vl-content-header__content">
          <div id="context" class="vl-content-header__context vl-content-header__context--has-link"></div>
            <h2 id="title" class="vl-content-header__title vl-content-header__title--has-link"></h2>
          </div>
        </div>
      </div>
    </header>
  `);
  }

  connectedCallback() {
    this.__processSlotElements();
    this._observer = this.__observeSlotElements(() => this.__processSlotElements());
  }

  disconnectedCallback() {
    this._observer.disconnect();
  }

  get pictureElement() {
    return this._shadow.querySelector('#picture');
  }

  get pictureSlotElement() {
    return this.querySelector('img[slot="image"]');
  }

  get contextElement() {
    return this._shadow.querySelector('#context');
  }

  get contextSlotElement() {
    return this.querySelector('a[slot="context-link"]');
  }

  get titleElement() {
    return this._shadow.querySelector('#title');
  }

  get titleSlotElement() {
    return this.querySelector('a[slot="title-link"]');
  }

  __processSlotElements() {
    this.__processSlot(this.pictureElement, this.pictureSlotElement);

    const contextSlot = this.__processSlot(this.contextElement, this.contextSlotElement);
    contextSlot.classList.add('vl-content-header__context__link');

    const titleSlot = this.__processSlot(this.titleElement, this.titleSlotElement);
    titleSlot.classList.add('vl-content-header__title__link');
  }

  __clearChildren(element) {
    while (element.hasChildNodes()) {
      element.firstChild.remove();
    }
  }

  __processSlot(container, slotElement) {
    this.__clearChildren(container);
    const slotClone = slotElement.cloneNode(true);
    container.appendChild(slotClone);
    return slotClone;
  }

  __observeSlotElements(callback) {
    const observer = new MutationObserver(callback);
    observer.observe(this, {attributes: true, childList: true, characterData: true, subtree: true});
    return observer;
  }
}

define('vl-content-header', VlContentHeader);