

import { useSelector } from 'react-redux';
import {
  companyInformation as companyInformationSelector
} from '@root/store/companyInformation/companyInformation.selector';
import { stepIds } from '@root/constants';
import { progressTracker } from '@root/store/progressTracker/progressTracker.selector';
import { scoringInputsResp } from '@root/store/scoringInputs/scoringInputs.selector';
import { loadPitAdjResp } from '@root/store/loadPitAdj/loadPitAdj.selector';
import { userInformationResp } from '@store/userInformation/userInformation.selector';
import { loggingService } from '@spglobal/ca-mfe-package-utils';

export const ActivityTracking = () => {
  const getAdjustmentsSelected = (steppers, adjustments = []) => {
    steppers.forEach(step => {
      if (step.isSubSection && step?.nestedSteps?.length && step?.stepId === 'adjustments') {
        if (step?.nestedSteps) {
          step?.nestedSteps.forEach(nestedStep => {
            if (nestedStep.status === 'completed') {
              const adjName = {
                [stepIds.QUALITATIVE_ADJUSTMENTS]: 'qAdj',
                [stepIds.SIZE_ADJUSTMENTS]: 'sizeAdj',
                [stepIds.PARENT_ADJUSTMENTS]: 'pAdj',
                [stepIds.GOVERNMENT_SUPPORT]: 'gAdj',
                [stepIds.Pd_ADJUSTMENTS]: 'pitAdj'
              };
              adjustments.push(adjName[nestedStep?.stepId]);
            }
          });
        }
      }
    });
    return adjustments.join('-');
  };

  const getFinancialList = (scoringInputs, financials = []) => {
    const originalFinancialResp = scoringInputs?.originalResp?.data?.financial;
    const currentFinancialResp = scoringInputs?.currentResp?.data?.financial;
    currentFinancialResp?.forEach(currentFinancial => {
      originalFinancialResp?.forEach(originalFinancial => {
        if (originalFinancial?.metrics?.length && currentFinancial?.metrics?.length) {
          currentFinancial?.metrics?.forEach(currentMetrics => {
            originalFinancial?.metrics?.forEach(originalMetrics => {
              if (originalMetrics?.analyticsName === currentMetrics?.analyticsName) {
                if (!(originalMetrics?.numValue === currentMetrics?.numValue)) {
                  financials.push(currentMetrics?.analyticsName);
                }
              }
            });
          });
        }
      });
    });
    return financials.join('-');
  };

  const getNonFinancialList = (scoringInputs, nonFinancials = []) => {
    const originalNonFinancialResp = scoringInputs?.originalResp?.data?.nonFinancial;
    const currentNonFinancialResp = scoringInputs?.currentResp?.data?.nonFinancial;
    currentNonFinancialResp?.forEach(currentNonFinancial => {
      originalNonFinancialResp.forEach(originalNonFinancial => {
        if (originalNonFinancial?.metrics?.length && currentNonFinancial?.metrics?.length) {
          currentNonFinancial?.metrics?.forEach(currentMetrics => {
            originalNonFinancial?.metrics?.forEach(originalMetrics => {
              if (originalMetrics?.analyticsName === currentMetrics?.analyticsName) {
                if (!(originalMetrics?.numValue === currentMetrics?.numValue)) {
                  nonFinancials.push(currentMetrics?.analyticsName);
                }
              }
            });
          });
        }
      });
    });
    return nonFinancials.join('-');
  };

  const { companySelectedData, companyData, epdState } = useSelector(companyInformationSelector);
  const { steppers } = useSelector(progressTracker);
  const { scoringInputs } = useSelector(scoringInputsResp);
  const { loadPitAdj } = useSelector(loadPitAdjResp);
  const { userInfo } = useSelector(userInformationResp);
  const { currentResp } = loadPitAdj;

  const createActivityJson = {
    companyCategory: companyData?.isPropCompany ? 'PROP' : companyData?.isUnlinkCompany ? 'UNLINKED' :
      companyData?.companyId ? 'CIQ' : 'NOCOMPANY',
    companyType: companySelectedData?.type?.label,
    companyId: companyData?.companyId,
    appliedAdjustments: getAdjustmentsSelected(steppers),
    isEPD: typeof epdState?.scoreWithFinancials === 'boolean' && !epdState.scoreWithFinancials,
    pitAdjustmentDate: currentResp?.pitAdjustmentDate,
    isImputed: scoringInputs?.isImputation,
    financials: getFinancialList(scoringInputs),
    nonFinancials: getNonFinancialList(scoringInputs),
    modalFamily: 'RG',
    modelVersion: userInfo?.hasRiskGaugePlusCap ? '3.0' : '2.0'
  };

  let serializeData = '';
  for (const key in createActivityJson) {
    if (createActivityJson.hasOwnProperty(key) && createActivityJson[key]) {
      serializeData += `${createActivityJson[key]}|`;
    }
  }
  return serializeData;
};


export const logActivity = (logId, activityData) => {
  loggingService.activityLogs(logId, activityData);
};
