/**
 * @module email-chooser-sk
 * @description <h2><code>email-chooser-sk</code></h2>
 *
 * <p>
 * This element pops up a dialog with OK and Cancel buttons. Its open method returns a Promise
 * which will resolve when the user clicks OK after selecting
 * an email or reject when the user clicks Cancel.
 * </p>
 *
 */
import dialogPolyfill from 'dialog-polyfill'
import { define } from 'elements-sk/define'
import { html, render } from 'lit-html'
import { $$ } from 'common-sk/modules/dom'

import 'elements-sk/styles/buttons'
import 'elements-sk/styles/select'

function displayEmail(email, owner) {
  if (owner === email) {
    return html`<option value=${email}>${email} (alert owner)</option>`;
  } else {
    return html`<option value=${email}>${email}</option>`;
  }
}

const template = (ele) => html`<dialog>
  <h2>Assign</h2>
  <select size=10 @input=${ele._input}>
    <option value='' selected>(un-assign)</option>
    ${ele._emails.map(email => displayEmail(email, ele._owner))}
  </select>
  <div class=buttons>
    <button @click=${ele._dismiss}>Cancel</button>
    <button @click=${ele._confirm}>OK</button>
  </div>
</dialog>`;

define('email-chooser-sk', class extends HTMLElement {
  constructor() {
    super();
    this._resolve = null;
    this._reject = null;
    this._emails = [];
    this._owner = '';
    this._selected = '';
  }

  connectedCallback() {
    this._render();
    this._dialog = $$('dialog');
    dialogPolyfill.registerDialog(this._dialog);
  }

  /**
   * Display the dialog.
   *
   * @param emails {Array} List of emails to choose from.
   * @param owner {String} The owner of this incident if available. Optional.
   * @returns {Promise} Returns a Promise that resolves on OK, and rejects on Cancel.
   *
   */
  open(emails, owner) {
    this._emails = emails;
    this._owner = owner;
    this._render();
    this._dialog.showModal();
    $$('select', this).focus();
    return new Promise((resolve, reject) => {
      this._resolve = resolve;
      this._reject = reject;
    });
  }

  _input(e) {
    this._selected = e.srcElement.value;
  }

  _dismiss() {
    this._dialog.close();
    this._reject();
  }

  _confirm() {
    this._dialog.close();
    this._resolve(this._selected);
  }

  _render() {
    render(template(this), this, {eventContext: this});
  }
});
