import {vlElement, define} from '/node_modules/vl-ui-core/dist/vl-core.js';
import '/node_modules/vl-ui-template/dist/vl-template.js';
import '/node_modules/vl-ui-header/dist/vl-header.js';
import '/node_modules/vl-ui-functional-header/dist/vl-functional-header.js';
import '/node_modules/vl-ui-grid/dist/vl-grid.js';
import '/node_modules/vl-ui-titles/dist/vl-titles.js';
import '/node_modules/vl-ui-footer/dist/vl-footer.js';

/**
 * VlDemoPage
 * @class
 * @classdesc
 *
 * @extends HTMLElement
 * @mixes vlElement
 *
 * @property {boolean} data-vl-link - Attribuut wordt gebruikt om de link naar de documentatie van Webuniversum te bepalen.
 * @property {boolean} data-vl-webcomponent - Attribuut wordt gebruikt om aan te geven over welke webcomponent de demo pagina gaat.
 * @property {number} data-vl-size - De teller van de verdeling van grote scherm.
 * @property {number} data-vl-small-size - De teller van de verdeling van kleine scherm.
 * @property {number} data-vl-extra-small-size - De teller van de verdeling van extra kleine scherm.
 *
 * @see {@link https://www.github.com/milieuinfo/webcomponent-vl-demo/releases/latest|Release notes}
 * @see {@link https://www.github.com/milieuinfo/webcomponent-vl-demo/issues|Issues}
 * @see {@link https://webcomponenten.omgeving.vlaanderen.be/demo/vl-demo.html|Demo}
 */
export class VlDemoPage extends vlElement(HTMLElement) {
  static get _observedAttributes() {
    return ['link', 'webcomponent', 'size', 'medium-size', 'small-size', 'extra-small-size'];
  }

  constructor() {
    super(`
      <style>
        @import '/node_modules/vl-ui-grid/src/style.css';
        @import '/node_modules/vl-ui-titles/src/style.css';
        @import '/src/style.css';

        ::slotted(vl-demo:not(:first-child)) {
          display: block;
          margin-top: 3rem;
        }
      </style>
      <vl-template>
        <div slot="main">
          <vl-functional-header id="functional-header-slots" data-vl-link="https://webcomponenten.omgeving.vlaanderen.be">
            <span slot="title">Webcomponenten</span>
            <span slot="sub-title"></span>
            <span slot="back">Terug</span>
          </vl-functional-header>
          <section is="vl-region">
            <div is="vl-layout">
              <h1 is="vl-h1"></h1>
              <div id="grid" is="vl-grid" data-vl-is-stacked slot="main" data-vl-size="12">
                <div id="demo" is="vl-column">
                  <h2 is="vl-h2">Demo's</h2>
                  <slot></slot>
                </div>
              </div>
            </div>
          </section>
        </div>
      </vl-template>
    `);
    this._addMetaTag();
    const template = this._shadow.querySelector('vl-template');
    const params = new URLSearchParams(VlDemoPage.getSearchParams());
    const noHeader = !!params.get('no-header');
    const noFooter = !!params.get('no-footer');
    if (!noHeader) {
      template.prepend(this._template(`<vl-header id="header" slot="header" data-vl-identifier="59188ff6-662b-45b9-b23a-964ad48c2bfb" data-vl-development></vl-header>`));
    }
    if (!noFooter) {
      template.append(this._template(`<vl-footer id="footer" slot="footer" data-vl-identifier="0337f8dc-3266-4e7a-8f4a-95fd65189e5b" data-vl-development></vl-footer>`));
    }
  }

  static getSearchParams() {
    return window.location.search;
  }

  get _functionalHeaderSubTitleElement() {
    return this._shadow.querySelector('vl-functional-header [slot="sub-title"]');
  }

  get _titleElement() {
    return this._shadow.querySelector('h1');
  }

  get _gridElement() {
    return this._shadow.querySelector('#grid');
  }

  get _linkElement() {
    return this._gridElement.querySelector('#link');
  }

  get _demoElement() {
    return this._gridElement.querySelector('#demo');
  }

  _getLinkTemplate(link) {
    return this._template(`
      <div id="link" is="vl-column">
        <h2 is="vl-h2">Documentatie</h2>
        <p>
          Meer voorbeelden en documentatie raadpleegbaar via de <a href="${link}">website</a> van Webuniversum.
        </p>
      </div>
    `);
  }

  _linkChangedCallback(oldValue, newValue) {
    if (this._linkElement) {
      this._linkElement.remove();
    }
    this._gridElement.insertBefore(this._getLinkTemplate(newValue), this._demoElement);
  }

  _webcomponentChangedCallback(oldValue, newValue) {
    this._titleElement.innerText = `Demo ${newValue}`;
    this._functionalHeaderSubTitleElement.innerText = `Webcomponent ${newValue}`;
  }

  _sizeChangedCallback(oldValue, newValue) {
    this._demoElement.setAttribute('data-vl-size', newValue);
  }

  _mediumSizeChangedCallback(oldValue, newValue) {
    this._demoElement.setAttribute('data-vl-medium-size', newValue);
  }

  _smallSizeChangedCallback(oldValue, newValue) {
    this._demoElement.setAttribute('data-vl-small-size', newValue);
  }

  _extraSmallSizeChangedCallback(oldValue, newValue) {
    this._demoElement.setAttribute('data-vl-extra-small-size', newValue);
  }

  _addMetaTag() {
    const meta = document.createElement('meta');
    meta.name = 'viewport';
    meta.content = 'width=device-width, initial-scale=1.0';
    document.head.appendChild(meta);
  }
}

define('vl-demo-page', VlDemoPage);