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

/**
 * Create company legal entity
 * @param authToken
 * @returns {IOrganization} Information
 */
export function createLegalEntityEU(
  authToken: string,
  legalEntitiesData: any
): Cypress.Chainable<IOrganization> {
  return cy
    .request({
      method: HttpRequest.Post,
      url: 'api/admin/billable_entities',
      headers: {
        Authorization: authToken,
        Accept: Accept.ApplicationJson
      },
      retryOnStatusCodeFailure: true,
      body: legalEntitiesData
    })
    .then(({ body, status }) => {
      const billUuId = body.uuid;
      expect(status, 'Successfully created legal entity').to.equal(HttpStatusCodes.Ok);
      const officeResponse = addOfficeEU(authToken, billUuId, true);
      officeResponse.then((response) => {
        const officeUuid = response.uuid;
        // eslint-disable-next-line @typescript-eslint/ban-ts-comment
        // @ts-ignore
        cy.getCurrentUserInfo();
        cy.task<string>('getDataFromCache', 'userInfo').then((userInfo: any) => {
          const userUuid = userInfo.sub;
          const userConfigs = {
            companyOfficeUuid: officeUuid
          };
          updateUserConfigurations(authToken, userUuid, userConfigs);
        });
      });

      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
 * @returns {ICreateCompany} Information
 */
export function addOfficeEU(
  authToken: string,
  billableEntityUuid: string,
  defaultOffice = true
): Cypress.Chainable<ICreateCompany> {
  const officeData = LegalData.generateEUOfficeData(billableEntityUuid, defaultOffice);

  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;
    });
}
