import { Timeouts, Utility, utilitySelector, Logs } from '@utility-lib/index';

export const createTripProposal = {
  setTripProposal: '.ta-co-side-navigation [href*="trip-proposal"]',
  setTripProposalNav: (getTripType: string) => `.ta-co-side-navigation [href*="${getTripType}"]`,
  enableTripProposal: '[columnid="combinedTargetAttr"]',
  triggerEnableButton: '[formcontrolname="combinedTargetAttr"] .mat-slide-toggle-thumb',
  tripName: 'input[formcontrolname="tripName"]',
  tripPurpose: 'input[formcontrolname="tripPurpose"]',
  hotelLocationInput: '[qaid="locationTypeaheadInput"] input',
  submit: 'button[type="submit"]',
  sendRequestToManager: '.cost-modal__footer .ta-button__content',
  saveChanges: 'button .ta-button__content',
  tripProposal: '[class^="trip-proposal__actions__submit"]',
  groupTravelTab: '[data-testid="groupTravelSubtab"]',
  bookingTypeVerticalDropdown: '.trip-proposal-form__actions button',
  bookingTypeVerticalOption: (verticalType: string) => `button[icon="booking-type-${verticalType}"]`,
  locationFieldSubtitle: (location: string) => `[aria-label="${location}"] [data-testid="locationFieldSubtitle"]`,
  disabledSubmitButton: '[class^="trip-proposal__actions__submit ta-button ta-button--disabled"]',
  removeLOB: '[class^="trip-proposal-form__top__remove"]',
  startBooking: '[class="upcoming-trip-card__actions"] button'
};

const newUserCredentials = Cypress.env('newUser').NEW_USER_PASSWORD;
type PolicyType = 'flights' | 'train' | 'hotel' | 'car' | 'black-car' | 'trip-proposal';

export class CreateProposal {
  static visitAdminPage() {
    cy.allure().logStep('visit admin page');
    cy.visit('app/admin2/en/dashboard');
    cy.wait(Timeouts.MEDIUM_TIMEOUT_10_SEC.timeout);
  }

  static selectPolicy() {
    cy.allure().logStep('select travel policy');
    Utility.selectAdminNav('POLICY', 'TRAVEL_POLICY');
    cy.wait('@waitForTravelPolicy');
  }
  static selTripProposalEnabled() {
    cy.allure().logStep('enable trip proposal');
    cy.get(createTripProposal.setTripProposal).click({ force: true });
    this.selectPolicyType('trip-proposal');
    cy.get(createTripProposal.enableTripProposal).first().click({ force: true });
    cy.get(createTripProposal.triggerEnableButton).click({ force: true });
    cy.get(createTripProposal.saveChanges).contains('Save changes').click({ force: true });
    cy.wait(Timeouts.SHORT_TIMEOUT_3_SEC.timeout);
    cy.wait('@waitForSaveTripProposalEnable').then((xhr) => {
      Logs.cypressResponseLog('TRIP PROPOSAL ENABLE PATCH RESPONSE', xhr);
    });
  }

  static selectPolicyType(getTripType: PolicyType) {
    cy.allure().logStep(`select policy type ${getTripType}`);
    cy.get(createTripProposal.setTripProposalNav(getTripType)).click({
      force: true
    });
  }
  static visitNewTripProposalPage() {
    cy.allure().logStep('visit new trip proposal page');
    Utility.visitSearchPage();
    cy.wait(Timeouts.SHORT_TIMEOUT_3_SEC.timeout);
    cy.get(utilitySelector.searchLocationInput).click({ force: true });
  }

  static setBookingType(verticalType: string) {
    cy.allure().logStep(`selectVertical ${verticalType}`);
    cy.wait(Timeouts.SHORT_TIMEOUT_3_SEC.timeout);
    cy.get(createTripProposal.bookingTypeVerticalDropdown).click();
    cy.get(createTripProposal.bookingTypeVerticalOption(verticalType)).click();
  }
  static setTripName() {
    cy.allure().logStep('set trip name');
    cy.get(createTripProposal.groupTravelTab).should('not.be.hidden').should('be.visible');
    cy.get(createTripProposal.tripName).type('Berlin Trip');
  }
  static setTripReason() {
    cy.allure().logStep('set trip reason');
    cy.get(createTripProposal.tripPurpose).type('Team Meeting');
  }
  static setHotelLocation(location: string) {
    cy.allure().logStep(`set hotel location ${location}`);
    cy.get(createTripProposal.hotelLocationInput).type(`${location}`, { force: true });
    cy.get(createTripProposal.locationFieldSubtitle(location)).click({
      force: true
    });
  }

  static sendProposal() {
    cy.allure().logStep(' send proposal');
    cy.get(createTripProposal.tripProposal).click();
    cy.wait('@waitForSubmitProposal').then((xhr) => {
      Logs.cypressResponseLog('SEND PROPOSAL RESPONSE', xhr);
    });
    cy.wait(Timeouts.SHORT_TIMEOUT_3_SEC.timeout);
  }

  static sendRequestToManager() {
    cy.allure().logStep('send request to manager');
    cy.get(createTripProposal.sendRequestToManager).click({ force: true });
    cy.wait('@waitForRequestSend').then((xhr) => {
      Logs.cypressResponseLog('Send REQUEST TO MANAGER RESPONSE', xhr);
    });
  }

  static loginAsAdmin(password: any) {
    cy.clearLocalStorage();
    cy.clearCookies();
    cy.clearLocalStorage();
    cy.task('getDataFromCache', 'companyCreationEmail').then((email: any) => {
      cy.loginWithAuthToken({ email, password });
    });
  }

  static loginAsTraveler() {
    cy.clearLocalStorage();
    cy.clearCookies();
    cy.clearLocalStorage();
    cy.task('getDataFromCache', 'travelerEmail').then((email: any) => {
      cy.loginWithAuthToken({ email, password: newUserCredentials });
    });
  }
}
