/**
 * @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 {
  constructor() {
    super(TriageSk.template);
  }

  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>
  `;

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

  static get observedAttributes(): string[] {
    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;
    }
    return 'untriaged';
  }

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

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

define('triage2-sk', TriageSk);
