import { AmplitudeEvents } from '@growth-lib/index';
import { Timeouts } from '@utility-lib/constants';

const personaSelectors = {
  answerByNumber: (answerNumber: number) => {
    return '[data-testid="answerNumber' + answerNumber + '"]';
  },
  answerBySignupReason: (signupReason: SignupReason) => {
    return '[data-testid="answer-' + signupReason + '"]';
  },
  firstPersonaAnswer: '[data-testid="answerNumber0"]',
  secondPersonaAnswer: '[data-testid="answerNumber1"]',
  thirdPersonaAnswer: '[data-testid="answerNumber2"]',
  travelerPersonaAnswer: '[data-testid="answerNumber1"]',
  startCompanySetup: '[data-testid="startSetup"]',
  closeModalButton: '[data-testid="modal-header-close-button"]'
};

export enum SignupReason {
  TRAVEL_AND_EXPENSE_SOLUTION = 'TRAVEL_AND_EXPENSE_SOLUTION',
  TRAVEL_SOLUTION = 'TRAVEL_SOLUTION',
  BOOK_FOR_OTHERS = 'BOOK_FOR_OTHERS',
  BOOK_TRIP = 'BOOK_TRIP',
  TEAM_OFFSITE = 'TEAM_OFFSITE'
}

enum PersonaQuestion {
  FIRST = 'first',
  SECOND = 'second',
  THIRD = 'Third',
  FOURTH = 'Fourth',
  FIFTH = 'Fifth'
}

export class Persona {
  static nonPersonaFlow() {
    cy.allure().logStep('check we do not on persona question flow');
    cy.get(personaSelectors.answerByNumber(0)).should('not.exist');
  }

  static answerFirstPersonaAsTravelerAndExpanseManagerAccount() {
    Persona.answerFirstPersonaQuestion(SignupReason.TRAVEL_AND_EXPENSE_SOLUTION);
  }

  static answerFirstPersonaAsTravelerManagerAccount() {
    Persona.answerFirstPersonaQuestion(SignupReason.TRAVEL_SOLUTION);
  }

  static answerFirstPersonaAsRogueTravelAccount() {
    Persona.answerFirstPersonaQuestion(SignupReason.BOOK_TRIP);
  }

  static answerFirstPersonaAsBookForOtherAccount() {
    Persona.answerFirstPersonaQuestion(SignupReason.BOOK_FOR_OTHERS);
  }

  static fillPersonaBeforeSignup(signupReason: SignupReason) {
    Persona.answerSignupReason(signupReason);
  }

  static checkBookForOtherNotExist() {
    cy.get(
      personaSelectors.answerBySignupReason(SignupReason.TRAVEL_AND_EXPENSE_SOLUTION)
    );
    cy.get(personaSelectors.answerBySignupReason(SignupReason.BOOK_FOR_OTHERS)).should(
      'not.exist'
    );
  }

  static answerFirstPersonaQuestion(signupReason: SignupReason) {
    cy.intercept('POST', new RegExp('/api/selfSell/onboard')).as('onboard');
    Persona.answerSignupReason(signupReason);
    cy.wait('@onboard').then((res) => {
      if (res.response?.body?.companyUuid) {
        cy.task('putDataInCache', {
          key: 'companyUuid',
          data: res.response?.body?.companyUuid
        });
      }
    });
  }

  static answerSignupReason(signupReason: SignupReason) {
    cy.allure().logStep('Answer Persona signup reason as ' + signupReason);
    this.answerPersonaBySelector(personaSelectors.answerBySignupReason(signupReason));
  }

  static answerPersonaBySelector(selector: string) {
    AmplitudeEvents.addExpectedAmplitudeEvents('self signup questionnaire opened');
    cy.get(selector).click({ force: true });
    AmplitudeEvents.addExpectedAmplitudeEvents(
      'self signup questionnaire answer selected'
    );
  }
}
