import { Timeouts } from '@utility-lib/index';
import { LoginPage, AdminInterceptsApis } from '@admin-lib/index';
import { LRMApiIntercept } from '@lrm-lib/api-intercept';
import { GrowthInterceptApis, LoginSelfSell } from '@growth-lib/index';
import { GrowthModalUtility } from '../modal/growth_modal';

export const underWritingSubmittedApplicationsSelectors = {
  termsAndConditionCheck: '[data-testid="termsAndConditionCheck"] input',
  searchForUnderWritingCompanies:
    '.content-container .filter-container .search-input-wrapper',
  searchForUnderWritingCompaniesInput:
    '.content-container .filter-container .search-input-wrapper input',
  company: 'tbody tr',
  companyNameFilterInput: '[placeholder="Company Name"]',
  liquidApplicationStatus: '.MuiCardContent-root dt + dd',
  plaidStatus: '.content-container .plaid-status',
  assignedToStatus: '.content-container .assigned-to',
  monthlyCardSpent: '.spendlimit li:nth-child(3) span:nth-child(2)',
  requestedSpendLimit: '.spendlimit li:nth-child(2) span:nth-child(2)',
  travelSubmitted: '.content-container .travel-submitted',
  declineLiquidCard: '.action-card .secondary',
  approveLiquidCard: '.action-card .success',
  spendLimitTextBox: '.amount-input .input-wrapper input',
  confirmLiquidApprovalButton: '.tal-modal.application-approval-modal .primary',
  toastSummaryMessageDetails: '.p-toast-detail',
  applicationStatus: 'div dt + dd',
  alloyApplicationStatus: 'div h3 + p + ul li span div',
  plaidConnectivity: '.MuiCard-root:nth-child(4) > ul li:nth-child(3) span:nth-child(2)',
  uwStatusCardApplicationUpdate: '.action-card uw-status-card div div',
  confirmLiquidDeclineButton: '.tal-modal.application-decline-modal .primary'
};

type SubmitDetails = {
  liquidStatus: string;
  requestedSpendLimit: string;
  monthlyCardSpent: string;
};

export class UnderWritingApplications {
  static onBoardSelfSellUpsellUser(emailSuffix: string) {
    let token: string;
    LRMApiIntercept.interceptLRMApis();
    GrowthInterceptApis.interceptApis();
    LoginSelfSell.createNewSelfSellLead({
      emailSuffix: emailSuffix
    })
      .then((login) => {
        token = login.token;
      })
      .then(() => {
        GrowthModalUtility.onBoardGrowthUser(token);
      });
  }
  static validateSubmittedApplication(): void {
    let nameSuffix: any;
    cy.allure().logStep('Validate Submitted Application:');
    cy.task('getDataFromCache', 'companyNameSuffix').then((companyNameSuffix) => {
      nameSuffix = companyNameSuffix;
      cy.get(underWritingSubmittedApplicationsSelectors.companyNameFilterInput).type(
        nameSuffix
      );
      this.validateCompany();
    });
  }

  static loginToUnderWritingAndValidateCompanyStatus(
    email: string,
    superAdminCredentials: string
  ): void {
    LoginPage.clearExistingLoginSession();
    AdminInterceptsApis.interceptAdminsApis();
    cy.loginWithAuthToken({ email, password: superAdminCredentials, isSA: true });
    cy.visit('/app/underwriting/companies').then(() => {
      UnderWritingApplications.validateSubmittedApplication();
    });
  }
  static selectSubmittedApplication(): void {
    cy.allure().logStep('Select Submitted Application:');
    cy.wait(Timeouts.MEDIUM_TIMEOUT_10_SEC.timeout);
    cy.get(underWritingSubmittedApplicationsSelectors.company)
      .eq(0)
      .should('be.visible')
      .click();
    cy.wait('@selfSellApplications');
  }

  static validateApproveLiquidDetails(connectBankCheck: string) {
    cy.get(underWritingSubmittedApplicationsSelectors.alloyApplicationStatus).contains(
      'Alloy awaiting answer'
    );
    if (connectBankCheck == 'plaid') {
      cy.get(underWritingSubmittedApplicationsSelectors.plaidConnectivity).contains(
        'Yes'
      );
    } else {
      cy.get(underWritingSubmittedApplicationsSelectors.plaidConnectivity).contains('No');
    }
  }

  static approveLiquid(limitAmount: string) {
    cy.allure().logStep('Approve Liquid Amount:' + limitAmount);
    cy.wait(Timeouts.MEDIUM_TIMEOUT_10_SEC.timeout);
    cy.get(underWritingSubmittedApplicationsSelectors.spendLimitTextBox)
      .should('be.visible')
      .type(limitAmount);
    cy.get(underWritingSubmittedApplicationsSelectors.approveLiquidCard)
      .should('be.visible')
      .click({ force: true });
    cy.get(
      underWritingSubmittedApplicationsSelectors.confirmLiquidApprovalButton,
      Timeouts.MEDIUM_TIMEOUT_60_SEC
    )
      .should('be.visible')
      .click({ force: true });
    cy.get(underWritingSubmittedApplicationsSelectors.toastSummaryMessageDetails)
      .should('be.visible')
      .contains('approved');
    cy.wait(Timeouts.SHORT_TIMEOUT_3_SEC.timeout);
    cy.reload();
    cy.wait(Timeouts.MEDIUM_TIMEOUT_10_SEC.timeout);

    cy.go('back');
  }

  static declineLiquid() {
    cy.allure().logStep('Decline Liquid');
    cy.get(underWritingSubmittedApplicationsSelectors.declineLiquidCard)
      .should('be.visible')
      .click({ force: true });
    cy.get(
      underWritingSubmittedApplicationsSelectors.confirmLiquidDeclineButton,
      Timeouts.MEDIUM_TIMEOUT_60_SEC
    )
      .should('be.visible')
      .click({ force: true });
    cy.get(underWritingSubmittedApplicationsSelectors.toastSummaryMessageDetails)
      .should('be.visible')
      .contains('decline');
    cy.wait(Timeouts.SHORT_TIMEOUT_3_SEC.timeout);
    cy.reload();
    cy.wait(Timeouts.SHORT_TIMEOUT_3_SEC.timeout);
    cy.go('back');
  }

  static validateSubmitDetails(submitDetails: SubmitDetails): void {
    const { liquidStatus, requestedSpendLimit, monthlyCardSpent } = submitDetails;
    cy.allure().logStep(
      'Validate Submit Details ' +
        ' liquidStatus ' +
        liquidStatus +
        ' requestedSpendLimit ' +
        requestedSpendLimit +
        ' monthlyCardSpent ' +
        monthlyCardSpent
    );
    this.validateLiquidStatus(liquidStatus);
    this.validateRequestedSpendLimit(requestedSpendLimit);
    this.validateMonthlyCardSpend(monthlyCardSpent);
  }

  static validateCompany() {
    cy.task('getDataFromCache', 'companyName').then((companyName) => {
      cy.allure().logStep(`Validate Company: ${companyName}`);
      this.checkIfLocatorExist(
        underWritingSubmittedApplicationsSelectors.company,
        `${companyName}`
      );
    });
  }

  static checkIfLocatorExist(selectorText: string, expectedString: string) {
    for (let i = 0; i < 5; i++) {
      if (!cy.checkIfExist(selectorText)) {
        cy.reload(true);
      } else {
        cy.get(selectorText).contains(`${expectedString}`);
        break;
      }
    }
  }

  static validateLiquidStatus(LiquidStatus: string) {
    cy.allure().logStep(`validate Liquid Status: ${LiquidStatus}`);
    cy.get(underWritingSubmittedApplicationsSelectors.liquidApplicationStatus)
      .should('be.visible')
      .should('have.text', LiquidStatus);
  }

  static validateMonthlyCardSpend(MonthlyCardSpent: string) {
    cy.allure().logStep(`Validate Monthyl Card Spend: ${MonthlyCardSpent}`);
    cy.get(underWritingSubmittedApplicationsSelectors.monthlyCardSpent)
      .should('be.visible')
      .should('have.text', MonthlyCardSpent);
  }

  static validateRequestedSpendLimit(SpendLimit: string) {
    cy.allure().logStep(`Validate Requested spend limit: ${SpendLimit}`);
    cy.get(underWritingSubmittedApplicationsSelectors.requestedSpendLimit)
      .should('be.visible')
      .should('have.text', SpendLimit);
  }
}
