/**
 * @module modules/json-source-sk
 * @description <h2><code>json-source-sk</code></h2>
 *
 * Displays buttons that, when pressed, retrieve and show the JSON file that
 * was ingested for the point in the trace identified by commit id and trace
 * id.
 *
 */
import { html } from 'lit/html.js';
import { define } from '../../../elements-sk/modules/define';
import { $$ } from '../../../infra-sk/modules/dom';
import { jsonOrThrow } from '../../../infra-sk/modules/jsonOrThrow';
import { SpinnerSk } from '../../../elements-sk/modules/spinner-sk/spinner-sk';
import { errorMessage } from '../errorMessage';
import { ElementSk } from '../../../infra-sk/modules/ElementSk';
import { CommitDetailsRequest, CommitNumber } from '../json';

import '../../../elements-sk/modules/spinner-sk';
import { validKey } from '../paramtools';

import '@material/web/button/outlined-button.js';

export class JSONSourceSk extends ElementSk {
  private _json: string;

  private _cid: CommitNumber = CommitNumber(-1);

  private _traceid: string;

  private _spinner: SpinnerSk | null = null;

  private showJsonDialog: HTMLDialogElement | null = null;

  constructor() {
    super(JSONSourceSk.template);
    this._json = '';
    this._traceid = '';
  }

  private static template = (ele: JSONSourceSk) => html`
    <div id="controls" ?hidden=${!ele.validTraceID()}>
      <button id="view-source" @click=${ele._loadSource}>View Json File</button>
      <button id="load-source" @click=${ele._loadSourceSmall}>View Short Json File</button>
    </div>
    <dialog id="json-dialog">
      <button id="closeIcon" @click=${ele.closeJsonDialog}>
        <close-icon-sk></close-icon-sk>
      </button>
      <spinner-sk id="spinner"></spinner-sk>
      ${ele.jsonFile()}
    </dialog>
  `;

  connectedCallback(): void {
    super.connectedCallback();
    this._render();
    this._spinner = $$('#spinner', this);
    this.showJsonDialog = this.querySelector('#json-dialog');
  }

  private validTraceID(): boolean {
    return validKey(this._traceid);
  }

  /** @prop cid - The Commit ID. */
  get cid(): CommitNumber {
    return this._cid;
  }

  set cid(val: CommitNumber) {
    this._cid = val;
    this._json = '';
    this._render();
  }

  /** @prop traceid - The ID of the trace. */
  get traceid(): string {
    return this._traceid;
  }

  set traceid(val: string) {
    this._traceid = val;
    this._json = '';
    this._render();
  }

  private async _loadSource() {
    this._loadSourceImpl(false);
    this.openJsonDialog();
  }

  private async _loadSourceSmall() {
    this._loadSourceImpl(true);
    this.openJsonDialog();
  }

  private async _loadSourceImpl(isSmall: boolean) {
    if (this._spinner!.active === true) {
      return;
    }
    if (!this.validTraceID()) {
      return;
    }
    if (this.cid === -1) {
      return;
    }
    const body: CommitDetailsRequest = {
      cid: this.cid,
      traceid: this.traceid,
    };
    this._spinner!.active = true;
    let url = '/_/details/';
    if (isSmall) {
      url += '?results=false';
    }
    await fetch(url, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(body),
    })
      .then(jsonOrThrow)
      .then(async (json) => {
        this._json = JSON.stringify(json, null, '  ');
        this._spinner!.active = false;
        this._render();
      })
      .catch((e) => {
        this._spinner!.active = false;
        errorMessage(e);
      });
  }

  private jsonFile() {
    if (this._json! !== '') {
      return html` <div id="json-source">
        <pre>${this._json}</pre>
      </div>`;
    }
  }

  private openJsonDialog() {
    this._render();
    this.showJsonDialog!.showModal();
  }

  private closeJsonDialog(): void {
    this._json = '';
    this.showJsonDialog!.close();
  }
}

define('json-source-sk', JSONSourceSk);
