import { trainSearchSelector } from './search';

export const trainCardSelector = {
  addNewTrainCard: '[text="Add new train card"] button',
  searchNewLoyaltyCard: 'input[qaid="searchLoyalty"]',
  addTrainCard: '[class^="ta-button-v2 button button--ghost"]',
  cardNumber: '[formcontrolname="railCardNumber"]',
  expirationMonth: '[formcontrolname="expirationMonth"] button',
  expirationDay: '[formcontrolname="expirationDay"] button',
  expirationYear: '[formcontrolname="expirationYear"] button',
  selectOption: '[class="ta-select-option"]',
  addCard: '[id="addRailCardButton"] button',
  loyaltyCard: '[class="ta-train-card-status has-cards"]'
};

const randomMonth = Math.floor(Math.random() * 6) + 1;
const randomDay = Math.floor(Math.random() * 10) + 1;
export class TrainLoyaltyCard {
  static addTrainCard() {
    cy.get(trainSearchSelector.addTraveler).click();
    cy.get(trainCardSelector.addTrainCard).click();
    cy.wait('@waitForLoadTrainCard');
    cy.allure().logStep('Add train card');
    this.logStep();
  }
  static searchAndSelectLoyaltyCard(loyaltyCardName: string, loyaltyCardNumber: string) {
    cy.get(trainCardSelector.addNewTrainCard).click();
    cy.get(trainCardSelector.searchNewLoyaltyCard).type(loyaltyCardName);
    cy.allure().logStep('Search loyalty card');
    this.selectLoyaltyCard(loyaltyCardName);
    this.addCardDetails(loyaltyCardNumber);
    this.logStep();
  }
  static selectLoyaltyCard(loyaltyCardName: string) {
    cy.get(`[qaid="${loyaltyCardName}"]`).eq(0).click();
    this.logStep();
  }
  static addCardDetails(cardNumber: string) {
    this.addCardNumber(cardNumber);
    cy.get(trainCardSelector.expirationMonth).click();
    cy.get(trainCardSelector.selectOption).eq(randomMonth).click();
    cy.get(trainCardSelector.expirationDay).click();
    cy.get(trainCardSelector.selectOption).eq(randomDay).click();
    cy.get(trainCardSelector.expirationYear).click();
    cy.get('[aria-label="2037"]').click();
    this.saveAddedCard();
    cy.allure().logStep('Add card details');
    this.logStep();
  }
  static addCardNumber(cardNumber: string) {
    cy.get(trainCardSelector.cardNumber).type(cardNumber);
    cy.allure().logStep('Add card number');
  }
  static saveAddedCard() {
    cy.get(trainCardSelector.addCard).click();
    cy.allure().logStep('Save added card');
  }
  static logStep() {
    const callerName = (new Error().stack as string).split('\n')[2].trim();
    const stepName = callerName.substring(
      callerName.lastIndexOf('.') + 1,
      callerName.indexOf('(')
    );
    cy.allure().logStep(stepName);
  }
  static expectLoyaltyCardAdded() {
    cy.get(trainCardSelector.loyaltyCard).should('be.visible');
  }
}
