import { IUserList, IUser } from '../interface/company';
import { IUserConfigs } from '../interface/configs';
import { HttpRequest, HttpStatusCodes, Accept } from '../utilities/api';

/**
 * Get list of users
 * @param authToken
 * @param page
 * @param size
 * @param enabled
 * @param roles
 * @returns {IUserList} Information
 */
export function getUsersList(
  authToken: string,
  page = 0,
  size = 10,
  enabled = true,
  roles?: string
): Cypress.Chainable<IUserList> {
  return cy
    .request({
      method: HttpRequest.Get,
      url: `api/admin/users`,
      headers: {
        Authorization: authToken,
        Accept: Accept.ApplicationJson
      },
      retryOnStatusCodeFailure: true,
      qs: {
        page: page,
        size: size,
        enabled: enabled,
        roles: roles
      }
    })
    .then(({ body, status }) => {
      expect(status, 'Users list returned').to.equal(HttpStatusCodes.Ok);
      return body;
    });
}

/**
 * Update given user configurations
 * @param authToken
 * @param userUuid
 * @param userConfigs
 * @returns {IUser} Information
 */
export function updateUserConfigurations(
  authToken: string,
  userUuid: string,
  userConfigs: IUserConfigs
): Cypress.Chainable<IUser> {
  return cy
    .request({
      method: HttpRequest.Patch,
      url: `api/admin/users/${userUuid}`,
      headers: {
        Authorization: authToken,
        Accept: Accept.ApplicationJson
      },
      retryOnStatusCodeFailure: true,
      body: userConfigs
    })
    .then(({ body, status }) => {
      expect(status, 'User configurations updated').to.equal(HttpStatusCodes.Ok);
      return body;
    });
}
