import { Timeouts, utilitySelector } from '@utility-lib/index';
import { HttpStatusCodes } from 'cypress/support/base';

export const rentalCarSearchResultSelector = {
  carCard: '[class^="ta-car-card__main"]',
  agencyLogo: '[data-testid = "carLogo"]',
  agencyFilter: '[qaid="agencyFilter"] [data-testid="activeFilter"]',
  agencyCheckbox: '[class^="filter-boolean__wrapper"]',
  selectCar: '[qaid="selectCarButton"]',
  mapPoint: '[class^="cars-map__pin-container"]',
  filterLocation: '[class^="marker-body__car-types"] .ta-button__content',
  filteredLocation: '[class^="marker-body__filter"]',
  carLogo: '[class^="marker-body__single-car-logo"][alt="National"]',
  filterLocationButton: '[class^="marker-body__button"]',
  searchCarFromSearchResults: '[class="cars-header"] [type="submit"]',
  dAndCLocationButton: '[class="ta-car-features__item"] button',
  locationDetail: '[class="car-location-popup__title"]',
  hotelLocationsPopup: '[class="car-location-popup__details"]',
  carOptionsFilter: '[qaid="carOptionsFilter"]',
  directBillTags: '[class^="ta-car-tags__container"]',
  searchLoader: '[class="ta-search__track"]',
  policyBanner: '[class="out-of-policy-banner__max-price"]',
  policyPopUp: '[class="out-of-policy-banner__policy-link"] a',
  policyText: '[class="basic-row"] [class="basic-row__text"]',
  closePolicyPopUp:
    '[class^="ta-modal-header ta-modal-header--no-bottom-padding"] button',
  policyIcon: '[class="ta-car-card__price-info"] [icon="policy-slash"]',
  popOverText: '[class^="popover-content--text"]'
};

export class RentalCarSearchResults {
  static selectCar() {
    cy.allure().logStep(`Select car from the search result`);
    cy.get(rentalCarSearchResultSelector.selectCar).eq(0).click();
    cy.wait('@waitForSelectCar').then((Interception) => {
      if (Interception.response?.statusCode !== HttpStatusCodes.Ok) {
        cy.log(`Retrying to find the new car.`);
        cy.get(rentalCarSearchResultSelector.selectCar).eq(1).click();
      }
    });
  }

  static chooseCarFromMap() {
    cy.allure().logStep('find and select car from map');
    cy.wait('@waitForMapLoad');
    cy.get(rentalCarSearchResultSelector.mapPoint).eq(0).click();
    cy.get(utilitySelector.bodySelector).then((filterAgencies) => {
      if (
        filterAgencies.find(rentalCarSearchResultSelector.filterLocationButton).length > 0
      ) {
        cy.contains('Filter to this location').click({ force: true });
      } else {
        cy.get(rentalCarSearchResultSelector.filterLocation).eq(0).click();
      }
    });
  }

  static expectFilteredLocationShowedInList() {
    cy.allure().logStep('expect filtered location showed in list');
    cy.get(rentalCarSearchResultSelector.filteredLocation).eq(0).should('be.exist');
  }
  static searchCarFromSearchResults() {
    cy.get(rentalCarSearchResultSelector.searchCarFromSearchResults).click();
    cy.wait('@waitForCarSearchResults');
  }

  static getCarLocation() {
    cy.get('[data-testid="locationSearchField"] input')
      .invoke('val')
      .then((hotelLocation) => {
        const hotelLocationString = JSON.stringify(hotelLocation);
        cy.log(hotelLocationString);
        cy.task('putDataInCache', {
          key: 'hotelLocation',
          data: hotelLocationString
        });
      });
  }

  static expectPolicyMaximumPriceIs() {
    cy.get(rentalCarSearchResultSelector.policyBanner).should(
      'contain',
      `$5 and up is out of policy.`
    );
    this.expectPolicyTypeIsPresent('Maximum price for this search is $5');
  }

  static expectPolicyTypeIsPresent(policyDetails: string) {
    cy.get(rentalCarSearchResultSelector.policyPopUp).click({ force: true });
    cy.wait('@waitForPolicyFile');
    cy.get(rentalCarSearchResultSelector.policyText).contains(`${policyDetails}`);
    cy.get(rentalCarSearchResultSelector.closePolicyPopUp).click({
      timeout: 10000,
      force: true
    });
    cy.wait(Timeouts.SHORT_TIMEOUT_2_SEC.timeout);
  }

  static expectCarTypeIsPresent() {
    this.expectPolicyTypeIsPresent(
      'Allowed car types: Electric, Standard, Economy and Compact'
    );
  }
  static expectOutOfPolicyIconAndReasonIsPresent(reason: string) {
    cy.wait(Timeouts.SHORT_TIMEOUT_2_SEC.timeout);
    cy.get(rentalCarSearchResultSelector.policyIcon).eq(0).click();
    cy.get(rentalCarSearchResultSelector.popOverText).should('contain', `${reason}`);
  }
}
