import { GrowthInterceptApis } from '@growth-lib/api-intercept';
import { LoginSelfSell } from '@support-growth/login-self-sell';
import { SignUp } from '@growth-lib/sign-up';
import { AmplitudeEvents } from '@growth-lib/amplitude-events';
import { DelegatePage } from '@growth-lib/delegate-page';
import { LoginPage } from '@admin-lib/login';
import faker from '@faker-js/faker';
import { Timeouts } from '@utility-lib/constants';
import { GrowthRegistrationUrls } from '@growth-lib/model';
import { OnboardByApi } from '@growth-lib/onboard-by-api';
import { SignupReason } from '../../../growth_common_lib';

const testUserEmail = 'mgoldenberg@dlge2e.com';
const testUserEmail2 = 'rchabra+traveltest11-no-persona-bfo@traveltest11-no-persona-bfo.com';
const credentials = Cypress.env('newUser').NEW_USER_PASSWORD;

const checkAddTravelerEmptySuggestions = () => {
  DelegatePage.clickAddTraveler();
  DelegatePage.checkAddTravelerFromListEmpty(false, true);
  DelegatePage.createNewTravelerUser('Laura', 'Miller');
};

const goToNotificationsFromToastAndVerify = () => {
  DelegatePage.checkSideToastShown(true);
  DelegatePage.checkEditProfileShownWithNotifications('Laura Miller');
  DelegatePage.pressBackFromNotifications();
  DelegatePage.verifyDelegateHomePageOpened();
};

const checkAddTravelerFromSuggestions = () => {
  DelegatePage.clickAddTraveler();
  DelegatePage.checkAddTravelerFromListNotEmpty();
  DelegatePage.searchNotExistingTraveler('Not Existing');
  DelegatePage.searchExistingTraveler('Adam Abr');
  DelegatePage.addSearchedTraveler();
  DelegatePage.checkUserSelectedAndEmptyTripState('Adam Abramson');
};

const addFirstTravelerAndCheckHeSelectedWithEmptyTrips = () => {
  DelegatePage.createNewTravelerUser('Adam', 'Abramson');
  DelegatePage.checkSideToastShown(false);
  DelegatePage.checkUserSelectedAndEmptyTripState('Adam Abramson');
  DelegatePage.checkAddTravelerBottomButtonShown();
};

describe('Affiliate: new company on-boarding for delegate user', () => {
  let token: string;
  beforeEach(() => {
    GrowthInterceptApis.interceptApis();
    LoginSelfSell.createNewSelfSellLead({
      registrationUrl: GrowthRegistrationUrls.travel
    }).then((login) => {
      token = login.token;
    });
  });

  it('C8357371: Web onboard as self sell user for delegate user', { tags: ['@tier1'] }, () => {
    SignUp.signupWithSkipAdmin(token, SignupReason.BOOK_FOR_OTHERS, false);
    DelegatePage.verifyDelegateHomePageOpened();
    DelegatePage.verifyDelegateIsLandingPage();
    AmplitudeEvents.expectAmplitudeEventsToBeSent();
    OnboardByApi.deleteLastOnboardedCompany();
  });

  it('C8357372: Web onboard as self sell user for delegate user - mobile', { tags: ['@tier1'] }, () => {
    SignUp.signupWithSkipAdmin(token, SignupReason.BOOK_FOR_OTHERS, true);
    SignUp.howItWorksForDelegate();
    AmplitudeEvents.expectAmplitudeEventsToBeSent();
    OnboardByApi.deleteLastOnboardedCompany();
  });

  it('C9968088: Web delegate user new trip selecting user - web', { tags: ['@tier1'] }, () => {
    const TEST_USER_NAME = 'Michael Jordan';

    LoginPage.clearExistingLoginSession();
    LoginPage.visitTALoginPage();
    LoginPage.loginWithCredentials(testUserEmail, credentials);
    DelegatePage.closeWelcomeModal();
    DelegatePage.selectSpecificStaticUser(TEST_USER_NAME);
    DelegatePage.clickNewTrip();
    DelegatePage.verifySearchPageShownWithSelectedUser(TEST_USER_NAME);
    cy.go('back');
    DelegatePage.clickNewTripNoResults(TEST_USER_NAME.split(' ')[0]);
    DelegatePage.verifySearchPageShownWithSelectedUser(TEST_USER_NAME);
  });

  it(
    'C12926557: Web delegate user - login and add e2e guest travel planner redirect to profile - web',
    { tags: ['@tier1'] },
    () => {
      LoginPage.clearExistingLoginSession();
      LoginPage.visitTALoginPage();
      LoginPage.loginWithCredentials(testUserEmail2, credentials);
      DelegatePage.closeWelcomeModal();
      DelegatePage.checkEditProfileLeftSide('GUEST DO NOT TOUCH');
    }
  );

  it(
    'C10134898: WEB delegate edit travelers profile Notification tab is shown via and functionality',
    { tags: ['@tier1'] },
    () => {
      SignUp.signupWithSkipAdmin(token, SignupReason.BOOK_FOR_OTHERS, false);
      DelegatePage.verifyDelegateHomePageOpened();
      DelegatePage.closeWelcomeModal();
      DelegatePage.checkAddTravelerCenterButtonYellowMark();
      DelegatePage.clickAddTravelerCenter();
      const firstName = faker.name.firstName();
      const lastName = faker.name.lastName().replace(/'/g, '');
      DelegatePage.createNewTravelerUser(firstName, lastName);
      DelegatePage.clickEditProfile();
      DelegatePage.checkEditProfileShownWithNotifications(`${firstName} ${lastName}`);
      DelegatePage.verifyNotificationUpdated();
      OnboardByApi.deleteLastOnboardedCompany();
    }
  );

  it(
    'C10135383 C10135141 C10135139: Add Traveler flow - add users, remove, search, check empty states, ' +
      ', yellow sign is not show, check select user to see trips (empty state), notification indication shown and working',
    { tags: ['@tier1'] },
    () => {
      SignUp.signupWithSkipAdmin(token, SignupReason.BOOK_FOR_OTHERS, false);
      DelegatePage.verifyDelegateHomePageOpened();
      DelegatePage.closeWelcomeModal();
      DelegatePage.checkAddTravelerCenterButtonYellowMark();
      DelegatePage.verifyBFOBannerShown();
      DelegatePage.clickAddTravelerCenter();

      addFirstTravelerAndCheckHeSelectedWithEmptyTrips();

      cy.wait(Timeouts.SHORT_TIMEOUT_5_SEC.timeout);
      // this part checks C10135139
      checkAddTravelerEmptySuggestions();
      goToNotificationsFromToastAndVerify();

      DelegatePage.verifyUsersSorted();
      DelegatePage.removeTraveler();
      DelegatePage.checkUserNotExist('Adam Abramson');
      DelegatePage.verifyUsersSorted();

      checkAddTravelerFromSuggestions();
      DelegatePage.verifyUsersSorted();
      OnboardByApi.deleteLastOnboardedCompany();
    }
  );
});
