/**
 * @module modules/triage2-sk
 * @description <h2><code>triage2-sk</code></h2>
 *  A custom element that allows toggling between the three
 *  Status states of triage: positive, negative, and untriaged.
 *
 * @evt change - The value of e.detail is the new triage Status value,
 *    for example "positive", or "negative".
 *
 * @attr value - The state of triage, either "positive", "negative", or
 *    "untriaged".
 *
 * @example
 *   <triage2-sk value=positive></triage2-sk>
 */
import { define } from 'elements-sk/define';
import { html } from 'lit-html';
import { ElementSk } from '../../../infra-sk/modules/ElementSk';
import 'elements-sk/icon/check-circle-icon-sk';
import 'elements-sk/icon/cancel-icon-sk';
import 'elements-sk/icon/help-icon-sk';
import 'elements-sk/styles/buttons';
import { Status } from '../json';

// TODO(jcgregorio) Maybe go2ts could emit isFoo guard functions?
function isStatus(value: string): value is Status {
  const allowed = ['positive', 'negative', 'untriaged', ''];
  return allowed.indexOf(value) !== -1;
}

export class TriageSk extends ElementSk {
  private static _match = (a: Status, b: Status) => a === b;

  private static template = (ele: TriageSk) => html`
    <button
      class="positive"
      @click=${() => (ele.value = 'positive')}
      ?selected=${TriageSk._match(ele.value, 'positive')}
    >
      <check-circle-icon-sk title="Positive"></check-circle-icon-sk>
    </button>
    <button
      class="negative"
      @click=${() => (ele.value = 'negative')}
      ?selected=${TriageSk._match(ele.value, 'negative')}
    >
      <cancel-icon-sk title="Negative"></cancel-icon-sk>
    </button>
    <button
      class="untriaged"
      @click=${() => (ele.value = 'untriaged')}
      ?selected=${TriageSk._match(ele.value, 'untriaged')}
    >
      <help-icon-sk title="Untriaged"></help-icon-sk>
    </button>
  `;

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

  connectedCallback() {
    super.connectedCallback();
    this._upgradeProperty('value');
    if (!this.value) {
      this.value = 'untriaged';
    }
    this._render();
  }

  static get observedAttributes() {
    return ['value'];
  }

  /** @prop value - The status, such as 'positive', 'negative', or 'untriaged'. */
  get value(): Status {
    const v = this.getAttribute('value') || '';
    if (isStatus(v)) {
      return v;
    } else {
      return 'untriaged';
    }
  }

  set value(val: Status) {
    this.setAttribute('value', val);
  }

  attributeChangedCallback(_name: string, oldValue: string, newValue: string) {
    if (oldValue !== newValue) {
      this._render();
      this.dispatchEvent(
        new CustomEvent<Status>('change', {
          detail: newValue as Status,
          bubbles: true,
        })
      );
    }
  }
}

define('triage2-sk', TriageSk);
