import CommonElements from "../CommonElements";

export default class SidebarPage extends CommonElements {
  #realmsDrpDwn = "realmSelector";
  #createRealmBtn = "add-realm";

  #clientsBtn = "#nav-item-clients";
  #clientScopesBtn = "#nav-item-client-scopes";
  #realmRolesBtn = "#nav-item-roles";
  #usersBtn = "#nav-item-users";
  #groupsBtn = "#nav-item-groups";
  #sessionsBtn = "#nav-item-sessions";
  #eventsBtn = "#nav-item-events";

  #realmSettingsBtn = "#nav-item-realm-settings";
  #authenticationBtn = "#nav-item-authentication";
  #identityProvidersBtn = "#nav-item-identity-providers";
  #userFederationBtn = "#nav-item-user-federation";

  realmsElements = '[id="realm-select"] li';

  showCurrentRealms(length: number) {
    cy.findByTestId(this.#realmsDrpDwn).click();
    cy.get(this.realmsElements).contains("Loading realms…").should("not.exist");
    cy.get(this.realmsElements).should(
      "have.length",
      length + 1, // account for button
    );
    cy.findByTestId(this.#realmsDrpDwn).click({ force: true });

    return this;
  }

  realmExists(realmName: string, exists = true) {
    cy.findByTestId(this.#realmsDrpDwn).click();
    cy.get(this.realmsElements).contains("Loading realms…").should("not.exist");
    cy.get(this.realmsElements)
      .contains(realmName)
      .should((exists ? "" : "not.") + "exist");
    cy.findByTestId(this.#realmsDrpDwn).click();

    return this;
  }

  getCurrentRealm() {
    return cy.findByTestId(this.#realmsDrpDwn).scrollIntoView().invoke("text");
  }

  goToRealm(realmName: string) {
    this.waitForPageLoad();
    cy.intercept("GET", "/admin/realms/master/ui-ext/realms/names/*").as(
      "getRealms",
    );
    cy.findByTestId(this.#realmsDrpDwn).click();
    cy.get(this.realmsElements).contains("Loading realms…").should("not.exist");
    cy.get(this.realmsElements).contains(realmName).click();
    this.waitForPageLoad();

    return this;
  }

  goToCreateRealm() {
    this.waitForPageLoad();
    cy.findByTestId(this.#realmsDrpDwn).click();
    cy.findByTestId(this.#createRealmBtn).click();
    this.waitForPageLoad();

    return this;
  }

  goToClients() {
    this.waitForPageLoad();
    cy.get(this.#clientsBtn).click({ force: true });
    this.waitForPageLoad();

    return this;
  }

  goToClientScopes() {
    this.waitForPageLoad();
    cy.get(this.#clientScopesBtn).click();
    this.waitForPageLoad();

    return this;
  }

  goToRealmRoles() {
    cy.get(this.#realmRolesBtn).click();
    this.waitForPageLoad();

    return this;
  }

  goToUsers() {
    this.waitForPageLoad();
    cy.get(this.#usersBtn).click();
    this.waitForPageLoad();

    return this;
  }

  goToGroups() {
    this.waitForPageLoad();
    cy.get(this.#groupsBtn).click();
    this.waitForPageLoad();

    return this;
  }

  goToSessions() {
    this.waitForPageLoad();
    cy.get(this.#sessionsBtn).click();
    this.waitForPageLoad();

    return this;
  }

  goToEvents() {
    this.waitForPageLoad();
    cy.get(this.#eventsBtn).click();
    this.waitForPageLoad();

    return this;
  }

  goToRealmSettings() {
    this.waitForPageLoad();
    cy.get(this.#realmSettingsBtn).click({ force: true });
    this.waitForPageLoad();

    return this;
  }

  goToAuthentication() {
    this.waitForPageLoad();
    cy.get(this.#authenticationBtn).click();
    this.waitForPageLoad();

    return this;
  }

  goToIdentityProviders() {
    this.waitForPageLoad();
    cy.get(this.#identityProvidersBtn).click();
    this.waitForPageLoad();

    return this;
  }

  goToUserFederation() {
    this.waitForPageLoad();
    cy.get(this.#userFederationBtn).click();
    this.waitForPageLoad();

    return this;
  }

  waitForPageLoad() {
    cy.get('[role="progressbar"]').should("not.exist");
    return this;
  }

  checkRealmSettingsLinkContainsText(expectedText: string) {
    cy.get(this.#realmSettingsBtn).should("contain", expectedText);
  }
}
