const { AuthenticatedPage } = require('../authenticated-page');
const { DeleteRoleModal } = require('./delete-role-modal');

export class AdminRolesPage extends AuthenticatedPage {
  screenshotPath = '/admin-roles';

  /**
   * @param {import('@playwright/test').Page} page
   */
  constructor(page) {
    super(page);
    this.roleDrawerLink = page.getByTestId('roles-drawer-link');
    this.createRoleButton = page.getByTestId('create-role');
    this.deleteRoleModal = new DeleteRoleModal(page);
    this.roleRow = page.getByTestId('role-row');
    this.rolesLoader = page.getByTestId('roles-list-loader');
    this.pageTitle = page.getByTestId('roles-page-title');
  }

  /**
   *
   * @param {boolean} isMobile - navigation on smaller devices requires the
   * user to open up the drawer menu
   */
  async navigateTo(isMobile = false) {
    await this.profileMenuButton.click();
    await this.adminMenuItem.click();
    if (isMobile) {
      await this.drawerMenuButton.click();
    }
    await this.roleDrawerLink.click();
    await this.isMounted();
    await this.rolesLoader.waitFor({
      state: 'detached',
    });
  }

  /**
   * @param {string} name
   */
  async getRoleRowByName(name) {
    await this.rolesLoader.waitFor({
      state: 'detached',
    });
    return this.roleRow.filter({
      has: this.page.getByTestId('role-name').getByText(name, { exact: true }),
    });
  }

  /**
   * @param {import('@playwright/test').Locator} row
   */
  async getRowData(row) {
    return {
      role: await row.getByTestId('role-name').textContent(),
      description: await row.getByTestId('role-description').textContent(),
      canEdit: await row.getByTestId('role-edit').isEnabled(),
      canDelete: await row.getByTestId('role-delete').isEnabled(),
    };
  }

  /**
   * @param {import('@playwright/test').Locator} row
   */
  async clickEditRole(row) {
    await row.getByTestId('role-edit').click();
  }

  /**
   * @param {import('@playwright/test').Locator} row
   */
  async clickDeleteRole(row) {
    await row.getByTestId('role-delete').click();
    return this.deleteRoleModal;
  }

  async editRole(subject) {
    const row = await this.getRoleRowByName(subject);
    await this.clickEditRole(row);
  }
}
