import { TeamEventParamsStringInvitees } from '@group-events-lib/interface';

Cypress.Commands.add(
  'createGroupEventViaApi',
  (teamEventParams: TeamEventParamsStringInvitees) => {
    if (!AUTH_TOKEN) {
      throw new Error('Please login before calling api endpoints');
    }

    const eventDataBody = generateEventData(teamEventParams);

    createTeamEvent(eventDataBody).then(({ travelEvent }) => {
      addParticipants(travelEvent.id, teamEventParams.inviteeIdsOrEmails);

      sendTeamInvitation(travelEvent.id);

      getParticipant(travelEvent.id).then((participant) => {
        cy.log('PARTICIPANTS: ' + JSON.stringify(participant));
        const eventItemBody = generateParticipantDataWithCarsTrains(participant);

        editParticipant(travelEvent.id, eventItemBody);
      });
    });
  }
);

import { HttpRequest, HttpStatusCodes } from '../base';
import { AUTH_TOKEN } from '../commands';

import { generateEventData, generateParticipantDataWithCarsTrains } from './factory';

function createTeamEvent(body: any): Cypress.Chainable<any> {
  return cy
    .request({
      method: HttpRequest.Post,
      url: '/api/v1/user/travel-events',
      headers: {
        Authorization: AUTH_TOKEN
      },
      body,
      failOnStatusCode: true
    })
    .then(({ status, body }) => {
      expect(status, 'Team event created').to.equal(HttpStatusCodes.Ok);

      return body;
    });
}

function addParticipants(
  eventId: string,
  inviteeEmails: string[]
): Cypress.Chainable<any> {
  return cy
    .request({
      method: HttpRequest.Post,
      url: `/api/v1/user/travel-events/${eventId}/invitations/bulk-create`,
      headers: {
        Authorization: AUTH_TOKEN
      },
      body: {
        participants: inviteeEmails.map((email) => {
          return { email: email };
        })
      },
      failOnStatusCode: true
    })
    .then(({ status, body }) => {
      expect(status, 'Participants are added to the event').to.equal(HttpStatusCodes.Ok);

      return body;
    });
}

function getParticipant(eventId: string): Cypress.Chainable<any> {
  cy.allure().logStep('retrieve event item');
  return cy
    .request({
      method: HttpRequest.Get,
      url: `api/v1/user/travel-events/${eventId}/invitations?size=20&page=0`,
      headers: {
        Authorization: AUTH_TOKEN
      },
      failOnStatusCode: true
    })
    .then(({ body, status }) => {
      expect(status, 'Participant data received').to.equal(HttpStatusCodes.Ok);
      return body.invitations.content[0];
    });
}

function editParticipant(eventId: string, body: any) {
  console.log('TRYING HERE: ' + JSON.stringify(body));
  return cy
    .request({
      method: HttpRequest.Put,
      url: `/api/v1/user/travel-events/${eventId}/invitations/${body.id}`,
      headers: {
        Authorization: AUTH_TOKEN
      },
      body: { updatedInvitation: body },
      failOnStatusCode: true
    })
    .then(({ status }) => {
      expect(status, 'Participant is updated').to.equal(HttpStatusCodes.Ok);
    });
}

function sendTeamInvitation(eventId: string) {
  cy.request({
    method: HttpRequest.Post,
    url: `/api/v1/user/travel-events/${eventId}/activate`,
    headers: {
      Authorization: AUTH_TOKEN
    },
    failOnStatusCode: true
  }).then(({ status }) => {
    expect(status, 'Team event invitation is sent').to.equal(HttpStatusCodes.Ok);
  });
}
