import { UserModal } from 'cypress/e2e/profile/lib/user-modal';
import { Random, Logs, utilitySelector, Utility } from '@utility-lib/index';

const invitationSelector = {
  invitationsMenu: '[data-qaid="INVITATIONS-button"]',
  invitationsMenuElement: (elName: string) => `.ta-menu-item--text[title="${elName}"]`,
  createNewTraveler: '[data-testid="newGuestTravelerProfile"]',
  addTravelerButton: '[data-testid="saveGuestTraveler"]',
  invitationTitle: '[data-testid="tripInvitationTitle"]',
  invitationLocation: '[data-testid="tripInvitationLocation"]',
  invitationEventStartDate: '[data-testid="tripInvitationStartDate"]',
  invitationEventEndDate: '[data-testid="tripInvitationEndDate"]',
  suggestedArrivalTime: '[data-testid="latestArrivalTime"]',
  suggestedDepartureTime: '[data-testid="earliestReturningTime"]',
  flightDatePicker: '[qaid="flightRoundDepartureDateTrigger"]',
  calendarDay: '[data-testid="calendarDay"]',
  calendarMonth: '.ta-calendar-month',
  calendarDoneBtn: '[data-testid="datePickerDoneButton"]',
  teamEventUserGroup: '[qaid="teamEventUserGroup"]',
  teamEventUserGroupInput: () => `${invitationSelector.teamEventUserGroup} > input`,
  travellerDropDown: '[data-testid="travelerDropdown"]',
  travellersGroup: '[data-testid="travelersGroup"]',
  travelerTag: 'ta-user-tag',
  verticalsTabGroup: '.ta-tabs__wrapper',
  calendarDaySpan: '[data-testid="calendarDay"] span',
  flightArrivalAirport: '[qaid="searchFormRoundArrivalAirport"] ta-typeahead input',
  flightDepartureAirport: '[qaid="searchFormRoundDepartureAirport"] ta-typeahead input',
  flightDepartureDate: '[qaid="flightRoundDepartureDateTrigger"]',
  flightReturnDate: '[qaid="flightRoundReturnDateTrigger"]'
};

const email: string = 'user' + '_' + Random.randomString() + '@staging.tripactions.xyz';

export class Invitations {
  static expandInvitationsMenu() {
    cy.allure().logStep('expand invitations menu');
    cy.get(invitationSelector.invitationsMenu).click();
  }

  static selectInvitationsMenuElement(elementName: string) {
    cy.allure().logStep(`select invitations menu element: ${elementName}`);
    cy.get(invitationSelector.invitationsMenuElement(elementName)).click();
  }

  static createGuestTraveller() {
    cy.get(invitationSelector.createNewTraveler).click();
    UserModal.fillTravelerName('John', 'Doe');
    UserModal.fillBirthday(18);
    UserModal.fillEmail(email);
    UserModal.fillPhoneNumber('+1 123 453 45345');
    UserModal.fillGender('MALE');
    cy.get(invitationSelector.addTravelerButton).click();
    cy.wait('@waitForSaveGuest').then((xhr) => {
      Logs.cypressResponseLog('SAVED GUEST RESPONSE', xhr);
    });
  }

  static selectTravelWindowsDates(tripStartDate: string, tripEndDate: string) {
    cy.allure().logStep('select travel window dates');
    cy.get(invitationSelector.flightDatePicker).click();
    cy.get(invitationSelector.calendarDay).contains(tripStartDate).click();
    cy.get(invitationSelector.calendarDay).contains(tripEndDate).click();
    cy.get(invitationSelector.calendarDoneBtn).click();
  }

  static verifyInvitationName(invitationName: string) {
    cy.allure().logStep(`verify invitation name is ${invitationName}`);
    cy.get(invitationSelector.invitationTitle).contains(invitationName);
  }

  static verifyInvitationLocation(invitationLocation: string) {
    cy.allure().logStep(`verify invitation location is ${invitationLocation}`);
    cy.get(invitationSelector.invitationLocation)
      .invoke('text')
      .then((text) => {
        const normalizedText = Utility.normalizeText(text);
        const normalizedInvitationLocation = Utility.normalizeText(invitationLocation);
        expect(normalizedText).to.contains(normalizedInvitationLocation);
      });
  }

  static verifyInvitationEventStartDate(startDay: string) {
    cy.allure().logStep('verify invitation event start date');
    cy.get(invitationSelector.invitationEventStartDate).contains(startDay);
  }

  static verifyInvitationEventEndDate(endDay: string) {
    cy.allure().logStep('verify invitation event end date');
    cy.get(invitationSelector.invitationEventEndDate).contains(endDay);
  }

  static verifyLatestArrivalTime(latestArrivalTime: string) {
    cy.allure().logStep('verify latest arrival time');
    cy.get(invitationSelector.suggestedArrivalTime).contains(latestArrivalTime, {
      matchCase: false
    });
  }

  static verifyEarliestReturningTime(earliestReturningTime: string) {
    cy.allure().logStep('verify earliest returning time');
    cy.get(invitationSelector.suggestedDepartureTime).contains(earliestReturningTime, {
      matchCase: false
    });
  }

  static verifyFlightReturnDate(returnDate: string) {
    cy.allure().logStep('verify flight return date');
    cy.get(invitationSelector.flightReturnDate).contains(returnDate);
  }

  static verifyFlightDepartureDate(departureDate: string) {
    cy.allure().logStep('verify flight departure date');
    cy.get(invitationSelector.flightDepartureDate).contains(departureDate);
  }

  static verifyOnlyTravelDatesAreEnabled(dayBefore: string, dayAfter: string) {
    cy.allure().logStep('verify only travel window dates are enabled');
    cy.get(invitationSelector.flightDatePicker).click();
    cy.get(invitationSelector.calendarMonth)
      .eq(0)
      .contains(invitationSelector.calendarDaySpan, `${dayBefore}`)
      .parent()
      .should('have.class', 'ta-calendar-day--disabled');
    cy.get(invitationSelector.calendarMonth)
      .eq(0)
      .contains(invitationSelector.calendarDaySpan, `${dayAfter}`)
      .parent()
      .should('have.class', 'ta-calendar-day--disabled');
  }

  static selectExtraGuestByInput(extraGuestInput: string) {
    cy.allure().logStep('set extra guest');
    cy.get(invitationSelector.teamEventUserGroupInput())
      .should('have.attr', 'placeholder', 'Add one extra guest')
      .type(extraGuestInput);
    cy.wait('@waitForTravellers');
    cy.get(invitationSelector.travellerDropDown).contains('Guests').next().click();
  }

  static verifyNumberOfTravelers(numberOfTravelers: number) {
    cy.allure().logStep(`verify number of travelers is ${numberOfTravelers}`);
    cy.get(invitationSelector.travellersGroup)
      .find(invitationSelector.travelerTag)
      .should('have.length', numberOfTravelers);
  }

  static verifyOnlyAllowedVerticalsTabsAreVisible(tabs: string[], length: number) {
    cy.allure().logStep(
      'verify only tabs for allowed verticals are visible in invitation'
    );
    cy.get(invitationSelector.verticalsTabGroup).within(() => {
      cy.get(utilitySelector.buttonSelector).each((item, index) => {
        expect(item).to.be.visible;
        expect(item.text().trim()).contains(tabs[index]);
      });
    });
    cy.get(invitationSelector.verticalsTabGroup)
      .find(utilitySelector.buttonSelector)
      .should('have.length', length);
  }
}
