import { verticalType, Timeouts } from '@utility-lib/index';
import { ProfileInterceptApis } from '@profile-lib/index';

const loyaltySelectors = {
  addCarLoyalty: '[qaid="Add car loyalty"]',
  addFlightLoyalty: '[qaid="Add flight loyalty"]',
  addHotelLoyalty: '[qaid="Add hotel loyalty"]',
  addTrainLoyalty: '[qaid="Add train card"]',
  searchLoyaltyInput: '[qaid="searchLoyalty"]',
  loyaltyNumberInput: '[formcontrolname="loyaltyNumber"]',
  railNumberInput: '[formcontrolname="railCardNumber"]',
  submitNewLoyaltyCard: '[qaid="addLoyaltyCard"]',
  submitNewRailCard: '#addRailCardButton',
  loyaltyCardEntry: '.ta-loyalty-card__card-name',
  railCardEntry: '.ta-rail-card__card-name',
  loyaltyProgramsPage: '/app/user2/profile?tab=loyaltyPrograms',
  loyaltyAgency: (loyaltyAgency: string) => `[qaid="${loyaltyAgency}"]`
};

type SelectVerticalType = Partial<Record<verticalType, () => void>>;

export class LoyaltyPrograms {
  static visitProfileLoyaltyPrograms() {
    cy.allure().logStep('visit profile page loyalty tab');
    cy.visit(loyaltySelectors.loyaltyProgramsPage);
    cy.wait(Timeouts.SHORT_TIMEOUT_3_SEC.timeout);
    cy.url().should('include', loyaltySelectors.loyaltyProgramsPage);
  }

  static addLoyaltyToUser(loyaltyAgency: string, vertical: verticalType) {
    cy.allure().logStep('add ' + loyaltyAgency + ' loyalty card to user');

    const selectVerticalType: SelectVerticalType = {
      flight: function () {
        cy.get(loyaltySelectors.addFlightLoyalty).eq(0).click();
      },
      hotel: function () {
        cy.get(loyaltySelectors.addHotelLoyalty).eq(0).click();
      },
      train: function () {
        cy.get(loyaltySelectors.addTrainLoyalty).eq(0).click();
      },
      car: function () {
        cy.get(loyaltySelectors.addCarLoyalty).eq(0).click();
      }
    };
    const verticalTypeFunction = selectVerticalType[vertical];
    if (verticalTypeFunction) {
      verticalTypeFunction();
    }
    cy.clearInputAndType(loyaltySelectors.searchLoyaltyInput, `${loyaltyAgency}`);

    cy.get(loyaltySelectors.loyaltyAgency(loyaltyAgency)).eq(0).click();
    if (vertical === 'train') {
      cy.clearInputAndType(loyaltySelectors.railNumberInput, '67878');
    } else {
      cy.clearInputAndType(loyaltySelectors.loyaltyNumberInput, '67878');
    }

    ProfileInterceptApis.interceptProfileApis();

    if (vertical === 'train') {
      cy.get(loyaltySelectors.submitNewRailCard).eq(0).click();
    } else {
      cy.get(loyaltySelectors.submitNewLoyaltyCard).eq(0).click();
    }
    cy.wait('@waitForLoyaltyCard').its('response.statusCode').should('eq', 201);
  }

  static verifyLoyaltyPrograms(program: string, vertical: verticalType) {
    cy.allure().logStep('Confirm ' + program + ' loyalty card is present');
    if (vertical === 'train') {
      cy.get(loyaltySelectors.railCardEntry).contains(program).should('exist');
    } else {
      cy.get(loyaltySelectors.loyaltyCardEntry).contains(program).should('exist');
    }
  }
}
