import { AmplitudeEvents } from './amplitude-events';
import { utilitySelector, Timeouts } from '@utility-lib/index';

const adminClaimSelectors = {
  companySetupMidScreenCta: '[data-testid="primaryActionButton"] > .ta-button-v2',
  companySetupNavBarCta: '[data-testid="navBarMainCTA"] > .ta-button-v2',
  businessLegalName: '[data-testid="businessLegalName"]',
  numberOfEmployees: '[data-testId="configureNumberOfEmployees"]',
  annualTravelBudget: '[data-testId="annualTravelBudget"]',
  configureCompanyAddress: '[data-testid="configureCompanyAddress"]',
  companyCity: '[data-testid="configureCompanyCity"]',
  configureCompanyState: '[data-testid="configureCompanyState"]',
  configureCompanyCountry: '[data-testid="configureCompanyCountry"] input',
  configureLHGCompanyCountry: '[data-testid="configureCompanyCountry"]',
  configureCompanyZip: '[data-testid="configureCompanyZip"]',
  configureCompanyPhone: 'ta-phone-input-v2 input:first',
  termsAndConditionCheck: '[data-testid="termsAndConditionCheck"] input',
  configureCompanyAccount: '[data-testid="configureCompanyAccount"]',
  dropdownOption: '.ta-select-option',
  countrySelectOption: '.mat-option-text',
  rambleScript: '#rambleScript',
  webNavigationNext: '[data-testid="webNavigationNext"]',
  closeChaseAdmin: '[data-testid="closeChaseAdmin"]',
  onboardingGuideTasks: '[data-testid="onboarding-guide__body-category-tasks"]',
  onboardingGuideCloseButton: '[data-testid="onboarding-guide-close"]'
};

export class AdminClaim {
  static interceptedToken: string;

  static fillAdminClaim(indexMaxNumberOfEmployeesDropdown = 0): void {
    cy.allure().logStep('Fill admin claim form and submit');
    let companyName: string;
    cy.task('getDataFromCache', 'companyNameSuffix').then((companyNameSuffix) => {
      companyName = 'TestCompany' + companyNameSuffix;
      cy.get(adminClaimSelectors.businessLegalName).type(companyName);
      cy.task('putDataInCache', {
        key: 'companyName',
        data: companyName
      });
    });
    cy.get(adminClaimSelectors.numberOfEmployees)
      .then((ele) => {
        cy.wrap(ele).click();
      })
      .then(() => {
        cy.get(adminClaimSelectors.dropdownOption)
          .eq(indexMaxNumberOfEmployeesDropdown)
          .click();
      });
    cy.get(adminClaimSelectors.annualTravelBudget)
      .then((ele) => {
        cy.wrap(ele).click();
      })
      .then(() => {
        cy.get(adminClaimSelectors.dropdownOption).first().click();
      });
    cy.get(adminClaimSelectors.configureCompanyAddress).type('page mill 1501');
    cy.get(adminClaimSelectors.companyCity).type('Palo Alto');
    cy.get(adminClaimSelectors.configureCompanyZip).type('94304');
    cy.clearInputAndType(
      adminClaimSelectors.configureCompanyCountry,
      'United States'
    ).then(() => {
      cy.get(adminClaimSelectors.countrySelectOption).first().click({ force: true });
    });
    cy.get(adminClaimSelectors.configureCompanyState)
      .then((ele) => {
        cy.wrap(ele).click();
      })
      .then(() => {
        cy.get(adminClaimSelectors.dropdownOption).eq(4).click();
      });
    cy.wait(Timeouts.SHORT_TIMEOUT_3_SEC.timeout);
    cy.clearInputAndType(
      adminClaimSelectors.configureCompanyPhone,
      '{backspace}{backspace}12692673678'
    );
    cy.get(adminClaimSelectors.termsAndConditionCheck).should(
      ($termsAndConditionElement) => {
        // If the termsAndConditionCheck exists, click on it
        if ($termsAndConditionElement.length > 0) {
          cy.wrap($termsAndConditionElement).click();
        }
      }
    );
    cy.get(adminClaimSelectors.configureCompanyAccount).click();

    cy.wait('@waitForCompanyOnboard').then((res) => {
      AdminClaim.interceptedToken = res.response?.body?.token;
    });
    AmplitudeEvents.addExpectedAmplitudeEvents(
      'admin claim',
      'admin claim success',
      'admin claim completed'
    );
  }

  static fillLhgAdminClaim(checkRambleScript = true, countryName = 'Germany'): void {
    cy.allure().logStep('Fill admin claim form and submit');
    cy.get(adminClaimSelectors.businessLegalName).type('TestCompany');
    cy.get(adminClaimSelectors.numberOfEmployees)
      .then((ele) => {
        cy.wrap(ele).click();
      })
      .then(() => {
        cy.get(adminClaimSelectors.dropdownOption).eq(0).click();
      });

    cy.checkIfExist(adminClaimSelectors.annualTravelBudget).then((exists: boolean) => {
      if (exists) {
        cy.get(adminClaimSelectors.annualTravelBudget)
          .then((ele) => {
            cy.wrap(ele).click();
          })
          .then(() => {
            cy.get(adminClaimSelectors.dropdownOption).first().click();
          });
      }
    });
    cy.get(adminClaimSelectors.configureCompanyAddress).type('Platz der Republik 1');
    cy.get(adminClaimSelectors.companyCity).type('Berlin');
    cy.get(adminClaimSelectors.configureCompanyZip).type('11011');
    cy.get(adminClaimSelectors.configureLHGCompanyCountry)
      .then((ele) => {
        cy.wrap(ele).click();
      })
      .then(() => {
        cy.get(adminClaimSelectors.dropdownOption).contains(countryName).click();
      });
    cy.wait(Timeouts.SHORT_TIMEOUT_3_SEC.timeout);
    cy.get(utilitySelector.bodySelector).click();
    cy.clearInputAndType(
      adminClaimSelectors.configureCompanyPhone,
      '{backspace}{backspace}+43 12312312'
    );
    cy.get(adminClaimSelectors.termsAndConditionCheck).click();
    cy.get(adminClaimSelectors.configureCompanyAccount).click();
    if (checkRambleScript) {
      cy.get(adminClaimSelectors.rambleScript, Timeouts.MEDIUM_TIMEOUT_60_SEC).should(
        'exist'
      );
    }
    cy.wait('@waitForCreateCompanyAccount').then((res) => {
      cy.task('putDataInCache', {
        key: 'companyUuid',
        data: res.response?.body?.companyUuid
      });
      AdminClaim.interceptedToken = res.response?.body?.token;
    });
    AmplitudeEvents.addExpectedAmplitudeEvents('create company account');
  }

  public static completeWebNavanRewardPromo(): void {
    cy.allure().logStep('Complete navan rewards promo steps');
    cy.get(adminClaimSelectors.webNavigationNext).click();
    cy.get(adminClaimSelectors.webNavigationNext).click();
    cy.get(adminClaimSelectors.webNavigationNext).click();

    AmplitudeEvents.addExpectedAmplitudeEvents(
      'self signup value proposition opened',
      'value proposition next step click',
      'value proposition next step click',
      'complete value proposition steps clicked'
    );
  }

  public static completeWebNavanRewardPromoWithExpense(): void {
    cy.allure().logStep('Start navan rewards promo steps from expense tab');
    cy.get(adminClaimSelectors.webNavigationNext).click();

    AmplitudeEvents.addExpectedAmplitudeEvents('value proposition next step click');
  }

  static verifyAdminClaimedOpen(): void {
    cy.allure().logStep('Verify configure-company open without value props');
    cy.url().should('include', '/configure-company');
    AmplitudeEvents.addExpectedAmplitudeEvents('admin claim page opened');
  }

  static verifyOnboardingSignupFlowNotShown(): void {
    cy.allure().logStep('Verify onboarding signup flow not shown');
    cy.url().should('not.include', '/signup');
  }

  static verifyAdminClaimedOpenOnMobile(): void {
    cy.allure().logStep('Verify configure-company open without value props');
    cy.url().should('include', '/setup-company');
    AmplitudeEvents.addExpectedAmplitudeEvents('admin claim page opened');
  }

  static verifyHomePageOpened(): void {
    cy.allure().logStep('Verify go to home page');
    cy.url().should('include', '/home');
  }

  static closeOnboardingGuide(): void {
    cy.allure().logStep('Close onboarding guide ');
    cy.get(adminClaimSelectors.onboardingGuideCloseButton).click({ force: true });
  }

  static clickCompanySetupNavBarCta(): void {
    cy.allure().logStep('Click on company setup nav bar cta');
    cy.get(adminClaimSelectors.companySetupNavBarCta).click();
  }

  static clickCompanySetupMidScreenCta(): void {
    cy.allure().logStep('Click on company setup mid screen cta');
    cy.get(adminClaimSelectors.companySetupMidScreenCta).click();
  }
}
