/* eslint-disable @typescript-eslint/camelcase */
/* eslint-disable @typescript-eslint/no-explicit-any */
import GenericStrategy from './GenericStrategy';
import EventAction from '../EventAction';

import { LoginProps, LoginStatus, Order, Provider, ProviderMethod, UserProfile } from '../types';
import { onLoginOnboardingReasons, onLoginTransformProfile } from '../transforms/transforms.web';
import { makeTrustworthy } from '../util';

export default class WebStrategy extends GenericStrategy implements Provider {
  protected action: EventAction;

  protected provider: any;

  protected debug: boolean;

  constructor(provider: any, debug: boolean) {
    super();
    this.action = new EventAction();
    this.provider = provider;
    this.debug = debug;
  }

  addEvent(eventName: string, payload: Record<string, any> = {}): void {
    if (!payload) {
      // eslint-disable-next-line no-param-reassign
      payload = {};
    }
    // eslint-disable-next-line no-param-reassign
    payload.channel = 'Web';

    if (window && window.location.href) {
      const ref = new URLSearchParams(window.location.href.split('?')[1]).get('ref');
      // eslint-disable-next-line no-param-reassign
      payload.ref = ref;
    }

    this.provider.event.push(eventName, payload);

    if (this.debug) console.log('Event send to Providers: ', eventName, payload);
  }

  charged(payload: any): void {
    const { completed } = payload as Record<string, Order>;
    this.action.charged(this.addEvent.bind(this), completed);
  }

  login(payload: LoginStatus): void {
    this.action.login(this.addEvent.bind(this), payload);
  }

  logout(): void {
    this.action.logout(this.addEvent.bind(this));
  }

  onUserLogin(payload: any): void {
    const { authUser } = payload;
    const userProfile: UserProfile = onLoginTransformProfile(authUser);
    if (this.debug) console.log('Profile send: ', userProfile);
    if (!userProfile) return;
    this.provider.onUserLogin.push({ Site: makeTrustworthy(userProfile) });
  }

  onUserSelectReasons(payload: any): void {
    const { user } = payload;
    const userProfile: UserProfile = onLoginOnboardingReasons(user);
    if (this.debug) console.log('Profile send: ', userProfile);
    if (!userProfile) return;
    this.provider.onUserLogin.push({ Site: makeTrustworthy(userProfile) });
  }

  orderSubmited(): void {
    // NOTE: It doesn't have implementation for web.
  }

  passwordResetSent(): void {
    this.action.passwordResetSent(this.addEvent.bind(this));
  }

  productAddedToSkipList(): void {
    // NOTE: It doesn't have implementation for web.
  }

  productRemovedFromSkipList(): void {
    // NOTE: It doesn't have implementation for web.
  }

  signUpStarted(payload: any): void {
    const { product } = payload as Record<string, LoginProps>;
    this.action.signUpStarted(this.addEvent.bind(this), product);
  }

  deepLinkClicked(): void {
    // NOTE: It doesn't have implementation for web.
  }

  deepLinkOpened(): void {
    // NOTE: It doesn't have implementation for web.
  }

  setUserLocation(): void {
    // NOTE: It doesn't have implementation for web.
  }

  updateFCMtoken(): void {
    // NOTE: It doesn't have implementation for web.
  }

  visitsHomePage(payload: any): void {
    const { url } = payload;

    if (!url) return;

    this.action.visitsHomePage(this.addEvent.bind(this), { Current_Page: url });
  }

  visitsJoinPage(payload: any): void {
    const { url } = payload;

    if (!url) return;

    this.action.visitsJoinPage(this.addEvent.bind(this), { Current_Page: url });
  }

  visitsPremiumPage(payload: any): void {
    const { url } = payload;

    if (!url) return;

    this.action.visitsPremiumPage(this.addEvent.bind(this), { Current_Page: url });
  }

  visitsFreePage(payload: any): void {
    const { url } = payload;

    if (!url) return;

    this.action.visitsFreePage(this.addEvent.bind(this), { Current_Page: url });
  }

  visitsOnboarding(payload: any): void {
    const { url } = payload;

    if (!url) return;

    this.action.visitsOnboarding(this.addEvent.bind(this), { Current_Page: url });
  }

  visitsDashboard?(payload: any): void {
    const { url } = payload;

    if (!url) return;

    this.action.visitsDashboard(this.addEvent.bind(this), { Current_Page: url });
  }

  visitsBusinessProfile?(payload: any): void {
    const { url } = payload;

    if (!url) return;

    this.action.visitsBusinessProfile(this.addEvent.bind(this), { Current_Page: url });
  }

  visitsRemindersPage?(payload: any): void {
    const { url } = payload;

    if (!url) return;

    this.action.visitsRemindersPage(this.addEvent.bind(this), { Current_Page: url });
  }

  userClicksSignUp(payload: any): void {
    const { url } = payload;

    if (!url) return;

    this.action.userClicksSignUp(this.addEvent.bind(this), { Current_Page: url });
  }

  userCompletesBusinessProfile(payload: any): void {
    const { url } = payload;

    if (!url) return;

    this.action.userCompletesBusinessProfile(this.addEvent.bind(this), { Current_Page: url });
  }

  userClickTodoItem(payload: any): void {
    const { todoType } = payload;

    if (!todoType) return;

    this.action.userClickTodoItem(this.addEvent.bind(this), { TodoType: todoType });
  }

  userConfirmsSubscription(payload: any): void {
    const { selectedPlan, url, billingInterval } = payload;

    if (!selectedPlan) return;

    this.action.userConfirmsSubscription(this.addEvent.bind(this), {
      Selected_Plan: selectedPlan,
      Current_Page: url,
      Billing_Interval: billingInterval
    });
  }

  userScheduledOnboardingCall(payload: any): void {
    const { url } = payload;

    if (!url) return;

    this.action.userScheduledOnboardingCall(this.addEvent.bind(this), { Current_Page: url });
  }

  appReviewed?(payload: any): void {
    // NOTE: It doesn't have implementation for web.
  }

  userFeaturedBusinessOnSkip(payload: any): void {
    this.action.userFeaturedBusinessOnSkip(this.addEvent.bind(this), payload);
  }

  // CONTINUE FROM HERE

  accountCreated(payload: any): void {
    const { url, source } = payload;

    if (!url || !source) return;

    this.action.accountCreated(this.addEvent.bind(this), { Current_Page: url, source });
  }

  accountCreatedError(payload: any): void {
    const { url, source } = payload;

    if (!url || !source) return;

    this.action.accountCreatedError(this.addEvent.bind(this), { Current_Page: url, source });
  }

  clickedAnnual(payload: any): void {
    const { url, source } = payload;

    if (!url || !source) return;

    this.action.clickedAnnual(this.addEvent.bind(this), { Current_Page: url, source });
  }

  clickedAutoSubCheckbox(payload: any): void {
    // NOTE: It doesn't have implementation for web.
  }

  clickedCardNumberField(payload: any): void {
    const { url, source } = payload;

    if (!url || !source) return;

    this.action.clickedCardNumberField(this.addEvent.bind(this), { Current_Page: url, source });
  }

  clickedCheckAvailability(payload: any): void {
    const { url, source, billingInterval } = payload;

    if (!url || !source || !billingInterval) return;

    this.action.clickedCheckAvailability(this.addEvent.bind(this), {
      Current_Page: url,
      source,
      Billing_Interval: billingInterval
    });
  }

  clickedConfirm(payload: any): void {
    const { url, source } = payload;

    if (!url || !source) return;

    this.action.clickedConfirm(this.addEvent.bind(this), { Current_Page: url, source });
  }

  clickedContinuetoDashboard(payload: any): void {
    const { url, source } = payload;

    if (!url || !source) return;

    this.action.clickedMonthly(this.addEvent.bind(this), { Current_Page: url, source });
  }

  clickedDownloadApp(payload: any): void {
    const { url, source } = payload;

    if (!url) return;

    this.action.clickedDownloadApp(this.addEvent.bind(this), { Current_Page: url, source });
  }

  clickedFunding(payload: any): void {
    const { url, cta } = payload;

    if (!url || !cta) return;

    this.action.clickedFunding(this.addEvent.bind(this), { Current_Page: url, cta });
  }

  clickedLogin(payload: any): void {
    const { url } = payload;

    if (!url) return;

    this.action.clickedDownloadApp(this.addEvent.bind(this), { Current_Page: url });
  }

  clickedMonthly(payload: any): void {
    const { url, source } = payload;

    if (!url || !source) return;

    this.action.clickedMonthly(this.addEvent.bind(this), { Current_Page: url, source });
  }

  clickedPrivacyPolicy(payload: any): void {
    // NOTE: It doesn't have implementation for web.
  }

  clickedReferralEmailField(payload: any): void {
    // NOTE: It doesn't have implementation for web.
  }

  clickedReviewReadMore(payload: any): void {
    // NOTE: It doesn't have implementation for web.
  }

  clickedSaveNewPassword(payload: any): void {
    // NOTE: It doesn't have implementation for web.
  }

  clickedSendInvites(payload: any): void {
    const { url, invite1, invite2 } = payload;

    if (!url) return;

    this.action.clickedSendInvites(this.addEvent.bind(this), { Current_Page: url, invite1, invite2 });
  }

  clickedTermsandConditions(payload: any): void {
    // NOTE: It doesn't have implementation for web.
  }

  paymentVerifiedError(payload: any): void {
    const { url, source } = payload;

    if (!url || !source) return;

    this.action.paymentVerifiedError(this.addEvent.bind(this), { Current_Page: url, source });
  }

  paymentVerifiedSuccess(payload: any): void {
    const { url, source } = payload;

    if (!url || !source) return;

    this.action.paymentVerifiedSuccess(this.addEvent.bind(this), { Current_Page: url, source });
  }

  saveNewPasswordError(payload: any): void {
    // NOTE: It doesn't have implementation for web.
  }

  viewedCalendlyCalendar(payload: any): void {
    const { url, source } = payload;

    if (!url || !source) return;

    this.action.viewedCalendlyCalendar(this.addEvent.bind(this), { Current_Page: url, source });
  }

  viewedNewPasswordPage(payload: any): void {
    const { url } = payload;

    if (!url) return;

    this.action.viewedNewPasswordPage(this.addEvent.bind(this), { Current_Page: url });
  }

  viewedPaymentInfo(payload: any): void {
    const { url, source } = payload;

    if (!url || !source) return;

    this.action.viewedPaymentInfo(this.addEvent.bind(this), { Current_Page: url, source });
  }

  viewedPlusPage(payload: any): void {
    const { url } = payload;

    if (!url) return;

    this.action.viewedPlusPage(this.addEvent.bind(this), { Current_Page: url });
  }

  viewedPremiumConciergePage(payload: any): void {
    const { url } = payload;

    if (!url) return;

    this.action.viewedPremiumConciergePage(this.addEvent.bind(this), { Current_Page: url });
  }

  // plop

  addedLoanApplicationTracking(payload: any): void {
    const { businessId } = payload;

    if (!businessId) return;

    this.action.addedLoanApplicationTracking(this.addEvent.bind(this), { businessId });
  }

  clickedServiceFlow(payload: any): void {
    const { serviceFlowName } = payload;

    if (!serviceFlowName) return;

    this.action.clickedServiceFlow(this.addEvent.bind(this), { serviceFlowName });
  }

  upgradedFromAccountDetails(payload: any): void {
    const { userData } = payload;

    if (!userData) return;

    this.action.upgradedFromAccountDetails(this.addEvent.bind(this), { userData });
  }

  upgradedFromLatestFundingOpportunity(payload: any): void {
    const { opportunity } = payload;

    if (!opportunity) return;

    this.action.upgradedFromLatestFundingOpportunity(this.addEvent.bind(this), { opportunity });
  }

  addedFundingGoal(payload: any): void {
    const { fundingGoal } = payload;

    if (!fundingGoal) return;

    this.action.addedFundingGoal(this.addEvent.bind(this), { fundingGoal });
  }

  clickOnBlog(payload: any): void {
    this.action.clickOnBlog(this.addEvent.bind(this), {});
  }

  notInterestedInFundingOpportunity(payload: any): void {
    const { opportunity } = payload;

    if (!opportunity) return;

    this.action.notInterestedInFundingOpportunity(this.addEvent.bind(this), { opportunity });
  }

  sharedReferralLink(payload: any): void {
    const { referralCode } = payload;

    if (!referralCode) return;

    this.action.sharedReferralLink(this.addEvent.bind(this), { referralCode });
  }

  exitedAddBusinessModal(payload: any): void {
    const { userId } = payload;

    if (!userId) return;

    this.action.exitedAddBusinessModal(this.addEvent.bind(this), { userId });
  }

  addedBusiness(payload: any): void {
    const { userId } = payload;

    if (!userId) return;

    this.action.addedBusiness(this.addEvent.bind(this), { userId });
  }

  invitesAFriend(payload: any): void {
    const { emailList } = payload;

    if (!emailList) return;

    this.action.invitesAFriend(this.addEvent.bind(this), { emailList });
  }

  viewedPlatinumConciergePage(payload: any): void {
    const { url } = payload;

    if (!url) return;

    this.action.viewedPlatinumConciergePage(this.addEvent.bind(this), { Current_Page: url });
  }
}
