import {
  HotelItinerary,
  bookHotel,
  Hotels,
  HotelSearchResults,
  HotelCheckout
} from '@hotel-lib/index';
import { TripTileType } from '@utility-lib/constants';
import { PersonalHomeScreen } from './personal_homescreen';

const UpsellSelector = {
  upsellBanner: '.trip-event-hotel-extend-stay',
  extendMyStayCta:
    '[class="trip-event-hotel-extend-stay__button ta-button ta-button--secondary-theme ta-button--small-size"]',
  addToTripModal: '.hotel-extend-stay-modal__header__title',
  tripToggle:
    '[class="hotel-extend-stay-form__button-toggle hotel-extend-stay-form__button-toggle--active"]',
  sameHotelButton:
    '[class="hotel-extend-stay-form__button-path hotel-extend-stay-form__button-path--active"]',
  changeHotelButton: '.hotel-extend-stay-form__button-path',
  findAvailabilityButton: '.ta-button__content',
  tripBleisureBanner: '.trip-card-bleisure-banner',
  bookDifferentHotelButton: '.ta-radio-button'
};

export class Itinerary {
  static verifyUpsellBanner(): void {
    cy.allure().logStep('check the extend my cta banner is present and clickable');
    cy.get(UpsellSelector.upsellBanner).should('exist');
    cy.get(UpsellSelector.extendMyStayCta).then((ele) => {
      cy.wrap(ele).click({ force: true });
      cy.wrap(ele).should('exist');
    });

    cy.get(UpsellSelector.addToTripModal).should('have.text', 'Add hotel to trip');
    cy.get(UpsellSelector.tripToggle).should('have.text', ' Personal ');
    cy.get(UpsellSelector.sameHotelButton).should(
      'include.text',
      'Stay at the same hotel'
    );
    cy.get(UpsellSelector.changeHotelButton).then((ele) => {
      cy.wrap(ele).should('include.text', 'Book a different hotel');
    });

    cy.get(UpsellSelector.findAvailabilityButton).contains(' Find availability ').click();
  }

  static extendSameHotel(): void {
    cy.allure().logStep('search for a room in same hotel');
    cy.get(UpsellSelector.extendMyStayCta).click();
    cy.allure().logStep('Find hotels in same room');
    cy.get(UpsellSelector.findAvailabilityButton).contains(' Find availability ').click();
    cy.wait('@waitForExtendHotel');
  }

  static extendDifferentHotel(): void {
    cy.allure().logStep('search for a room in different hotel');
    cy.get(UpsellSelector.extendMyStayCta).click();
    cy.allure().logStep('Find hotels in different room');
    cy.get(UpsellSelector.changeHotelButton).contains('Book a different hotel').click();
    cy.get(UpsellSelector.findAvailabilityButton).contains(' Find availability ').click();
  }

  static verifyItinerary(): void {
    cy.allure().logStep('verify itinerary shows personal pill');
    HotelItinerary.verifyHotelItineraryPage();
    HotelItinerary.verifyTripTile('Personal');
    Itinerary.expectNoUpsellBannerExist();
  }

  static expectNoUpsellBannerExist(): void {
    cy.allure().logStep('extend my stay banner not present');
    cy.get(UpsellSelector.upsellBanner).should('not.exist');
  }

  static createBusinessHotelBooking(): void {
    bookHotel('Business');
    HotelItinerary.visitItinerary();
    HotelItinerary.viewAndManageItinerary();
  }

  static dismissBookingModal(): void {
    cy.get(UpsellSelector.findAvailabilityButton).contains('Not now').click();
  }
  static createHotelBooking(tileType: TripTileType): void {
    Hotels.visitHotelSearch();
    Hotels.setCheckInCheckOutDate();
    PersonalHomeScreen.setHotelLocation('Seattle, WA, USA');
    Hotels.searchHotel();
    HotelSearchResults.selectHotel(0);
    HotelSearchResults.selectRoomOption();
    HotelCheckout.waitToBeLoaded();
    HotelCheckout.checkoutFLow(tileType);
    Itinerary.dismissBookingModal();
  }

  static tripBleisureBannerPresent(): void {
    cy.allure().logStep('verify extend my stay banner is shown on trips');
    cy.get(UpsellSelector.tripBleisureBanner).should('exist');
  }

  static clickTripBleisureBanner(): void {
    cy.allure().logStep('click extend my stay banner on trips');
    cy.get(UpsellSelector.findAvailabilityButton).contains('Extend your stay').click();
  }

  static extendYourStayModalVisible(): void {
    cy.allure().logStep('verify extend your stay modal is shown');
    cy.get(UpsellSelector.addToTripModal).should('have.text', 'Extend your stay');
  }

  static clickAvailbilityButton(): void {
    cy.allure().logStep('click check availability button');
    cy.get(UpsellSelector.findAvailabilityButton)
      .contains(' Check availability ')
      .click();
  }

  static clickBookDifferentHotelButton(): void {
    cy.allure().logStep('click book different hotel button');
    cy.get(UpsellSelector.bookDifferentHotelButton).eq(1).click();
  }

  static createBookingAndValidateBanner(): void {
    Itinerary.createHotelBooking('Business');
    HotelItinerary.visitItinerary();
    Itinerary.tripBleisureBannerPresent();
    Itinerary.clickTripBleisureBanner();
    Itinerary.extendYourStayModalVisible();
  }
  static clickFindAvailability(): void {
    cy.allure().logStep('initiate search for business hotel add to trip');
    cy.get(UpsellSelector.findAvailabilityButton)
      .contains(' Check availability ')
      .click();
  }
}
