import { AdminInterceptsApis } from '@admin-lib/api-intercept';
import { GrowthUtilities } from '@growth-lib/growth-utilities';

const impersonateSelector = {
  navanHomepageUrl: 'app/user2/home',
  expenseAdminPageUrl: 'app/liquid/admin/activity/transactions',
  userMenuButton: '[data-qaid="USER_MENU-button"]',
  logInAsButton: '.ta-user',
  userSearchField: '[class="popover login-as-search enter"] input',
  userSearchResult: '.ta-search-result__user',
  successToast: 'ta-user-toastr .ta-toastr-event__message'
};

export class ImpersonateUser {
  static visitNavanHomePage() {
    cy.visit(impersonateSelector.navanHomepageUrl);
  }

  static visitExpenseAdminHomePage() {
    AdminInterceptsApis.interceptAdminsApis();
    cy.visit(impersonateSelector.expenseAdminPageUrl);
  }

  static verifyDelegateNameOnUserMenuButton(delegateUser: string) {
    cy.get(impersonateSelector.userMenuButton).should('contain', delegateUser);
  }

  static searchForAndSelectUserToImpersonate(impersonatedUser: string) {
    cy.get(impersonateSelector.logInAsButton).click();
    cy.get(impersonateSelector.userSearchField).type(impersonatedUser);
    cy.get(impersonateSelector.userSearchResult).click();
    cy.get(impersonateSelector.successToast).should(
      'contain',
      `Successfully logged in as ${impersonatedUser}`
    );
  }

  static verifyImpersonatedUserNameOnUserMenuButton(impersonatedUser: string) {
    AdminInterceptsApis.interceptAdminsApis();
    cy.wait('@waitForImpersonatedUser').then((xhr) => {
      const name = xhr.response?.body?.name;
      expect(name).to.equal(impersonatedUser);
    });
    cy.get(impersonateSelector.userMenuButton)
      .should('contain', 'Logged in as')
      .and('contain', impersonatedUser)
      .then(() => {
        GrowthUtilities.hideLiquidUnifiedListBanner();
      });
  }
  static verifyImpersonatedUserNameOnUserMenuButtoInAdmin(impersonatedUser: string) {
    AdminInterceptsApis.interceptAdminsApis();
    cy.wait('@waitForImpersonatedUser').then((xhr) => {
      const name = xhr.response?.body?.name;
      expect(name).to.equal(impersonatedUser);
    });
    cy.get(impersonateSelector.userMenuButton)
      .should('contain', 'Logged in as')
      .and('contain', impersonatedUser);
  }
}
