import { Timeouts } from '@utility-lib/constants';
import { AdminClaim } from '@growth-lib/admin-claim';
import { OnboardByApi } from './onboard-by-api';
import { BillingEntity } from '@growth-lib/billing-entity';
import {
  ONBOARDING_GUIDE_SELECTORS,
  VerifyType,
  TasksId,
  TaskState,
  ONBOARDING_GUIDE_USER_SELECTORS,
  URL_VERIFY
} from './onboarding-guide.utils';
import { HttpRequest } from 'cypress/artifacts';
import { Logs } from '@utility-lib/log';

export class OnboardingGuide {
  static cyGetElement(selector: string): Cypress.Chainable<any> {
    return cy.get('body').then((body) => {
      const onboardingGuideIframeId = '#onboarding-guide';
      if (body.find(onboardingGuideIframeId).length > 0) {
        cy.frameLoaded(onboardingGuideIframeId);
        return cy
          .iframe(onboardingGuideIframeId)
          .find(selector)
          .then(($elem) => {
            if ($elem.length > 0) {
              return cy.iframe(onboardingGuideIframeId).find(selector);
            }
            return cy.wrap(null);
          });
      } else {
        if (body.find(selector).length > 0) {
          return cy.get(selector, { timeout: Timeouts.SHORT_TIMEOUT_5_SEC.timeout });
        }
        return cy.wrap(null);
      }
    });
  }

  static openOnboardingGuide(): void {
    Logs.logToCypressAndAllure('### openOnboardingGuide');
    OnboardingGuide.verifyOnboardingGuideCTAExist();
    cy.wait(Timeouts.SHORT_TIMEOUT_3_SEC.timeout);
    OnboardingGuide.cyGetElement(ONBOARDING_GUIDE_SELECTORS.onboardingGuideDrawer).then(($elem) => {
      if (!$elem.is(':visible')) {
        Logs.logToCypressAndAllure('### openOnboardingGuide (drawer not visible - click CTA)');
        cy.get(ONBOARDING_GUIDE_SELECTORS.onBoardingGuideButton).click(); // needs to be cy.get - do not change
        OnboardingGuide.waitForGetTasks();
        OnboardingGuide.verifyOnboardingGuideDrawerOpen();
      }
    });
  }

  static verifyOnboardingGuideOpen(): void {
    Logs.logToCypressAndAllure('### verifyOnboardingGuideOpen');
    OnboardingGuide.waitForGetTasks();
    OnboardingGuide.verifyOnboardingGuideCTAExist();
    OnboardingGuide.verifyOnboardingGuideDrawerOpen();
  }

  static verifyOnboardingGuideCTAExist(): void {
    Logs.logToCypressAndAllure('### verifyOnboardingGuideCTAExist');
    OnboardingGuide.printUserDetails();
    const onboardingGuideIframeId = '#onboarding-guide';
    cy.frameLoaded(onboardingGuideIframeId);
    cy.wait(Timeouts.SHORT_TIMEOUT_3_SEC.timeout);
    cy.get(ONBOARDING_GUIDE_SELECTORS.onBoardingGuideButton).then(($cta) => {
      if ($cta.length > 0) {
        Logs.logToCypressAndAllure('### verifyOnboardingGuideCTAExist -> exist');
        cy.get(ONBOARDING_GUIDE_SELECTORS.onBoardingGuideButton).should('exist');
      } else {
        Logs.logToCypressAndAllure('### verifyOnboardingGuideCTAExist -> not exist');
        cy.wait(Timeouts.MEDIUM_TIMEOUT_10_SEC.timeout);
        cy.get(ONBOARDING_GUIDE_SELECTORS.onBoardingGuideButton).should('exist');
      }
    });
  }

  static verifyOnboardingGuideDrawerOpen(): void {
    Logs.logToCypressAndAllure('### verifyOnboardingGuideDrawerOpen');
    OnboardingGuide.cyGetElement(ONBOARDING_GUIDE_SELECTORS.onboardingGuideDrawer).then(($drawer) => {
      if ($drawer.is(':visible')) {
        Logs.logToCypressAndAllure(`### verifyOnboardingGuideOpen (drawer visible)`);
        OnboardingGuide.verifySkeletonTasksCompleted();
      } else {
        Logs.logToCypressAndAllure(`### RE-verifyOnboardingGuideOpen (drawer not visible)`);
        OnboardingGuide.openOnboardingGuide();
      }
    });
  }

  static verifySkeletonTasksCompleted(): void {
    Logs.logToCypressAndAllure(`### verifySkeletonTasksCompleted`);
    OnboardingGuide.cyGetElement(ONBOARDING_GUIDE_SELECTORS.onBoardingGuideHeaderTitle).then(($title) => {
      if (!$title) {
        Logs.logToCypressAndAllure(`### verifySkeletonTasksCompleted (skeleton visible)`);
        cy.wait(Timeouts.MEDIUM_TIMEOUT_10_SEC.timeout);
      }
      Logs.logToCypressAndAllure(`### verifySkeletonTasksCompleted (title visible)`);
      OnboardingGuide.verify(ONBOARDING_GUIDE_SELECTORS.onBoardingGuideHeaderTitle, 'be.visible');
    });
  }

  static waitForGetTasks(): void {
    Logs.logToCypressAndAllure(`### waitForGetTasks`);
    cy.wait('@waitForGetTasks');
    cy.wait(Timeouts.SHORT_TIMEOUT_3_SEC.timeout);
  }

  static clickOn(selector: string): void {
    Logs.logToCypressAndAllure(`*** click on: ${selector}`);
    OnboardingGuide.cyGetElement(selector).click();
  }

  static verify(selector: string, verify: VerifyType = 'be.visible'): void {
    Logs.logToCypressAndAllure(`*** verify: ${selector}`);
    OnboardingGuide.cyGetElement(selector).should(verify);
  }

  static verifyLockedTask(selector: string, verify: VerifyType = 'be.visible'): void {
    Logs.logToCypressAndAllure(`*** verifyLockedTask: ${selector} - ${verify}`);
    OnboardingGuide.cyGetElement(selector).find('.ta-icon[icon="lock-filled"]').should(verify);
  }

  static verifyTaskDisable(selector: string): void {
    Logs.logToCypressAndAllure(`*** verifyTaskDisable: ${selector}`);
    OnboardingGuide.cyGetElement(selector).should('have.css', 'pointer-events', 'none');
  }

  static checkUrl(url: URL_VERIFY): void {
    Logs.logToCypressAndAllure(`*** check url: ${url}`);
    cy.url().should('include', url);
  }

  static printUserDetails(): void {
    cy.window()
      .its('localStorage')
      .invoke('getItem', 'bueno')
      .then((bueno: string | null) => {
        if (bueno) {
          const buenoObject = JSON.parse(bueno);
          const keys = [
            'companyUuid',
            'dateSignupCompleted',
            'email',
            'growthSelfSellState',
            'growthSelfSellCompany',
            'accountType',
            'companySelfOnboardingAccountSegment'
          ];

          const data = keys.reduce((acc, key) => {
            const value = buenoObject?.userInfo?.[key] || '';
            cy.allure().logStep(`${key}: ${value}`);
            return { ...acc, [key]: value };
          }, {});

          cy.log(`*** ${JSON.stringify(data)}`);
          console.log(data);
          console.info(`%c ${buenoObject?.userInfo?.['email']}`, 'background: black; color: lightgreen');
        }
      });
  }

  static closeOnboardingGuide(): void {
    Logs.logToCypressAndAllure(`*** closeOnboardingGuide`);
    OnboardingGuide.cyGetElement(ONBOARDING_GUIDE_SELECTORS.closeOnboardingGuideXButton).then(($btn) => {
      if ($btn) {
        $btn.click();
        cy.wait(Timeouts.SHORT_TIMEOUT_1_SEC.timeout);
      }
    });
  }

  static updateTask({ taskId, state }: { taskId: string; state: string }) {
    Logs.logToCypressAndAllure(`*** updateTask: ${taskId} to ${state}`);
    OnboardingGuide.cyGetElement(ONBOARDING_GUIDE_SELECTORS.closeOnboardingGuideXButton).then(($button) => {
      if ($button.length > 0) {
        $button.click();
      }
      cy.request({
        method: HttpRequest.Post,
        url: `api/selfSetup/task/update`,
        body: { id: taskId, state },
        headers: {
          Authorization:
            'TripActions ' +
            (AdminClaim.interceptedToken.replace('TripActions ', '') ||
              OnboardByApi.ONBOARD_TOKEN.replace('TripActions ', ''))
        },
        retryOnStatusCodeFailure: false
      }).then((response) => {
        expect(response.status).to.eq(200);
      });
    });
  }

  static closeOnboardingGuideForever(): void {
    Logs.logToCypressAndAllure(`*** closeOnboardingGuideForever`);
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.closeOnboardingGuideForeverButton);
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.closeOnboardingGuideForeverButtonInPopup);
  }

  static terminateOnboardingGuide(): void {
    Logs.logToCypressAndAllure(`*** terminateOnboardingGuide`);
    OnboardingGuide.openOnboardingGuide();
    OnboardingGuide.closeOnboardingGuideForever();
    cy.wait(Timeouts.SHORT_TIMEOUT_3_SEC.timeout);
    OnboardingGuide.verify(ONBOARDING_GUIDE_SELECTORS.onBoardingGuideButton, 'not.exist');
  }

  static checkPageReviewTravelPolicy(): void {
    Logs.logToCypressAndAllure(`*** checkPageReviewTravelPolicy`);
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.getReadyToTravelTask);
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.getStartedReviewTravelPolicy);
    OnboardingGuide.checkUrl(URL_VERIFY.POLICY_WIZARD);
  }

  static checkPageSetUpTravelPaymentMethod(): void {
    Logs.logToCypressAndAllure(`*** checkPageSetUpTravelPaymentMethod`);
    OnboardingGuide.openOnboardingGuide();
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.getReadyToTravelTask);
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.getStartedSetupTravelPaymentMethod);
    OnboardingGuide.checkUrl(URL_VERIFY.SETTINGS_PAYMENTS);
  }

  static checkPageAddAndInviteUsers(): void {
    Logs.logToCypressAndAllure(`*** checkPageAddAndInviteUsers`);
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.addUsersTask);
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.getStartedAddAndInviteUsers);
    OnboardingGuide.checkUrl(URL_VERIFY.USERS);
  }

  static checkPageAddCorporateCard(): void {
    Logs.logToCypressAndAllure(`*** checkPageAddCorporateCard`);
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.addCorporateCard);
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.addCorporateCardGetStartedButton);
    OnboardingGuide.checkUrl(URL_VERIFY.CARD_PROGRAMS);
  }

  static checkAddressAndAddCard(): void {
    Logs.logToCypressAndAllure(`*** checkAddressAndAddCard`);
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.addressGetStartedButton);
    OnboardingGuide.checkUrl(URL_VERIFY.BILLABLE_ENTITIES);

    OnboardingGuide.openOnboardingGuide();
    OnboardingGuide.checkPageAddCorporateCard();
  }

  static checkPageReviewExpensePolicy(): void {
    Logs.logToCypressAndAllure(`*** checkPageReviewExpensePolicy`);
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.getReadyToExpenseTask);
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.reviewExpensePolicyTask);
  }

  static checkPageSetAccountingPreferences(): void {
    Logs.logToCypressAndAllure(`*** checkPageSetAccountingPreferences`);
    OnboardingGuide.openOnboardingGuide();
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.getReadyToExpenseTask);
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.setSetAccountingPreferencesButton);
    OnboardingGuide.checkUrl(URL_VERIFY.INTEGRATION);
  }

  static getReadyToExpense(): void {
    Logs.logToCypressAndAllure(`*** getReadyToExpense`);
    OnboardingGuide.openOnboardingGuide();
    OnboardingGuide.checkPageReviewExpensePolicy();
    OnboardingGuide.checkUrl(URL_VERIFY.POLICY_ONBOARDING_V2);
    cy.wait(Timeouts.SHORT_TIMEOUT_5_SEC.timeout);
    OnboardingGuide.checkPageSetAccountingPreferences();
  }

  static completeGetReadyToTravel(): void {
    Logs.logToCypressAndAllure(`*** completeGetReadyToTravel`);
    OnboardingGuide.checkPageReviewTravelPolicy();
    OnboardingGuide.checkPageSetUpTravelPaymentMethod();
  }

  static clickOnboardingGuideGetMoreTasksButton(): void {
    Logs.logToCypressAndAllure(`*** clickOnboardingGuideGetMoreTasksButton`);
    OnboardingGuide.cyGetElement(ONBOARDING_GUIDE_SELECTORS.getMoreAccordion).then(($btn) => {
      if ($btn) {
        OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.getMoreAccordion);
      }
      cy.wait(Timeouts.SHORT_TIMEOUT_2_SEC.timeout);
      OnboardingGuide.cyGetElement(ONBOARDING_GUIDE_SELECTORS.getMoreHeader).last().scrollIntoView();
      cy.wait(Timeouts.SHORT_TIMEOUT_2_SEC.timeout);
    });
  }

  static verifyOnboardingGuideGetMoreTasks(): void {
    Logs.logToCypressAndAllure(`*** verifyOnboardingGuideGetMoreTasks`);
    OnboardingGuide.verify(ONBOARDING_GUIDE_SELECTORS.getConnectCorporateCard);
    OnboardingGuide.verify(ONBOARDING_GUIDE_SELECTORS.getSetUpReimbursments);
  }

  static clickThumbsDownButtonAndSubmitFeedback(): void {
    Logs.logToCypressAndAllure(`*** clickThumbsDownButtonAndSubmitFeedback`);
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.faqThumbsDownButton);
    OnboardingGuide.cyGetElement(ONBOARDING_GUIDE_SELECTORS.faqThumbsDownTextbox).type('feedback test');
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.faqThumbsDownSubmitButton);
  }

  static fillAllOnboardingTasks(isExepsneUser = false): void {
    Logs.logToCypressAndAllure(`*** fillAllOnboardingTasks`);
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.getStartedReviewTravelPolicy);
    OnboardingGuide.openOnboardingGuide();
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.getStartedSetupTravelPaymentMethod);
    OnboardingGuide.openOnboardingGuide();
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.reviewTravelPolicyMarkAsDone);
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.setUpTravelPaymentMethodMarkAsDone);
    if (isExepsneUser) {
      Logs.logToCypressAndAllure(`*** fillAllOnboardingTasks isExepsneUser`);
      OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.reviewExpensePolicyTask);
      OnboardingGuide.checkUrl(URL_VERIFY.POLICY_ONBOARDING_V2);
      cy.wait(Timeouts.SHORT_TIMEOUT_5_SEC.timeout);
      OnboardingGuide.openOnboardingGuide();
      OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.reviewExpensePolicyTaskMarkAsDone);
    }
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.getStartedAddAndInviteUsers);
    OnboardingGuide.openOnboardingGuide();
    OnboardingGuide.updateTask({
      taskId: TasksId.ADD_USERS,
      state: TaskState.COMPLETED
    });
    OnboardingGuide.updateTask({
      taskId: TasksId.COMPLETE_FIRST_BOOKING,
      state: TaskState.COMPLETED
    });
  }

  // TODO: check ???
  static clickOnHomePage() {
    Logs.logToCypressAndAllure(`*** clickOnHomePage`);
    return cy.get(ONBOARDING_GUIDE_SELECTORS.topLeftMainMenu).click();
  }

  static verifyTaskCompleted(selector: string): void {
    Logs.logToCypressAndAllure(`*** verifyTaskCompleted ${selector}`);
    OnboardingGuide.cyGetElement(selector).find('.ta-icon[icon="check"]').should('be.visible');
  }

  static checkOnboardingGuideForTravelAdmin(): void {
    Logs.logToCypressAndAllure(`*** checkOnboardingGuideForTravelAdmin`);
    OnboardingGuide.openOnboardingGuide();
    OnboardingGuide.verifyTaskCompleted(ONBOARDING_GUIDE_SELECTORS.addUsersTask);
    OnboardingGuide.verifyLockedTask(ONBOARDING_GUIDE_SELECTORS.getReadyToExpenseTask);
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.getReadyToExpenseTask);
    OnboardingGuide.verify(ONBOARDING_GUIDE_SELECTORS.getReadyToExpenseBadge);

    OnboardingGuide.verifyTaskDisable(ONBOARDING_GUIDE_SELECTORS.reviewExpensePolicyGetStartedButton);
    OnboardingGuide.verifyTaskDisable(ONBOARDING_GUIDE_SELECTORS.setSetAccountingPreferencesButton);
  }

  static checkOnboardingGuideForExpenseAdmin(): void {
    Logs.logToCypressAndAllure(`*** checkOnboardingGuideForExpenseAdmin`);
    OnboardingGuide.openOnboardingGuide();
    OnboardingGuide.verifyTaskCompleted(ONBOARDING_GUIDE_SELECTORS.addUsersTask);
    OnboardingGuide.verifyLockedTask(ONBOARDING_GUIDE_SELECTORS.getReadyToTravelTask);
    OnboardingGuide.verify(ONBOARDING_GUIDE_SELECTORS.getReadyToTravelBadge);
    OnboardingGuide.verifyTaskDisable(ONBOARDING_GUIDE_SELECTORS.getStartedReviewTravelPolicy);
    OnboardingGuide.verifyTaskDisable(ONBOARDING_GUIDE_SELECTORS.getStartedSetupTravelPaymentMethod);
    OnboardingGuide.verifyLockedTask(ONBOARDING_GUIDE_SELECTORS.bookTheFirstTripTask);
  }

  /* User onboarding guide */
  static verifyUserOnboardingTasks(): void {
    Logs.logToCypressAndAllure(`*** verifyUserOnboardingTasks`);
    OnboardingGuide.verify(ONBOARDING_GUIDE_USER_SELECTORS.addTravelerInfo, 'exist');
    OnboardingGuide.verify(ONBOARDING_GUIDE_USER_SELECTORS.addLoyaltyPrograms, 'exist');
    OnboardingGuide.verify(ONBOARDING_GUIDE_USER_SELECTORS.learnAboutRewards, 'exist');
    OnboardingGuide.verify(ONBOARDING_GUIDE_USER_SELECTORS.completeFirstBooking, 'exist');
  }

  static fillAllUserOnboardingTasks(): void {
    Logs.logToCypressAndAllure(`*** fillAllUserOnboardingTasks`);
    OnboardingGuide.startUserTasks();
    OnboardingGuide.completeUserTasks();
  }

  static startUserTasks(): void {
    Logs.logToCypressAndAllure(`*** startUserTasks`);
    OnboardingGuide.verifyElementTextAndClick(ONBOARDING_GUIDE_USER_SELECTORS.addLoyaltyProgramsButton, 'Get started');
    OnboardingGuide.openOnboardingGuide();

    OnboardingGuide.verifyElementTextAndClick(ONBOARDING_GUIDE_USER_SELECTORS.addTravelerInfoButton, 'Get started');
    OnboardingGuide.openOnboardingGuide();

    OnboardingGuide.verifyElementTextAndClick(ONBOARDING_GUIDE_USER_SELECTORS.learnAboutRewardsButton, 'Get started');
    OnboardingGuide.openOnboardingGuide();
  }

  static completeUserTasks(): void {
    Logs.logToCypressAndAllure(`*** completeUserTasks`);
    OnboardingGuide.verifyElementTextAndClick(
      ONBOARDING_GUIDE_USER_SELECTORS.loyaltyCompleteCompleteCta,
      'Mark as done'
    );
    OnboardingGuide.verifyElementTextAndClick(ONBOARDING_GUIDE_USER_SELECTORS.travelerInfoCompleteCta, 'Mark as done');
    OnboardingGuide.verifyElementTextAndClick(
      ONBOARDING_GUIDE_USER_SELECTORS.learnAboutRewardsCompleteCta,
      'Mark as done'
    );
    OnboardingGuide.openOnboardingGuide();
    OnboardingGuide.updateTask({
      taskId: TasksId.COMPLETE_FIRST_BOOKING,
      state: TaskState.COMPLETED
    });
  }

  static verifyElementTextAndClick(onboardingGuideSelector: string, ctaText: string): void {
    Logs.logToCypressAndAllure(`*** verifyElementTextAndClick`);
    OnboardingGuide.cyGetElement(onboardingGuideSelector).should('contain', ctaText);
    OnboardingGuide.clickOn(onboardingGuideSelector);
    cy.wait(Timeouts.SHORT_TIMEOUT_1_SEC.timeout);
  }

  static pressSkipThisInGetReadyToExpenseFromAdmin(): void {
    Logs.logToCypressAndAllure(`*** pressSkipThisInGetReadyToExpenseFromAdmin`);
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.getReadyToExpenseTask);
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.getReadyToExpenseSkipThisButton);
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.getReadyToExpenseTask);
    OnboardingGuide.verify(ONBOARDING_GUIDE_SELECTORS.checkMarkInSetAccountingPreferences, 'exist');
  }

  static completeAddAddressTask(): void {
    Logs.logToCypressAndAllure(`*** completeAddAddressTask`);
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.addressGetStartedButton);
    OnboardingGuide.checkUrl(URL_VERIFY.LEGAL_ADDRESS);
    BillingEntity.fillBillingEntityForm();
    cy.wait(Timeouts.SHORT_TIMEOUT_5_SEC.timeout);
    OnboardingGuide.checkUrl(URL_VERIFY.BILLABLE_ENTITIES);
  }

  static checkLiquidPagesOnboardingGuide(): void {
    Logs.logToCypressAndAllure(`*** checkLiquidPagesOnboardingGuide`);
    function checkPageSubmitFirstExpense(): void {
      Logs.logToCypressAndAllure(`*** checkPageSubmitFirstExpense`);
      OnboardingGuide.openOnboardingGuide();
      OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.getReadyToExpenseTask);
      OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.submitFirstExpenseGetStartedButton);
      OnboardingGuide.checkUrl(URL_VERIFY.ALL_TRANSACTIONS);
      cy.contains('button', 'Done').click();
    }

    function checkPageNavanConnect(): void {
      Logs.logToCypressAndAllure(`*** checkPageNavanConnect`);
      OnboardingGuide.openOnboardingGuide();
      OnboardingGuide.clickOnboardingGuideGetMoreTasksButton();
      OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.connectCorporateCardLearnMoreButton);
      OnboardingGuide.checkUrl(URL_VERIFY.CARD_PROGRAMS);
    }

    function checkPageSetUpReimbursments(): void {
      Logs.logToCypressAndAllure(`*** checkPageSetUpReimbursments`);
      OnboardingGuide.openOnboardingGuide();
      OnboardingGuide.clickOnboardingGuideGetMoreTasksButton();
      OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.reimbursementsLearnMoreButton);
    }

    OnboardingGuide.completeAddAddressTask();
    cy.wait(Timeouts.SHORT_TIMEOUT_5_SEC.timeout);
    OnboardingGuide.getReadyToExpense();
    checkPageSubmitFirstExpense();
    checkPageNavanConnect();
    checkPageSetUpReimbursments();
  }

  static completeTasksByAPI(taskIds: TasksId[] = []): void {
    Logs.logToCypressAndAllure(`*** completeTasksByAPI`);
    let hasSubTasks;
    taskIds.forEach((taskId: TasksId) => {
      hasSubTasks = false;
      OnboardingGuide.openOnboardingGuide();
      switch (taskId) {
        case TasksId.COMPLETE_FIRST_BOOKING:
          OnboardingGuide.verify(ONBOARDING_GUIDE_SELECTORS.completeFirstBooking);
          break;
        case TasksId.APPLY_FOR_NAVAN_CARDS:
          OnboardingGuide.verify(ONBOARDING_GUIDE_SELECTORS.addNavanConnectProgramButton);
          break;
        case TasksId.ADD_USERS:
          OnboardingGuide.verify(ONBOARDING_GUIDE_SELECTORS.addUsersTask);
          break;
        case TasksId.CONNECT_CORPORATE_ACCOUNT_PROGRAM:
          OnboardingGuide.verify(ONBOARDING_GUIDE_SELECTORS.addCorporateCard);
          break;
        case TasksId.GET_READY_TO_TRAVEL:
          hasSubTasks = true;
          OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.getReadyToTravelTask);
          cy.wait(Timeouts.SHORT_TIMEOUT_1_SEC.timeout);
          OnboardingGuide.cyGetElement(ONBOARDING_GUIDE_SELECTORS.getStartedReviewTravelPolicy).then(($elem) => {
            if ($elem) {
              OnboardingGuide.updateTask({
                taskId: TasksId.REVIEW_AND_EDIT_POLICY_FOR_TRAVEL,
                state: TaskState.COMPLETED
              });
            }
          });
          OnboardingGuide.openOnboardingGuide();
          OnboardingGuide.cyGetElement(ONBOARDING_GUIDE_SELECTORS.getVTravelPaymentMethodButton).then(($elem) => {
            if ($elem) {
              OnboardingGuide.updateTask({
                taskId: TasksId.SET_UP_TRAVEL_PAYMENT,
                state: TaskState.COMPLETED
              });
            }
          });
          break;
        case TasksId.GET_READY_TO_EXPENSE:
          hasSubTasks = true;
          OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.getReadyToExpenseTask);
          cy.wait(Timeouts.SHORT_TIMEOUT_1_SEC.timeout);
          OnboardingGuide.cyGetElement(ONBOARDING_GUIDE_SELECTORS.reviewExpensePolicyGetStartedButton).then(($elem) => {
            if ($elem) {
              OnboardingGuide.updateTask({
                taskId: TasksId.REVIEW_AND_EDIT_POLICY_FOR_EXPENSE,
                state: TaskState.COMPLETED
              });
            }
          });
          OnboardingGuide.openOnboardingGuide();
          OnboardingGuide.cyGetElement(ONBOARDING_GUIDE_SELECTORS.setSetAccountingPreferencesButton).then(($elem) => {
            if ($elem) {
              OnboardingGuide.updateTask({
                taskId: TasksId.SYNC_ACCOUNTING_SOFTWARE,
                state: TaskState.COMPLETED
              });
            }
          });
          break;
      }
      if (!hasSubTasks) {
        OnboardingGuide.updateTask({
          taskId,
          state: TaskState.COMPLETED
        });
      }
    });
  }
}
