import { PageObject } from '../../../infra-sk/modules/page_object/page_object';
import { TriageSkPO } from '../triage-sk/triage-sk_po';
import { PageObjectElement, PageObjectElementList } from '../../../infra-sk/modules/page_object/page_object_element';
import { ImageCompareSkPO } from '../image-compare-sk/image-compare-sk_po';
import { DotsLegendSkPO } from '../dots-legend-sk/dots-legend-sk_po';

/** A page object for the DigestDetailsSk component. */
export class DigestDetailsSkPO extends PageObject {
  get triageSkPO(): TriageSkPO {
    return this.poBySelector('triage-sk', TriageSkPO);
  }

  get imageCompareSkPO(): ImageCompareSkPO {
    return this.poBySelector('image-compare-sk', ImageCompareSkPO);
  }

  get dotsLegendSkPO(): DotsLegendSkPO {
    return this.poBySelector('dots-legend-sk', DotsLegendSkPO);
  }

  private get testName(): PageObjectElement {
    return this.bySelector('.top_bar .grouping_name');
  }

  private get clusterLink(): PageObjectElement {
    return this.bySelector('a.cluster_link');
  }

  private get leftDigest(): PageObjectElement {
    return this.bySelector('.digest_label.left');
  }

  private get rightDigest(): PageObjectElement {
    return this.bySelector('.digest_label.right');
  }

  private get diffPageLink(): PageObjectElement {
    return this.bySelector('.metrics_and_triage .diffpage_link');
  }

  private get metrics(): PageObjectElementList {
    return this.bySelectorAll('.metrics_and_triage .metric');
  }

  private get sizeWarning(): PageObjectElement {
    return this.bySelector('.metrics_and_triage .size_warning');
  }

  private get triageHistory(): PageObjectElement {
    return this.bySelector('.metrics_and_triage .triage-history');
  }

  private get toggleReferenceBtn(): PageObjectElement {
    return this.bySelector('button.toggle_ref');
  }

  private get closestImageIsNegativeWarning(): PageObjectElement {
    return this.bySelector('.negative_warning');
  }

  private get zoomDialog(): PageObjectElement {
    return this.bySelector('dialog.zoom_dialog');
  }

  isSelected(): Promise<boolean> {
    return this.element.hasClassName('selected');
  }

  getTestName(): Promise<string> {
    return this.testName.innerText;
  }

  getClusterHref(): Promise<string | null> {
    return this.clusterLink.getAttribute('href');
  }

  getLeftDigest(): Promise<string> {
    return this.leftDigest.innerText;
  }

  async getRightDigest(): Promise<string | null> {
    // Not all DigestDetailsSk instances have a right digest.
    return (await this.rightDigest.isEmpty()) ? null : this.rightDigest.innerText;
  }

  getDiffPageLink(): Promise<string | null> {
    return this.diffPageLink.getAttribute('href');
  }

  getMetrics(): Promise<string[]> {
    return this.metrics.map((metric) => metric.innerText);
  }

  async isSizeWarningVisible(): Promise<boolean> {
    return !(await this.sizeWarning.hasAttribute('hidden'));
  }

  getTriageHistory(): Promise<string> {
    return this.triageHistory.innerText;
  }

  async clickToggleReferenceBtn() {
    await this.toggleReferenceBtn.click();
  }

  async isClosestImageIsNegativeWarningVisible(): Promise<boolean> {
    return !(await this.closestImageIsNegativeWarning.hasAttribute('hidden'));
  }

  isZoomDialogOpen() {
    return this.zoomDialog.hasAttribute('open');
  }
}
