const selectors = {
  tab: '[data-testid="flightDiscountsTabGlobalPref"]',
  addAirlineButton: '[data-testid="addAirlinePreferenceButton"]',
  airlinesInput: '[data-testid="airlineMultiSelectInput"]',
  airlinesOption: 'mat-option',
  saveChangesButton: '[data-testid="saveFlightGlobalPrefButton"]',
  airlinesTableRow: '[data-testid="globalFlightPreferencesTable"] .mat-row',
  deleteButtonTable: '[data-testid="tableDeleteButton"]',
  deleteButtonModal: '[data-testid="discountsModalDeleteButton"]'
};

const interceptors = {
  globalAirlines: 'api/admin/airline-preferred-routes/global'
};

export class FlightPreferencesGlobal {
  static visitGlobalPrefPage(): void {
    cy.visit('app/admin2//settings/discounts/airlines');
    cy.get(selectors.tab).click();
  }

  static addAirlinePreference(airline: string): void {
    FlightPreferencesGlobal.clickAddAirlineButton();
    FlightPreferencesGlobal.addAirline(airline);
    FlightPreferencesGlobal.clickSaveChangesButton();
  }

  static verifyAirlineAdded(airline: string): void {
    cy.get(selectors.airlinesTableRow).contains(airline).should('be.visible');
  }

  static deleteAirlinePreference(airline: string): void {
    FlightPreferencesGlobal.clickDeleteButtonTable(airline);
    FlightPreferencesGlobal.clickDeleteButtonModal();
  }

  static verifyAirlineDeleted(airline: string): void {
    cy.contains(airline).should('not.exist');
  }

  private static clickAddAirlineButton(): void {
    cy.get(selectors.addAirlineButton).click();
  }

  private static addAirline(airline: string): void {
    cy.get(selectors.airlinesInput).type(airline);
    cy.get(selectors.airlinesOption, { timeout: 10000 })
      .should('be.visible')
      .contains(airline)
      .click();
  }

  private static clickSaveChangesButton(): void {
    cy.intercept('POST', interceptors.globalAirlines).as('saveGlobalAirlines');
    cy.get(selectors.saveChangesButton).contains('Save changes').click();
    cy.wait('@saveGlobalAirlines');
  }

  private static clickDeleteButtonTable(airline: string): void {
    cy.get(selectors.airlinesTableRow)
      .contains(airline)
      .get(selectors.deleteButtonTable)
      .click();
  }

  private static clickDeleteButtonModal(): void {
    cy.intercept('DELETE', interceptors.globalAirlines).as('deleteGlobalAirlines');
    cy.get(selectors.deleteButtonModal).click();
    cy.wait('@deleteGlobalAirlines');
  }
}
