import { Utility, Timeouts } from '@utility-lib/index';
import { CarInvoiceValidation } from '@commerce-lib/cars/invoice_validation';
import { Invoice } from '@commerce-lib/invoice/invoice';
import { CommerceShared } from '@commerce-shared-lib/shared';

const rentalCarSelector = {
  itineraryBody: '.itinerary__content-body__item',
  carName: '.ta-trip-event-car-details__title',
  checkInDate: 'div[class$="ta-trip-event-car-details__labels"]:contains("Check-in")+div',
  checkOutDate: 'div[class$="ta-trip-event-car-details__labels"]:contains("Check-out")+div',
  tripactionsBookingId: 'div[class$="ta-trip-event-car-booking__labels"]:contains("TripActions")+div',
  manageItinerary: '[class^="ta-trip-card-v2__actions"] .ta-button__content',
  itineraryListDate: '[qaid="itineraryListDate"]',
  roomTypeDetails: '[class^="ta-trip-event-car-room-details__link ta-button ta-button--link-theme"]',
  carDetailHeader: '.ta-modal-header',
  roomOverview: '.room-details',
  cancelCar: '[qaid="eventActionCancelCar"]',
  downLoadInvoice: '[qaid="eventActionDownloadInvoice"]',
  creditCardCheckIn: '[class^="trip-car__payment-title"]',
  carBookingId: '.trip-event-card-car-list__content ng-star-inserted'
};

export class RentalCarItinerary {
  static waitToBeLoaded(): void {
    cy.url().then((url) => {
      const getUrl = url;
      cy.log('<<< CAR Itinerary URL is >>>: ' + getUrl);
      cy.task('putDataInCache', {
        key: 'ItineraryURL',
        data: getUrl
      });
    });
  }

  static visitItinerary() {
    cy.intercept('GET', /api\/v2\/trip\/car\/search\/suggestions/).as('waitForTripItinerary');
    Utility.selectNavItem('TRIPS');
    cy.wait('@waitForTripItinerary');
    cy.allure().logStep('visit itinerary');
  }

  static viewAndManageItinerary() {
    cy.get(rentalCarSelector.manageItinerary).click();
    cy.wait('@waitForManageItinerary');
    cy.allure().logStep('view and manage itinerary');
  }

  static expectNoItineraryIsPresent(noOfItineraries: number) {
    cy.get(rentalCarSelector.itineraryListDate, Timeouts.MAX_TIMEOUT_120_SEC).should('have.length', noOfItineraries);
    cy.allure().logStep(`expect ${noOfItineraries} itinerary is present`);
  }

  static expectCarDetailPageIsPresent() {
    cy.get(rentalCarSelector.roomTypeDetails).click();
    cy.get(rentalCarSelector.roomOverview).should('be.visible');
  }

  static cancelCar() {
    Utility.cancelTrip('Car');
    Utility.selectCancellationReason('Change of plans');
    //cy.wait(Timeouts.MEDIUM_TIMEOUT_20_SEC.timeout);
    Utility.confirmCancellation();
    Utility.expectCancelledLabelIsPresent();
  }

  static verifyTripFeeInInvoice(): void {
    CarInvoiceValidation.checkInvoiceBookingId();
    CommerceShared.visitViewInvoicePage();
    Invoice.retrieveDownloadInvoiceFile();
    Invoice.retrieveAndConvertPDFInvoiceDetailsToHTML();
    CarInvoiceValidation.checkInvoiceTAFee();
    CarInvoiceValidation.checkInvoiceTripeFee();
    CarInvoiceValidation.checkInvoiceBookingId();
    //TODO  StripeValidation.validateStripeFee(); //! This is not working as expected https://navancorp.atlassian.net/browse/QTA-3005
  }
}
