/**
 * @module modules/machine-app-sk
 * @description <h2><code>machine-app-sk</code></h2>
 *
 * UI wrapper for machineserver readouts which sticks them in tabs and has a
 * shared toolbar
 */
import { html, TemplateResult } from 'lit-html';

import { $$ } from 'common-sk/modules/dom';
import { define } from 'elements-sk/define';
import 'elements-sk/error-toast-sk';
import 'elements-sk/tabs-sk';
import 'elements-sk/tabs-panel-sk';
import 'elements-sk/icon/more-vert-icon-sk';
import { stateReflector } from 'common-sk/modules/stateReflector';
import { HintableObject } from 'common-sk/modules/hintable';
import { ElementSk } from '../../../infra-sk/modules/ElementSk';
import { MachinesTableSk, MachineTableSkChangeEventDetail, WaitCursor } from '../machines-table-sk';
import '../machines-table-sk';
import '../../../infra-sk/modules/theme-chooser-sk';
import '../../../infra-sk/modules/app-sk';
import { ColumnTitles } from '../machine-table-columns-dialog-sk/machine-table-columns-dialog-sk';

/** The State of our page that gets reflected into the URL. */
class State {
  /** The value of the search input element. */
  search: string = '';

  /** The value of the sort history encode as a string. */
  sort: string = '';

  /** The names of all the hidden columns. */
  hidden: ColumnTitles[] = ['Version', 'Annotation', 'Launched Swarming'];
}

export class MachineAppSk extends ElementSk {
  private _inputElement: HTMLInputElement | null = null;

  /** The state to reflect to the URL. */
  private state: State = new State();

  // eslint-disable-next-line @typescript-eslint/no-empty-function
  private stateHasChanged = () => {};

  private machinesTable: MachinesTableSk | null = null;

  protected _template = (ele: MachineAppSk): TemplateResult => html`
    <app-sk @machine-table-sort-change=${ele.sortChanged}>
      <header>
        <span>
          <auto-refresh-sk @refresh-page=${ele.update}></auto-refresh-sk>
          <h1><a href="/">Machines</a></h1>
        </span>
        <span id=header-rhs>
          <more-vert-icon-sk @click=${ele.editHiddenColumns}></more-vert-icon-sk>
          <input id="filter-input" @input=${ele.filterChanged} type="text" placeholder="Filter">
          <theme-chooser-sk title="Toggle between light and dark mode."></theme-chooser-sk>
        </span>
      </header>
      <main>
        <machines-table-sk></machines-table-sk>
      </main>
      <error-toast-sk></error-toast-sk>
    </app-sk>
  `;

  connectedCallback(): void {
    super.connectedCallback();
    this._render();
    this._inputElement = $$<HTMLInputElement>('#filter-input', this)!;
    this.machinesTable = $$<MachinesTableSk>('machines-table-sk', this);
    this.update('ShowWaitCursor');
    this.stateHasChanged = stateReflector(
      () => this.state as unknown as HintableObject,
      (hintableState) => {
        const state = hintableState as unknown as State;
        this.state = state;
        this.machinesTable!.restoreSortState(this.state.sort);
        this.machinesTable!.restoreHiddenColumns(this.state.hidden);

        this.update();

        this._inputElement!.value = this.state.search;
        this.propagateFilterChange();
        this._render();
      },
    );
  }

  /** Handle input changed event for the filter element. */
  private filterChanged(): void {
    this.propagateFilterChange();
    this.state.search = this._inputElement!.value;
    this.stateHasChanged();
  }

  /** Handle the sort order changing. */
  private sortChanged(e: CustomEvent<MachineTableSkChangeEventDetail>): void {
    this.state.sort = e.detail;
    this.stateHasChanged();
  }

  /** Tell the active table to filter itself. */
  private propagateFilterChange(): void {
    this.machinesTable?.filterChanged(this._inputElement!.value);
  }

  /** Tell the active table to fetch new data and redraw itself. */
  private update(waitCursorPolicy: WaitCursor = 'DoNotShowWaitCursor'): void {
    this.machinesTable?.update(waitCursorPolicy);
  }

  /** Edit the configuration of the table, e.g. the columns to hide. */
  private async editHiddenColumns(): Promise<void> {
    this.state.hidden = await this.machinesTable!.editHiddenColumns();
    this.stateHasChanged();
  }
}

define('machine-app-sk', MachineAppSk);
