/**
 * @module modules/algo-select-sk
 * @description <h2><code>algo-select-sk</code></h2>
 *
 * Displays and allows changing the clustering algorithm.
 *
 * @evt algo-change - Sent when the algo has changed. The value is stored
 *    in e.detail.algo.
 *
 * @attr {string} algo - The algorithm name.
 */
import '../../../elements-sk/modules/select-sk';
import { html } from 'lit-html';
import { define } from '../../../elements-sk/modules/define';
import { $ } from '../../../infra-sk/modules/dom';
import { SelectSkSelectionChangedEventDetail } from '../../../elements-sk/modules/select-sk/select-sk';
import { ElementSk } from '../../../infra-sk/modules/ElementSk';
import { ClusterAlgo } from '../json';

function toClusterAlgo(s: string): ClusterAlgo {
  const allowed = ['kmeans', 'stepfit'];
  if (allowed.indexOf(s) !== -1) {
    return s as ClusterAlgo;
  }
  return 'kmeans';
}

export interface AlgoSelectAlgoChangeEventDetail {
  algo: ClusterAlgo;
}

export class AlgoSelectSk extends ElementSk {
  constructor() {
    super(AlgoSelectSk.template);
  }

  // TODO(jcgregorio) select-sk needs something like attr-for-selected and
  // fallback-selection like iron-selector.
  private static template = (ele: AlgoSelectSk) => html`
    <select-sk @selection-changed=${ele._selectionChanged}>
      <div
        value="kmeans"
        ?selected=${ele.algo === 'kmeans'}
        title="Use k-means clustering on the trace shapes and look for a step on the cluster centroid.">
        K-Means
      </div>
      <div
        value="stepfit"
        ?selected=${ele.algo === 'stepfit'}
        title="Look for a step in each individual trace.">
        Individual
      </div>
    </select-sk>
  `;

  connectedCallback(): void {
    super.connectedCallback();
    this._upgradeProperty('algo');
    this._render();
  }

  attributeChangedCallback(): void {
    this._render();
  }

  static get observedAttributes(): string[] {
    return ['algo'];
  }

  private _selectionChanged(
    e: CustomEvent<SelectSkSelectionChangedEventDetail>
  ) {
    let index = e.detail.selection;
    if (index < 0) {
      index = 0;
    }
    this.algo = toClusterAlgo(
      $('div', this)[index].getAttribute('value') || ''
    );
    const detail = {
      algo: this.algo,
    };
    this.dispatchEvent(
      new CustomEvent<AlgoSelectAlgoChangeEventDetail>('algo-change', {
        detail,
        bubbles: true,
      })
    );
  }

  /** @prop algo {string} The algorithm. */
  get algo(): ClusterAlgo {
    return toClusterAlgo(this.getAttribute('algo') || '');
  }

  set algo(val: ClusterAlgo) {
    this.setAttribute('algo', toClusterAlgo(val));
  }
}

define('algo-select-sk', AlgoSelectSk);
