/**
 * @module module/triage-history-sk
 * @description <h2><code>triage-history-sk</code></h2> shows the triage history for a given
 *   Gold entry.
 *
 */
import { define } from 'elements-sk/define';
import { html } from 'lit-html';
import { diffDate } from 'common-sk/modules/human';
import { ElementSk } from '../../../infra-sk/modules/ElementSk';

const template = (ele) => {
  if (!ele.history.length) {
    return '';
  }
  const mostRecent = ele.history[0];
  return html`
<div class=message title="Last triaged on ${mostRecent.ts} by ${mostRecent.user}">
  ${diffDate(mostRecent.ts)} ago by ${shortenEmail(mostRecent.user)}
</div>`;
};

function shortenEmail(s) {
  const idx = s.indexOf('@');
  if (idx >= 0) {
    return s.substring(0, idx + 1);
  }
  return s;
}

define('triage-history-sk', class extends ElementSk {
  constructor() {
    super(template);
    this._history = [];
  }

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

  /**
   * @prop history {Array} An array of objects that have a "user" and "ts". If the "ts" provided
   *       is a string, it will be converted into a Date object before use.
   */
  get history() { return this._history; }

  set history(history) {
    this._history = history;
    this._history.forEach((h) => {
      if (typeof h.ts === 'string') {
        h.ts = new Date(h.ts);
      }
    });
    this._render();
  }
});
