import { AdminClaim } from '@growth-lib/admin-claim';
import { LEAD_TOKEN } from '@support-growth/login-self-sell';
import Chainable = Cypress.Chainable;
import { Accept } from '@support-base/request_header';
import { HttpRequest } from '../../../artifacts';
import { defaultPersonaData, OnboardParams, PersonaQuestionsData } from '@growth-lib/model';
import { stagingUsers } from '@fixtures/staging-users';
import { HomePage } from '@rebranded_home_page-lib/home-page';

const PASSWORD = Cypress.env('newUser')?.NEW_USER_PASSWORD;

enum onboardApis {
  onboardLead = 'api/selfSell/onboard',
  personaQuestionsUpdate = 'api/selfSell/leads/growth/update',
  adminClaim = 'api/selfSell/company/onboard'
}

export class OnboardByApi {
  static ONBOARD_TOKEN: string;

  static onboard(leadToken?: string, origin?: string, onboardParams?: OnboardParams): Chainable<any> {
    cy.allure().logStep(`onboarding user with lead token`);
    return cy
      .request({
        method: HttpRequest.Post,
        url: `${onboardApis.onboardLead}?token=${leadToken || LEAD_TOKEN}`,
        body: {
          firstName: onboardParams?.firstName || 'test',
          lastName: onboardParams?.lastName || 'test',
          leadPhoneNumber: onboardParams?.leadPhoneNumber || '',
          password: PASSWORD,
          origin: origin || 'MARKETING_PAGE',
          // iovation_blackbox: '',
          accountType: onboardParams?.accountType || 'TRAVEL_AND_LIQUID',
          signupReason: onboardParams?.signupReason || 'TRAVEL_AND_EXPENSE_SOLUTION'
        },
        headers: {},
        retryOnStatusCodeFailure: false
      })
      .then((response) => {
        expect(response.status).to.eq(200);
        cy.task('putDataInCache', {
          key: 'companyUuid',
          data: response?.body?.companyUuid
        });
        cy.allure().logStep(`userUuid ${response?.body?.userUuid}`);
        cy.allure().logStep(`companyName ${response?.body?.companyName}`);
        cy.allure().logStep(`companyDomain ${response?.body?.companyDomain}`);
        cy.allure().logStep(`companyUuid ${response?.body?.companyUuid}`);
        cy.allure().logStep(`token ${response?.body?.token}`);
        OnboardByApi.ONBOARD_TOKEN = response?.body?.token;
      });
  }

  static fillPersona(data = defaultPersonaData): Chainable<any> {
    cy.allure().logStep(`posting persona questions data: ${JSON.stringify(data)}`);
    return cy
      .request({
        method: HttpRequest.Post,
        url: onboardApis.personaQuestionsUpdate,
        body: data,
        headers: {
          Authorization: `TripActions ${OnboardByApi.ONBOARD_TOKEN}`,
          Accept: Accept.ApplicationJson
        },
        retryOnStatusCodeFailure: false
      })
      .then((response) => {
        expect(response.status).to.eq(200);
      });
  }

  static onboardAndFillPersona(leadToken?: string, origin?: string, data?: PersonaQuestionsData): Chainable<any> {
    return OnboardByApi.onboard(leadToken, origin).then(() => {
      return OnboardByApi.fillPersona(data);
    });
  }

  static onboardSelfSellAdmin(leadToken?: string, origin?: string, data?: PersonaQuestionsData): Chainable<any> {
    return OnboardByApi.onboard(leadToken, origin)
      .then(() => {
        return OnboardByApi.fillPersona(data);
      })
      .then(() => {
        return OnboardByApi.fillAdminClaim();
      });
  }

  static onboardSelfSellRouge(leadToken?: string, origin?: string, data?: PersonaQuestionsData): Chainable<any> {
    return OnboardByApi.onboard(leadToken, origin).then(() => {
      data = { ...defaultPersonaData, ...data, userRole: data?.userRole || 'TRAVELER' };
      return OnboardByApi.fillPersona(data);
    });
  }

  static fillAdminClaim(): Chainable<any> {
    return cy.task('getDataFromCache', 'companyNameSuffix').then((companyNameSuffix) => {
      const companyName = 'TestCompany' + companyNameSuffix;

      cy.task('putDataInCache', {
        key: 'companyName',
        data: companyName
      });

      cy.allure().logStep(`posting admin claim for ${companyName}`);
      return cy
        .request({
          method: HttpRequest.Post,
          url: onboardApis.adminClaim,
          body: {
            address: {
              line1: 'page mill 1501',
              line2: '',
              city: 'Palo Alto',
              state: 'CA',
              country: 'US',
              postalCode: '94304'
            },
            businessLegalName: companyName,
            businessPhoneNumber: '+112692673678',
            maxEmployeeCount: 10,
            annualTravelBudget: 1
          },
          headers: {
            Authorization: `TripActions ${OnboardByApi.ONBOARD_TOKEN}`,
            Accept: Accept.ApplicationJson
          },
          retryOnStatusCodeFailure: false
        })
        .then((response) => {
          expect(response.status).to.eq(200);
          AdminClaim.interceptedToken = response?.body?.token;
        });
    });
  }

  static loginWithOnboardedUser(visitHomePage = true): Chainable<any> {
    return cy.task('getDataFromCache', 'userEmail').then((userEmail) => {
      cy.allure().logStep(`login with onboarded user ${userEmail}`);
      cy.loginWithAuthToken({ email: userEmail, password: PASSWORD });
      if (visitHomePage) {
        cy.allure().logStep(`login with onboarded user moving to home screen`);
        HomePage.visitHomePage();
      }
    });
  }

  static deleteLastOnboardedCompany(): Chainable<any> {
    const delegateStaticCompanyUuid = stagingUsers?.travel_planner_user?.companyUuid;
    return cy.task('getDataFromCache', 'companyUuid').then((companyUuid) => {
      if (!companyUuid || delegateStaticCompanyUuid === companyUuid) {
        throw new Error('No companyUuid for deletion');
      }

      cy.allure().logStep(`deleting company ${companyUuid}`);
      return cy.deleteCompany(companyUuid.toString());
    });
  }
}
