import { LoginPage } from '@admin-lib/index';
import { User_Type } from '@support-onboard/index';
import {
  Hotels,
  HotelSearchResults,
  HotelItinerary,
  HotelCheckout,
  HotelInterceptApis
} from '@hotel-lib/index';
import { PaymentMethods, PaymentCheckout } from '../../../profile/lib';
import { paymentMethodData } from '@fixtures/payment-method/payment-method-data';
import { CommerceApiIntercepts } from '@commerce-shared-lib/api-intercepts';
import { LocationUtility } from '@utility-lib/location';

describe('Commerce: Payment during Checkout page', () => {
  beforeEach(() => {
    LoginPage.createNewCompanyAndLoginWithUserByType({
      providers: [],
      users: [User_Type.TRAVELER]
    });
    CommerceApiIntercepts.interceptCommerceApis();
    HotelInterceptApis.interceptHotelApis();

    Hotels.visitHotelSearch();
    Hotels.setCheckInCheckOutDate();
    Hotels.selectHotelLocation(LocationUtility.getCityUS());
    Hotels.searchHotel();
    HotelSearchResults.selectPrepayHotel();
    HotelSearchResults.selectHotel(0);
    HotelSearchResults.selectPrepayRoomFilter();
    HotelSearchResults.selectRoomOption();
    HotelCheckout.waitToBeLoaded();
    HotelCheckout.setTripInfo();
    HotelCheckout.hotelCancellationAndChargePolicy();
    HotelCheckout.acceptHotelBookingPolicy();
    HotelCheckout.setPhoneNumber();
    HotelCheckout.checkIfProofOfVaccineRequired();

    PaymentCheckout.addCardInCheckout();
  });

  afterEach(() => {
    HotelCheckout.acceptAcknowledgement();
    HotelCheckout.bookNow();
    HotelCheckout.expectHotelBookedSuccessfully('Hotel confirmed!');
    HotelItinerary.verifyHotelItineraryPage();

    // Deleting card after completing checkout
    PaymentMethods.visitPage();
    PaymentMethods.deletePaymentMethod(1);
  });

  it(
    'C667105 C667104: Should be able to add and edit a personal card to profile from checkout',
    { tags: ['@tier1'] },
    () => {
      PaymentCheckout.chooseTypeOfCard(0);

      // Adding a personal card
      PaymentMethods.enterNickname(paymentMethodData.nickname);
      PaymentMethods.enterFullName();
      PaymentMethods.enterPaymentMethodInfo();
      PaymentMethods.clickOnSavePayment();

      PaymentCheckout.checkIfCardIsSelected(paymentMethodData.nickname);
      PaymentCheckout.checkIfCardIsInList(paymentMethodData.nickname);

      // Editing a personal card
      PaymentMethods.editCard(1);
      PaymentCheckout.checkIfCardIsInList(paymentMethodData.creditCard._fullName);
    }
  );

  it(
    'C667103: Should be able to add a company card to profile from checkout',
    { tags: ['@tier1'] },
    () => {
      PaymentCheckout.chooseTypeOfCard(1);

      // Add a company card
      PaymentMethods.enterNickname(paymentMethodData.nickname);
      PaymentMethods.enterFullName();
      PaymentMethods.enterPaymentMethodInfo();
      PaymentMethods.clickOnSavePayment();

      PaymentCheckout.checkIfCardIsSelected(paymentMethodData.nickname);
      PaymentCheckout.checkIfCardIsInList(paymentMethodData.nickname);
    }
  );
});
