import { LoginPage } from '@admin-lib/index';
import { GuestTravelInfo, UserModal } from '@profile-lib/index';
import { createGuestDetails, createName, GuestDetails } from '@support-user/index';
import { Provider_Type, User_Type } from '@support-onboard/index';

describe('Trips: Profile: Guest travel info', () => {
  beforeEach(() => {
    GuestTravelInfo.interceptApis();
    UserModal.interceptApis();
    LoginPage.createNewCompanyAndLoginWithUserByType({
      providers: [Provider_Type.EXPEDIA_FLIGHT, Provider_Type.ALL_CAR],
      users: [User_Type.TRAVELER]
    });
    GuestTravelInfo.visitPage();
  });

  it('C574604: should create business guest', { tags: ['@tier1'] }, () => {
    const guestDetails = createGuestDetails(30, 'MALE', 'Business');
    createUser(guestDetails);
    editGuest(guestDetails);
    deleteGuest(guestDetails);
  });

  const createUser = (guestDetails: GuestDetails) => {
    GuestTravelInfo.waitToBeLoaded();
    GuestTravelInfo.openNewTravelerModal();

    const {
      givenName = '',
      familyName = '',
      email = '',
      phoneNumber = '',
      age = 30,
      travelerType = 'Business'
    } = guestDetails;

    UserModal.fillTravelerType(travelerType);
    UserModal.fillTravelerName(givenName, familyName);
    UserModal.fillBirthday(age);
    UserModal.fillGender('MALE');
    UserModal.fillEmail(email);
    UserModal.fillPhoneNumber(phoneNumber);
    if ('Business' === travelerType) {
      UserModal.checkCostFields();
    }
    UserModal.save();
    GuestTravelInfo.expectGuestToExists({
      email,
      firstName: givenName,
      lastName: familyName
    });
  };

  const editGuest = (guestDetails: GuestDetails) => {
    const { givenName = '', familyName = '', email = '' } = guestDetails;
    GuestTravelInfo.openEditTravelerModal(givenName, familyName);

    const newGivenName = createName(8);
    const newFamilyName = createName(8);

    UserModal.fillTravelerName(newGivenName, newFamilyName);
    UserModal.edit();

    GuestTravelInfo.waitToBeLoaded();
    GuestTravelInfo.waitUpdateList();
    GuestTravelInfo.expectGuestToExists({
      email,
      firstName: newGivenName,
      lastName: newFamilyName
    });
  };

  const deleteGuest = (guestDetails: GuestDetails) => {
    const { givenName = '', familyName = '' } = guestDetails;
    GuestTravelInfo.deleteTraveler(givenName, familyName);

    GuestTravelInfo.waitToBeLoaded();
    GuestTravelInfo.waitUpdateList();
    GuestTravelInfo.expectToHaveNoGuests();
  };
});
