/* eslint-disable react/destructuring-assignment */
import type { ReactNode } from 'react';
import type React from 'react';
import { createContext, useEffect, useState } from 'react';
import { useSelector } from 'react-redux';

import type { FinancialsModel } from '../../../Pages/Financials/Components/FinancialsForm/FinancialsForm.helper';
import type { RootState } from '../../../ReduxState/store';
import cashFlowAnalysisCalculations from './cahs-flow-analysis-context-helper';

export type CashFlowAnalysisModel = {
	grossMargin: string;
	debtorsDays: string;
	investmentInWorkingCapital: string;
	ebitPercentOfRevenue: string;
	ebitPercentOfGrossMargin: string;
	stockDays: string;
	netProfitBeforeTax: string;
	creditorsDays: string;
	marginalCashFlow: string;
	cashDaysCycle: string;
};

export const CashFlowAnalysisContext: React.Context<CashFlowAnalysisModel> =
	createContext<CashFlowAnalysisModel>({
		grossMargin: '',
		debtorsDays: '',
		investmentInWorkingCapital: '',
		ebitPercentOfRevenue: '',
		ebitPercentOfGrossMargin: '',
		stockDays: '',
		netProfitBeforeTax: '',
		creditorsDays: '',
		marginalCashFlow: '',
		cashDaysCycle: ''
	});

const CashFlowAnalysisContextProvider: React.FC<{ children: ReactNode }> = (props: {
	children: ReactNode;
}) => {
	/** NEW */
	const selectedFinancials = useSelector(
		(state: RootState): FinancialsModel[] | null => state.financials.selectedFinancials
	);
	/** NEW end */

	const [grossMargin, setGrossMargin] = useState<string>('');
	const [debtorsDays, setDebtorsDays] = useState<string>('');
	const [investmentInWorkingCapital, setInvestmentInWorkingCapital] = useState<string>('');
	const [ebitPercentOfRevenue, setEbitPercentOfRevenue] = useState<string>('');
	const [ebitPercentOfGrossMargin, setEbitPercentOfGrossMargin] = useState<string>('');
	const [stockDays, setStockDays] = useState<string>('');
	const [netProfitBeforeTax, setNetProfitBeforeTax] = useState<string>('');
	const [creditorsDays, setCreditorsDays] = useState<string>('');
	const [marginalCashFlow, setMarginalCashFlow] = useState<string>('');
	const [cashDaysCycle, setCashDaysCycle] = useState<string>('');

	useEffect(() => {
		window.scrollTo(0, 0);
		// const thirdFinancial: FinancialsModel = JSON.parse(
		// 	localStorage.getItem('third-financial') as string
		// );
		if (!selectedFinancials || selectedFinancials.length < 3) {
			return;
		}
		const thirdFinancial: FinancialsModel = selectedFinancials[2];
		const {
			calculatedGrossMargin,
			calculatedDebtorsDays,
			calculatedInvestInWorkingCapital,
			calculatedEbitPercentOfRevenue,
			calculatedEbitPercentOfGrossMargin,
			calculatedStockDays,
			calculatedNetProfitBeforeTax,
			calculatedCreditorsDays,
			calculatedMarginalCashFlow,
			calculatedCashDaysCycle
		} = cashFlowAnalysisCalculations(thirdFinancial);
		setGrossMargin(calculatedGrossMargin.toFixed(2).toString());
		setDebtorsDays(calculatedDebtorsDays.toFixed(0).toString());
		setInvestmentInWorkingCapital(calculatedInvestInWorkingCapital.toFixed(2).toString());
		setEbitPercentOfRevenue(calculatedEbitPercentOfRevenue.toFixed(2).toString());
		setEbitPercentOfGrossMargin(calculatedEbitPercentOfGrossMargin.toFixed(2).toString());
		setStockDays(calculatedStockDays.toFixed(0).toString());
		setNetProfitBeforeTax(calculatedNetProfitBeforeTax.toFixed(2).toString());
		setCreditorsDays(calculatedCreditorsDays.toFixed(0).toString());
		setMarginalCashFlow(calculatedMarginalCashFlow.toFixed(2).toString());
		setCashDaysCycle(calculatedCashDaysCycle.toFixed(0).toString());
		// eslint-disable-next-line react-hooks/exhaustive-deps
	}, [
		selectedFinancials,
		localStorage.getItem('second-financial'),
		localStorage.getItem('third-financial')
	]);

	// eslint-disable-next-line react/jsx-no-constructed-context-values
	const contextValue = {
		grossMargin,
		debtorsDays,
		investmentInWorkingCapital,
		ebitPercentOfRevenue,
		ebitPercentOfGrossMargin,
		stockDays,
		netProfitBeforeTax,
		creditorsDays,
		marginalCashFlow,
		cashDaysCycle
	};
	return (
		<CashFlowAnalysisContext.Provider value={contextValue}>
			{props.children}
		</CashFlowAnalysisContext.Provider>
	);
};

export default CashFlowAnalysisContextProvider;
