import { ICreateCompany } from '../interface/company';
import { IOrganization } from '../interface/organization';
import { HttpRequest, HttpStatusCodes, Accept } from '../utilities/api';
import { LegalData } from './data/legal';

const DEFAULT_STAGING_PRIME_AGENCY_COMPANY_ASSOCIATION_UUID =
  '61579ca9-3d77-45bf-b05c-f4eefc202153';

/**
 * Create company legal entity
 * @param authToken
 * @returns {IOrganization} Information
 */
export function createLegalEntity(authToken: string): Cypress.Chainable<IOrganization> {
  const legalEntitiesData = LegalData.generateLegalEntitiesData();

  return cy
    .request({
      method: HttpRequest.Post,
      url: 'api/admin/billable_entities',
      headers: {
        Authorization: authToken,
        Accept: Accept.ApplicationJson
      },
      retryOnStatusCodeFailure: true,
      body: legalEntitiesData
    })
    .then(({ body, status }) => {
      expect(status, 'Successfully created legal entity').to.equal(HttpStatusCodes.Ok);

      return cy
        .request({
          method: HttpRequest.Patch,
          url: 'api/admin/company',
          headers: {
            Authorization: authToken,
            Accept: Accept.ApplicationJson
          },
          retryOnStatusCodeFailure: true,
          body: { defaultBillableEntityUuid: null }
        })
        .then(({ status }) => {
          expect(status, 'Successfully updated default billable entity').to.equal(
            HttpStatusCodes.Ok
          );
          return body;
        });
    });
}

/**
 * Add office to given legal entity
 * @param authToken
 * @param billableEntityUuid
 * @param defaultOffice
 * @param agencyCompanyAssociationUuid
 * @returns {ICreateCompany} Information
 */
export function addOffice(
  authToken: string,
  billableEntityUuid: string,
  defaultOffice = true,
  agencyCompanyAssociationUuid = DEFAULT_STAGING_PRIME_AGENCY_COMPANY_ASSOCIATION_UUID
): Cypress.Chainable<ICreateCompany> {
  const officeData = LegalData.generateOfficeData(
    billableEntityUuid,
    defaultOffice,
    agencyCompanyAssociationUuid
  );
  return cy
    .request({
      method: HttpRequest.Post,
      url: 'api/admin/company/offices',
      headers: {
        Authorization: authToken,
        Accept: Accept.ApplicationJson
      },
      retryOnStatusCodeFailure: true,
      body: officeData
    })
    .then(({ body, status }) => {
      expect(status, 'Successfully added office to given legal entity').to.equal(
        HttpStatusCodes.Ok
      );
      return body;
    });
}
