import { GrowthInterceptApis } from '@growth-lib/api-intercept';
import { Random, loginRequest } from 'cypress/artifacts';
import { stagingUsers } from '@fixtures/staging-users';
import { NewAccount } from '@growth-lib/growth-new-account';
import { CompanyAccountType, CompanySegmentType, ONBOARDING_GUIDE_SELECTORS } from '@growth-lib/onboarding-guide.utils';
import { OnboardingGuide } from '@growth-lib/onboarding-guide';
import { AddUser } from '@growth-lib/add-user';
import { AdminClaim } from '@growth-lib/admin-claim';

const { superAdmin } = stagingUsers;
const superAdminCredentials = Cypress.env('superAdmin').SUPER_ADMIN_PASSWORD;

describe('Growth: create new company and check onboarding guide pages for Travel company', () => {
  let userEmail = '';
  const completeTravelTasks = (loginToken: string, withAddress = false) => {
    AdminClaim.interceptedToken = loginToken;
    OnboardingGuide.verifyOnboardingGuideOpen();
    if (withAddress) {
      OnboardingGuide.verifyTaskCompleted(ONBOARDING_GUIDE_SELECTORS.addressTask);
    } else {
      OnboardingGuide.completeAddAddressTask();
      OnboardingGuide.openOnboardingGuide();
    }
    OnboardingGuide.completeGetReadyToTravel();
    OnboardingGuide.openOnboardingGuide();
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.reviewTravelPolicyMarkAsDone);
    OnboardingGuide.clickOn(ONBOARDING_GUIDE_SELECTORS.setUpTravelPaymentMethodMarkAsDone);
    OnboardingGuide.checkPageAddAndInviteUsers();
    const randomId = Random.randomString(6);
    userEmail = `cypress-traditional-onboarding-user-${randomId}@${NewAccount.randomDomain}`;
    AddUser.inviteNewUser(userEmail);
    OnboardingGuide.closeOnboardingGuide();
    OnboardingGuide.terminateOnboardingGuide();
  };

  const setupNewUser = () => {
    NewAccount.setupUser(userEmail).then((userToken: string) => {
      AdminClaim.interceptedToken = userToken;
      OnboardingGuide.verifyOnboardingGuideOpen();
      OnboardingGuide.verifyUserOnboardingTasks();
      OnboardingGuide.fillAllUserOnboardingTasks();
      OnboardingGuide.closeOnboardingGuide();
      OnboardingGuide.terminateOnboardingGuide();
    });
  };

  beforeEach(() => {
    GrowthInterceptApis.interceptApis();
    loginRequest(superAdmin.email, superAdminCredentials, true).then((token) => {
      NewAccount.SAToken = token;
    });
  });

  it('C14174956: complete TRAVEL + address', { tags: ['@tier1', '@onboardingGuideIndependent'] }, () => {
    NewAccount.createNewAccount({
      accountSegment: CompanySegmentType.SMB,
      accountType: CompanyAccountType.TRAVEL,
      address: {
        address1: '123 Main St',
        address2: 'Suite 100',
        city: 'San Francisco',
        state: 'CA',
        country: 'US',
        zipCode: '94105'
      }
    }).then((loginToken: string) => {
      const withAddress = true;
      completeTravelTasks(loginToken, withAddress);
      setupNewUser();
    });
  });

  it('C14174957: complete TRAVEL WITHOUT address', { tags: ['@tier1', '@onboardingGuideIndependent'] }, () => {
    NewAccount.createNewAccount({
      accountSegment: CompanySegmentType.COMMERCIAL,
      accountType: CompanyAccountType.TRAVEL
    }).then((loginToken: string) => {
      completeTravelTasks(loginToken);
      setupNewUser();
    });
  });
});
