import { bookingVerticalType, Timeouts, Utility } from '@utility-lib/index';

const flightItinerarySelector = {
  viewTripsButton:
    '.booking-complete-others__left__buttons .ta-button.ta-button--medium-size.ta-button--primary-color.ta-button--primary-theme',
  closeSuggestHotelModalButton: '[qaid="bookingSuccessClose"] ta-svg-image',
  itineraryBody: '.itinerary__content-body__item',
  addToExistingTrip: 'ta-add-to-trip-dropdown',
  selectBookingType:
    '[class="add-to-trip-dropdown-popover ng-star-inserted"] [role="button"]',
  viewItinerary: '.navan-trip-card',
  bookingCard: 'button[qaid="goToItinerary"]',
  bookingId:
    'div[class$="trip-event-card-flight__booking-info__key"]:contains("Navan")+div',
  tripactionsBookingId:
    'div[class$="trip-event-card-flight__booking-info__key"]:contains("TripActions")+div',
  goToItinerary: '[qaid="goToItinerary"]',
  changeFlightButton: '.ta-trip-card-v2 .ta-trip-card-v2__actions-change',
  tripTimeline: 'ta-trip-timeline',
  tripTimelineCardDetails: '[class^="trip-event-card-flight__seats__wrapper"]',
  flightBookingId: '.trip-event-card-flight__booking-info__row div',
  departureLocation: '[qaid="flightCardMiniDepartureAirport"]',
  arrivalLocation: '[qaid="flightCardMiniArrivalAirport"]',
  airline: '.trip-event-card-flight__flight-info__flight-card',
  airlineLoyaltyCard: ':is([class="ta-loyalty-card"], [class^="airline-club-banner"])',
  itineraryPageChangeFlightButton: '[qaid="eventActionChangeFlight"]'
};

export class FlightItinerary {
  static waitToBeLoaded(): void {
    cy.allure().logStep('wait for flight itinerary page APIs to complete');
    cy.wait('@tickets').then((interception) => {
      cy.task('putDataInCache', {
        key: 'bookingUuid',
        data: interception.request.url.split('/')[8]
      });
    });
    cy.get(flightItinerarySelector.flightBookingId)
      .eq(1)
      .then((element) => {
        cy.task('putDataInCache', {
          key: 'bookingID',
          data: element.text().trim()
        });
      });
    cy.url().then((url) => {
      const getUrl = url;
      cy.log('<<< Flight Itinerary URL is >>>: ' + getUrl);
      cy.task('putDataInCache', {
        key: 'ItineraryURL',
        data: getUrl
      });
    });
  }

  static loadAndTicketFlightBooking(): void {
    cy.wait('@waitForFlightTickets');
    cy.task('getDataFromCache', 'bookingUuid').then((bookingUuid) => {
      cy.ticketFlightBookingWithoutLogin(bookingUuid);
    });
  }

  static loadFirstTripItemItinerary(): void {
    cy.visit('app/user2/trips');
    FlightItinerary.goToItineraryPage();
    cy.wait('@waitForFlightTickets');
  }

  static initiateFlightExchange(): void {
    cy.get(flightItinerarySelector.itineraryPageChangeFlightButton).click();
    cy.wait('@waitForFlightTickets');
  }

  static syncAndTicketFlightBooking(): void {
    cy.task('getDataFromCache', 'bookingUuid').then((bookingUuid) => {
      cy.task('getDataFromCache', 'agencyUuid').then((agencyData) => {
        cy.task('getDataFromCache', 'bookingID').then((bookingID) => {
          console.log(bookingID);
          console.log(agencyData);
          console.log(bookingUuid);
          cy.ticketAndSyncFlightBooking(bookingUuid, agencyData, bookingID);
        });
      });
    });
  }

  static forcePDFSyncAPI(): void {
    cy.task('getDataFromCache', 'bookingUuid').then((bookingUuid) => {
      cy.forcePDFSyncAPI(bookingUuid);
      cy.allure().logStep('Force PDF Sync API Call bookingUuid-> ' + bookingUuid);
    });
  }

  static retrieveFlightBookingPDF(): void {
    cy.task('getDataFromCache', 'bookingUuid').then((bookingUuid) => {
      cy.retrieveDownloadPDF(bookingUuid);
    });
  }

  static viewItineraryPage(): void {
    cy.allure().logStep('Go to itinerary page');
    let isSuggestHotelFlow = false;
    cy.task('getDataFromCache', 'suggestedHotelSearch').then(
      (suggestedHotelSearch: any) => {
        isSuggestHotelFlow = suggestedHotelSearch;
        const selector = suggestedHotelSearch
          ? flightItinerarySelector.closeSuggestHotelModalButton
          : flightItinerarySelector.viewTripsButton;
        cy.get(selector).eq(0).click();
        if (!isSuggestHotelFlow) {
          cy.get(flightItinerarySelector.goToItinerary, Timeouts.MEDIUM_TIMEOUT_60_SEC)
            .eq(0)
            .should('be.visible')
            .click({ force: true });
        }
      }
    );
  }

  static openTrip() {
    Utility.openTrip();
  }

  static verifyFlightItineraryPage(): void {
    cy.allure().logStep('wait for flight itinerary page to be loaded');
    cy.get(flightItinerarySelector.bookingId).then((ele) => {
      cy.wrap(ele).scrollIntoView();
      cy.wrap(ele).should('be.visible');
    });
  }

  static cancelFlight(optional = false) {
    Utility.closeSurveyIfExists();
    Utility.cancelTrip('Flight');
    Utility.selectCancellationReason('Change of plans');
    if (!optional) {
      Utility.confirmFlightCancellation();
      Utility.expectCancelledLabelIsPresent();
    }
  }

  static addNewTripInCurrentItinerary(bookingType: bookingVerticalType) {
    cy.get(flightItinerarySelector.addToExistingTrip).click();
    cy.get(flightItinerarySelector.selectBookingType).contains(bookingType).click();
    cy.allure().logStep(`add new trip type ${bookingType} in current itinerary`);
  }

  static changeFlight() {
    cy.allure().logStep('change flight');
    cy.get(flightItinerarySelector.changeFlightButton).eq(0).click();
  }

  static visitFlightItineraryPageByTripUuid(tripUuid: string) {
    cy.allure().logStep('Visit flight itinerary page');
    cy.visit(`app/user2/trips/${tripUuid}/itinerary`);
    cy.wait('@waitForTripTimeline');
  }

  static getTripUuidFromCacheAndVisitFlightItineraryPage() {
    cy.task('getDataFromCache', 'tripUuid').then((tripUuid: any) => {
      expect(tripUuid, 'TripUuid should not be null').to.not.be.null;
      this.visitFlightItineraryPageByTripUuid(tripUuid);
    });
  }

  static verifyNumberOfPassengers(numberOfPassengers: number) {
    cy.allure().logStep(`verify number of passengers is ${numberOfPassengers}`);
    cy.get(flightItinerarySelector.tripTimeline).contains('Departs').click();
    Cypress._.times(numberOfPassengers, (iteration) => {
      cy.get(flightItinerarySelector.tripTimelineCardDetails).contains(
        `Passenger ${iteration + 1}`
      );
    });
  }
  static goToItineraryPage() {
    cy.task('getDataFromCache', 'ItineraryURL').then((searchURL: any) => {
      cy.visit(searchURL);
    });
  }
  static getFlightDetail() {
    cy.get(flightItinerarySelector.arrivalLocation).then((element: any) => {
      cy.task('putDataInCache', {
        key: 'arrivalLocation',
        data: element.text().trim()
      });
    });
    cy.get(flightItinerarySelector.departureLocation).then((element: any) => {
      cy.task('putDataInCache', {
        key: 'departureLocation',
        data: element.text().trim()
      });
    });
    cy.get(flightItinerarySelector.airline).then((element) => {
      const airlineName = element.text().split(' ')[0];
      const flightName = element.text().split(' ')[1];
      const flightCode = flightName.substring(flightName.indexOf(' ') + 1);
      const airlineCode = flightCode.substring(0, 2);
      const flightNumber = flightCode.substring(2);
      cy.task('putDataInCache', {
        key: 'airline',
        data: airlineName.trim()
      });
      cy.task('putDataInCache', {
        key: 'airlineCode',
        data: airlineCode.trim()
      });
      cy.task('putDataInCache', {
        key: 'flightNumber',
        data: flightNumber.trim()
      });
    });
  }

  static expectLoyaltyPointsIsPresent() {
    Utility.closeSurveyIfExists();
    cy.get(flightItinerarySelector.airlineLoyaltyCard).should('be.visible');
  }

  static sabreSyncFlightBooking(): void {
    cy.task('getDataFromCache', 'agencyUuid').then((agencyData) => {
      cy.task('getDataFromCache', 'bookingID').then((bookingID) => {
        cy.sabreSyncFlightBooking(agencyData, bookingID);
      });
    });
  }
}
