/**
 * @module modules/machine-table-columns-dialog-sk
 * @description <h2><code>machine-table-columns-dialog-sk</code></h2>
 *
 * Displays a dialog with all possible column names and allows the user to
 * choose which ones to hide.
 *
 */

import { html } from 'lit-html';
import { $ } from '../../../infra-sk/modules/dom';
import { define } from '../../../elements-sk/modules/define';
import { CheckOrRadio } from '../../../elements-sk/modules/checkbox-sk/checkbox-sk';
import { ElementSk } from '../../../infra-sk/modules/ElementSk';
import '../../../elements-sk/modules/checkbox-sk';

export type ColumnTitles =
  | 'Machine'
  | 'Attached'
  | 'Device'
  | 'Mode'
  | 'Recovering'
  | 'Power'
  | 'Details'
  | 'Quarantined'
  | 'Task'
  | 'Battery'
  | 'Temperature'
  | 'Last Seen'
  | 'Uptime'
  | 'Dimensions'
  | 'Launched Swarming'
  | 'Note'
  | 'Annotation'
  | 'Version'
  | 'Delete'
  | 'Clear Quarantine';

export const ColumnOrder: ColumnTitles[] = [
  'Machine',
  'Attached',
  'Device',
  'Mode',
  'Recovering',
  'Power',
  'Details',
  'Quarantined',
  'Clear Quarantine',
  'Task',
  'Battery',
  'Temperature',
  'Last Seen',
  'Uptime',
  'Dimensions',
  'Launched Swarming',
  'Note',
  'Annotation',
  'Version',
  'Delete',
];

export class MachineTableColumnsDialogSk extends ElementSk {
  private dialog: HTMLDialogElement | null = null;

  private hiddenColumns: ColumnTitles[] = [];

  private resolve: ((value: ColumnTitles[] | undefined) => void) | null = null;

  constructor() {
    super(MachineTableColumnsDialogSk.template);
  }

  private static template = (ele: MachineTableColumnsDialogSk) => html` <dialog>
    <h2>Select columns to display.</h2>
    <div>
      ${ColumnOrder.map(
        (name: ColumnTitles) =>
          html`<checkbox-sk
            label=${name}
            ?checked=${!ele.hiddenColumns.includes(name)}></checkbox-sk>`
      )}
    </div>

    <div class="controls">
      <button @click=${ele.okClick} id="ok">OK</button>
      <button @click=${ele.cancelClick} id="cancel">Cancel</button>
    </div>
  </dialog>`;

  connectedCallback(): void {
    super.connectedCallback();
    this._render();
    this.dialog = this.querySelector<HTMLDialogElement>('dialog');
  }

  edit(hidden: ColumnTitles[]): Promise<ColumnTitles[] | undefined> {
    return new Promise((resolve) => {
      this.resolve = resolve;
      this.hiddenColumns = [...hidden];
      this._render();
      this.dialog!.showModal();
    });
  }

  private cancelClick() {
    if (!this.resolve) {
      return;
    }
    this.resolve(undefined);
    this.dialog!.close();
    this.resolve = null;
  }

  private okClick() {
    if (!this.resolve) {
      return;
    }
    this.hiddenColumns = $<CheckOrRadio>('checkbox-sk', this)
      .filter((ch: CheckOrRadio) => !ch.checked)
      .map((ch: CheckOrRadio) => ch.label as ColumnTitles);
    this.resolve(this.hiddenColumns);
    this.dialog!.close();
    this.resolve = null;
  }
}

define('machine-table-columns-dialog-sk', MachineTableColumnsDialogSk);
