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

/**
 * VlDataTable
 * @class
 * @classdesc Gebruik een data table om op een gestructureerde manier (grote hoeveelheden) relationele data te tonen.
 *
 * @extends HTMLTableElement
 * @mixes nativeVlElement
 *
 * @property {boolean} data-vl-hover - Attribuut wordt gebruikt om een rij te highlighten waneer de gebruiker erover hovert met muiscursor.
 * @property {boolean} data-vl-matrix - Attribuut wordt gebruikt om data in 2 dimensies te tonen. Zowel de rijen als de kolommen krijgen een titel. Deze titels worden gescheiden door een dikke lijn.
 * @property {boolean} data-vl-lined - Variant met een lijn tussen elke rij en kolom.
 * @property {boolean} data-vl-zebra - Variant waarin de rijen afwisslend een andere achtergrondkleur krijgen. Dit maakt de tabel makkelijker leesbaar.
 * @property {boolean} data-vl-collaped-m - Vanaf een medium schermgrootte zullen de cellen van elke rij onder elkaar ipv naast elkaar getoond worden.
 * @property {boolean} data-vl-collaped-s - Vanaf een small schermgrootte zullen de cellen van elke rij onder elkaar ipv naast elkaar getoond worden.
 * @property {boolean} data-vl-collaped-xs - Vanaf een extra small schermgrootte zullen de cellen van elke rij onder elkaar ipv naast elkaar getoond worden.
 *
 * @see {@link https://www.github.com/milieuinfo/webcomponent-vl-ui-data-table/releases/latest|Release notes}
 * @see {@link https://www.github.com/milieuinfo/webcomponent-vl-ui-data-table/issues|Issues}
 * @see {@link https://webcomponenten.omgeving.vlaanderen.be/demo/vl-data-table.html|Demo}
 */
export class VlDataTable extends nativeVlElement(HTMLTableElement) {
  static get _observedClassAttributes() {
    return ['hover', 'matrix', 'lined', 'zebra', 'collapsed-m', 'collapsed-s', 'collapsed-xs'];
  }

  connectedCallback() {
    this._processClass();
    this._processScopeAttributes();
    this._observer = this._observeHeaderElements(() => this._processScopeAttributes());
  }

  disconnectedcallback() {
    if (this._observer) {
      this._observer.disconnect();
    }
  }

  get _headHeaderElements() {
    return [...this.querySelectorAll('thead tr th')];
  }

  get _bodyHeaderElements() {
    return [...this.querySelectorAll('tbody tr th')];
  }

  get _classPrefix() {
    return 'vl-data-table--';
  }

  _processClass() {
    this.classList.add('vl-data-table');
  }

  _processScopeAttributes() {
    this._headHeaderElements.filter((header) => !header.hasAttribute('scope')).forEach((header) => header.setAttribute('scope', 'col'));
    this._bodyHeaderElements.filter((header) => !header.hasAttribute('scope')).forEach((header) => header.setAttribute('scope', 'row'));
  }

  _observeHeaderElements(callback) {
    const observer = new MutationObserver(callback);
    observer.observe(this, {childList: true});
    return observer;
  }
}

define('vl-data-table', VlDataTable, {extends: 'table'});