import { LoginPage } from '@admin-lib/index';
import { Timeouts } from '@utility-lib/constants';
import { TrainTripType, TrainSearch } from '@train-lib/index';

const conciergeFlowSelectors = {
  requestBooking: '.ta-button__content',
  offLineFormTripType: '.ta-offline-booking-modal__masked-data__header__trip-type',
  originStation: '.ta-offline-booking-modal__masked-data__station',
  saveTripInfo: '[qaid="tripCheckoutCreateButton"]',
  submitRequest: '[class="ta-offline-booking-modal__footer"] [type="submit"]',
  requestConfirmation: '.information__content',
  changePayment: '[class="ta-payment-card ta-payment-card--v2"]',
  addNewPaymentMessage: '.ta-payment-at-booking__disable',
  addNewPaymentMethodButton: '.ta-payment-at-booking__add-card',
  class: '.ta-offline-booking-modal__form__options',
  radioButton: '[type="radio"]'
};

export class ConciergeFlow {
  static assertStations(origin: string, destination: string) {
    cy.allure().logStep('verify  Stations');
    cy.get(conciergeFlowSelectors.originStation)
      .should('contain.text', origin)
      .and('contain.text', destination);
    cy.allure().logStep('station verified');
  }

  static checkAndClickRequestButton() {
    cy.get(conciergeFlowSelectors.requestBooking).contains('Request booking').click();
    cy.wait('@waitForRequestForm');
    cy.allure().logStep('Request booking button verified and clicked');
  }

  static assertTripType(tripType: string) {
    cy.allure().logStep('verify trip type ');
    cy.get(conciergeFlowSelectors.offLineFormTripType).should('contain.text', tripType);
    cy.allure().logStep('trip type verified');
  }

  static cannotAddNewPayment() {
    cy.allure().logStep('verify payment method are not allowed message');
    cy.get(conciergeFlowSelectors.changePayment).contains('Change payment').click();
    cy.get(conciergeFlowSelectors.addNewPaymentMessage).should(
      'contain.text',
      'Additional payment methods are not allowed for this booking.'
    );
    cy.allure().logStep(' payment method are not allowed message verfied');

    cy.get(conciergeFlowSelectors.addNewPaymentMethodButton).should('not.be.enabled');
    cy.allure().logStep('add new button is not enabled');
  }

  static completeOfflineForm() {
    this.checkMandatoryCheckboxes();
    cy.allure().logStep('save trip info');
    cy.get(conciergeFlowSelectors.saveTripInfo).click();
    cy.allure().logStep('trip info saved');
    this.cannotAddNewPayment();
    cy.allure().logStep('click on request button');
    cy.get(conciergeFlowSelectors.submitRequest).contains('Request').click();
    cy.wait('@waitForRequestForm');
    cy.get(
      conciergeFlowSelectors.requestConfirmation,
      Timeouts.MEDIUM_TIMEOUT_30_SEC
    ).should('contain.text', 'Your request has been sent');
    cy.allure().logStep('offline form submitted successfully ');
  }

  static checkMandatoryCheckboxes() {
    cy.get(conciergeFlowSelectors.class).each(($el) => {
      cy.wrap($el).find(conciergeFlowSelectors.radioButton).eq(0).click();
    });
  }

  static completeConciergeForm(origin: string, destination: string, tripType: string) {
    this.assertTripType(tripType);
    this.assertStations(origin, destination);
    this.completeOfflineForm();
  }

  static conciergeWithoutSearchButton(
    origin: string,
    destination: string,
    tripType: TrainTripType
  ) {
    LoginPage.createNewCompanyAndLoginWithUserByType();
    TrainSearch.visitTrainSearch();
    TrainSearch.setOrigin(origin);
    TrainSearch.setDestination(destination);
    TrainSearch.selectFutureTrainDate();
    TrainSearch.selectTripTileType(tripType);
  }
}
