import {
  TrainCheckout,
  TrainSearch,
  TrainSearchResults,
  TrainInterceptApis,
  FakeProviderStations
} from '@train-lib/index';
import { factory } from '@admin-factory/index';
import { LoginPage } from '@admin-lib/index';
import { User_Type } from '@support-onboard/index';
import { Utility } from '@utility-lib/index';

import { GuestInviteUtility, GuestTravelUtility } from '@admin-factory/factory';
import { UtilityIntercept } from '@utility-lib/api-intercept';
import { SplitUtility } from '@split-lib/index';

describe('GME: Guest invite booking', () => {
  it(
    'C51011: FE - Train booking in the Guest invite',
    { tags: ['@tier1', '@fake'] },
    () => {
      UtilityIntercept.interceptBaseApis();
      LoginPage.createNewCompanyAndLoginWithUserByType({ users: [User_Type.ADMIN] });

      cy.updateSplits();
      SplitUtility.isSplitOn('GROUP_TRAVEL_REFACTOR').then((refactored) => {
        if (refactored) {
          GuestTravelUtility.createGuestTravelForTraveler(factory.createTrainGuestTravel);
        } else {
          GuestInviteUtility.createGuestInviteForTraveler(factory.createTrainGuestInvite);
        }
      });

      TrainInterceptApis.interceptTrainApis();
      Utility.visitSearchPage();

      TrainSearch.verifyTrainSearchInvite('TrainEvent');
      TrainSearch.setOrigin(FakeProviderStations.DepartureStation);
      TrainSearch.setDestination(FakeProviderStations.DestinationStation);
      TrainSearch.searchTrain();
      TrainSearchResults.expectSearchResultPresent();
      TrainSearchResults.proceedToCheckoutPage();
      TrainCheckout.setNewTripName();
      TrainCheckout.acceptAcknowledgement();
      TrainCheckout.bookTrain();
      TrainCheckout.confirmBooking();
      TrainCheckout.confirmTripByInvitation();
    }
  );
});
