import { ParamSet } from '../../../infra-sk/modules/query';
import { PageObject } from '../../../infra-sk/modules/page_object/page_object';
import { ParamSetSkPO } from '../../../infra-sk/modules/paramset-sk/paramset-sk_po';
import { QueryDialogSkPO } from '../query-dialog-sk/query-dialog-sk_po';
import { PageObjectElement } from '../../../infra-sk/modules/page_object/page_object_element';

/** A page object for the TraceFilterSk component. */
export class TraceFilterSkPO extends PageObject {
  get paramSetSkPO(): ParamSetSkPO {
    return this.poBySelector('.selection paramset-sk', ParamSetSkPO);
  }

  get queryDialogSkPO(): QueryDialogSkPO {
    return this.poBySelector('query-dialog-sk', QueryDialogSkPO);
  }

  private get emptyFilterMessage(): PageObjectElement {
    return this.bySelector('.selection .empty-placeholder');
  }

  private get editBtn(): PageObjectElement {
    return this.bySelector('.edit-query');
  }

  async isQueryDialogSkOpen() { return this.queryDialogSkPO.isDialogOpen(); }

  async isEmptyFilterMessageVisible() { return !(await this.emptyFilterMessage.isEmpty()); }

  async isParamSetSkVisible() { return !(await this.paramSetSkPO.isEmpty()); }

  async clickEditBtn() { await this.editBtn.click(); }

  async getParamSetSkContents() {
    const paramSetSkPO = await this.paramSetSkPO;
    const paramSets = await paramSetSkPO.getParamSets();
    return paramSets[0]; // There's only one ParamSet.
  }

  async clickQueryDialogSkShowMatchesBtn() {
    return this.queryDialogSkPO.clickShowMatchesBtn();
  }

  async clickQueryDialogSkCancelBtn() {
    return this.queryDialogSkPO.clickCancelBtn();
  }

  async getQueryDialogSkParamSet() {
    return this.queryDialogSkPO.getParamSet();
  }

  async getQueryDialogSkSelection() {
    return this.queryDialogSkPO.getSelection();
  }

  /** Sets the selected query in the query-dialog-sk via simulated UI interactions. */
  async setQueryDialogSkSelection(selection: ParamSet) {
    return this.queryDialogSkPO.setSelection(selection);
  }

  /** Analogous to the "selection" property getter. */
  async getSelection() {
    if (await this.isEmptyFilterMessageVisible()) {
      return {} as ParamSet;
    }
    return this.getParamSetSkContents();
  }
}
