/**
 * @module modules/corpus-selector-sk
 * @description <h2><code>corpus-selector-sk</code></h2>
 *
 * An element that allows the user to select a corpus from a list of available corpora.
 *
 * Events:
 *
 *   corpus-selected: Emitted when the user selects a corpus. The event details contains the
 *                    selected corpus.
 */

import { define } from 'elements-sk/define';
import { html } from 'lit-html';
import { ElementSk } from '../../../infra-sk/modules/ElementSk';

/**
 * Takes a corpus object and returns a string used to represent the corpus on the CorpusSelectorSk
 * element's UI.
 */
export type CorpusRendererFn<T extends Object> = (corpus: T)=> string;

/**
 * An element that allows the user to select a corpus from a list of available corpora.
 *
 * Corpora are objects of the generic type T, and are transformed to text to be displayed in the UI
 * using T#toString(). This behavior can be overriden by providing a custom CorpusRendererFn<T> via
 * the customRendererFn property.
 */
export class CorpusSelectorSk<T extends Object> extends ElementSk {
  private static template =
    <T>(el: CorpusSelectorSk<T>) => (el._corpora.length
      ? html`
            <ul>${el._corpora.map((corpus) => CorpusSelectorSk.corpusTemplate(el, corpus))}</ul>`
      : html`<p>Loading corpora details...</p>`);

  private static corpusTemplate =
    <T>(el: CorpusSelectorSk<T>, corpus: T) => html`
        <li class=${el._selectedCorpus === corpus ? 'selected' : ''}
            title="${el._corpusRendererFn(corpus)}"
            @click=${() => el._handleCorpusClick(corpus)}>
          ${el._corpusRendererFn(corpus)}
        </li>`;

  private _corpora: T[] = [];

  // Default to the corpus object's toString() method.
  private _corpusRendererFn: CorpusRendererFn<T> = (corpus) => corpus.toString();

  private _selectedCorpus: T | null = null;

  constructor() {
    super(CorpusSelectorSk.template);
  }

  connectedCallback() {
    super.connectedCallback();
    this._render();
  }

  /** The corpora available for the user to select from. */
  get corpora() { return this._corpora; }

  set corpora(value) {
    this._corpora = value;
    this._render();
  }

  /** A function that takes a corpus and returns the text to display on the UI. */
  get corpusRendererFn() { return this._corpusRendererFn; }

  set corpusRendererFn(fn) {
    this._corpusRendererFn = fn;
    this._render();
  }

  /** The currently selected corpus. */
  get selectedCorpus() { return this._selectedCorpus; }

  set selectedCorpus(corpus) {
    this._selectedCorpus = corpus;
    this._render();
  }

  private _handleCorpusClick(corpus: T) {
    if (this.selectedCorpus !== corpus) {
      this.selectedCorpus = corpus;
      this._sendCorpusSelected();
    }
  }

  private _sendCorpusSelected() {
    this.dispatchEvent(
      new CustomEvent<T>('corpus-selected', {
        detail: this._selectedCorpus!,
        bubbles: true,
      }),
    );
  }
}

define('corpus-selector-sk', CorpusSelectorSk);
