import { AdminPayment } from '@admin-lib/index';
import { LoginPage } from '@admin-lib/login';
import { stagingUsers } from '@fixtures/staging-users';
import { GrowthInterceptApis } from '@growth-lib/api-intercept';
import { UsersPage, userPageSelectors, apiWait } from '@admin-lib/admin_avi/users-page';
import { loginRequest } from 'cypress/artifacts';
import { formatStr } from '@growth-lib/users-roles';

const { emailAccountOwner, companyDomain } = stagingUsers.growth_users_regression;
const authUserPassword = Cypress.env('newUser').NEW_USER_PASSWORD;

describe('Users page - regressions tests', () => {
  let token: string;

  const USER_A = 'userlasta';
  const USER_B = 'userb-lastb';
  const ownerUser = 'test test';
  const CLEAR = '(Blank)';

  beforeEach(() => {
    GrowthInterceptApis.interceptApis();
    LoginPage.clearExistingLoginSession();
    loginRequest(emailAccountOwner, authUserPassword).then((_token) => {
      token = _token;

      UsersPage.gotoUsersPage();

      AdminPayment.closeHelpPopup();

      UsersPage.clearStatusFilterIfNeeded();
    });
  });

  it('C13829372: users page allow assigning approver and manager', { tags: ['@tier1'] }, () => {
    UsersPage.openSelectManagerForUser(`${USER_A}@${companyDomain}`);

    UsersPage.selectUserInDropDown(`${ownerUser}\n${emailAccountOwner}`);

    UsersPage.verifyEmailInManagerCell(`${USER_A}@${companyDomain}`, emailAccountOwner);

    UsersPage.openSelectApproverForUser(`${USER_A}@${companyDomain}`);

    UsersPage.selectUserInDropDown(`${ownerUser}\n${emailAccountOwner}`);

    UsersPage.verifyEmailInApproverCell(`${USER_A}@${companyDomain}`, emailAccountOwner);

    UsersPage.openSelectManagerForUser(`${USER_A}@${companyDomain}`);
    UsersPage.selectUserInDropDown(CLEAR);

    UsersPage.openSelectApproverForUser(`${USER_A}@${companyDomain}`);
    UsersPage.selectUserInDropDown(CLEAR);
  });

  it('C13829373: verify status, register cells in users-page', { tags: ['@tier1'] }, () => {
    const userBEmail = `${USER_B}@${companyDomain}`;

    UsersPage.clickOnUserSelector(userBEmail, userPageSelectors.statusToggle);
    UsersPage.waitFor(apiWait.USERS_PATCH);
    UsersPage.verifyUserStatusToggle(userBEmail, false);

    UsersPage.clickOnUserSelector(userBEmail, userPageSelectors.statusToggle);
    UsersPage.waitFor(apiWait.USERS_PATCH);
    UsersPage.verifyUserStatusToggle(userBEmail, true);

    UsersPage.clickOnUserSelector(userBEmail, userPageSelectors.registeredColumn);
    UsersPage.verifySelectorExist(userPageSelectors.modalSendCtaModal);
    UsersPage.clickOn(userPageSelectors.modalSendCtaModal);
  });

  it('C13829374: verify access, permission column in users-page', { tags: ['@tier1'] }, () => {
    const userBEmail = `${USER_B}@${companyDomain}`;

    UsersPage.modifyAccessModalPermissions(
      userBEmail,
      userPageSelectors.accessColumn,
      userPageSelectors.permissionItem
    );
    UsersPage.waitFor(apiWait.USER_ACCESS_CONTROL);
    UsersPage.clickOn(userPageSelectors.closeModal);

    const enabledArr = [true, true, false, false, false];
    UsersPage.verifyPermissionsItems(
      userBEmail,
      enabledArr.map((enabled, i) => ({ enabled, index: i + 1 }))
    );

    UsersPage.modifyAccessModalPermissions(
      userBEmail,
      userPageSelectors.accessColumn,
      userPageSelectors.permissionItem
    );
    UsersPage.clickOn(userPageSelectors.closeModal);
  });

  it('C13829794: verify title cell in users-page', { tags: ['@tier1'] }, () => {
    const userAEmail = `${USER_A}@${companyDomain}`;
    UsersPage.testEditableTextColumn(userAEmail, userPageSelectors.titleColumnToggle, 'title check');
  });

  it('C13829795: verify employee cell in users-page', { tags: ['@tier1'] }, () => {
    const userAEmail = `${USER_A}@${companyDomain}`;
    UsersPage.testEditableTextColumn(userAEmail, userPageSelectors.employeeidColumn, 'employeeCheck');
  });

  it('C13829796: verify cost center cell in users-page', { tags: ['@tier1'] }, () => {
    const userAEmail = `${USER_A}@${companyDomain}`;
    const userBEmail = `${USER_B}@${companyDomain}`;

    UsersPage.testCustomDropDownColumn({
      columnSelector: userPageSelectors.costCenterColumn,
      userA: userAEmail,
      userB: userBEmail,
      textToType: 'my cost center'
    });

    UsersPage.cleanupTestDropDownColumn({
      columnSelector: userPageSelectors.costCenterColumn,
      userA: userAEmail,
      userB: userBEmail,
      textToType: CLEAR
    });
  });

  it('C13829797: verify department cell in users-page', { tags: ['@tier1'] }, () => {
    const userAEmail = `${USER_A}@${companyDomain}`;
    const userBEmail = `${USER_B}@${companyDomain}`;

    UsersPage.testCustomDropDownColumn({
      columnSelector: userPageSelectors.departmentColumn,
      userA: userAEmail,
      userB: userBEmail,
      textToType: 'my department'
    });

    UsersPage.cleanupTestDropDownColumn({
      columnSelector: userPageSelectors.departmentColumn,
      userA: userAEmail,
      userB: userBEmail,
      textToType: CLEAR
    });
  });

  it('C13829798: verify region cell in users-page', { tags: ['@tier1'] }, () => {
    const userAEmail = `${USER_A}@${companyDomain}`;
    const userBEmail = `${USER_B}@${companyDomain}`;

    UsersPage.testCustomDropDownColumn({
      columnSelector: userPageSelectors.regionColumn,
      userA: userAEmail,
      userB: userBEmail,
      textToType: 'my region'
    });

    UsersPage.cleanupTestDropDownColumn({
      columnSelector: userPageSelectors.regionColumn,
      userA: userAEmail,
      userB: userBEmail,
      textToType: CLEAR
    });
  });

  it('C13829799: verify subsidiary cell in users-page', { tags: ['@tier1'] }, () => {
    const userAEmail = `${USER_A}@${companyDomain}`;
    const userBEmail = `${USER_B}@${companyDomain}`;

    UsersPage.testCustomDropDownColumn({
      columnSelector: userPageSelectors.subsidiaryColumn,
      userA: userAEmail,
      userB: userBEmail,
      textToType: 'my subsidiary'
    });

    UsersPage.cleanupTestDropDownColumn({
      columnSelector: userPageSelectors.subsidiaryColumn,
      userA: userAEmail,
      userB: userBEmail,
      textToType: CLEAR
    });
  });

  it('C13829800: verify office column in users-page', { tags: ['@tier1'] }, () => {
    const userAEmail = `${USER_A}@${companyDomain}`;
    const columnSelector = userPageSelectors.companyOfficeColumn;
    const DEFAULT_OFFICE = 'Default office';

    UsersPage.clickOnUserSelector(userAEmail, columnSelector);
    UsersPage.selectUserInDropDown(CLEAR);

    UsersPage.clickOnUserSelector(userAEmail, columnSelector);
    UsersPage.clickOn(formatStr(userPageSelectors.dropDownSelection, DEFAULT_OFFICE));
    UsersPage.verifySelectorContent(userAEmail, columnSelector, DEFAULT_OFFICE);
  });

  it('C13829801: verify policy level column in users-page', { tags: ['@tier1'] }, () => {
    const userAEmail = `${USER_A}@${companyDomain}`;
    const columnSelector = userPageSelectors.policyLevelColumn;
    const EXECUTIVE = 'Executive';
    const DEFAULT = 'Default';

    UsersPage.clickOnUserSelector(userAEmail, columnSelector);
    UsersPage.clickOn(formatStr(userPageSelectors.dropDownSelection, EXECUTIVE));
    UsersPage.waitFor(apiWait.USERS_PATCH);
    UsersPage.verifySelectorContent(userAEmail, columnSelector, EXECUTIVE);

    UsersPage.clickOnUserSelector(userAEmail, columnSelector);
    UsersPage.clickOn(formatStr(userPageSelectors.dropDownSelection, DEFAULT));
    UsersPage.waitFor(apiWait.USERS_PATCH);
    UsersPage.verifySelectorContent(userAEmail, columnSelector, DEFAULT);
  });
});
