import type { SelectChangeEvent } from '@mui/material/Select';
import type { ChangeEvent, ChangeEventHandler, FormEvent } from 'react';

import type { FinancialsModel } from '../../Pages/Financials/Components/FinancialsForm/FinancialsForm.helper';

export interface Action {
	type: string;
	value: number | string;
}

export interface ErrorMessageInterface {
	errorBankLoansCurrent: string;
	errorBankLoansNonCurrent: string;
	errorFixedAssets: string;
	errorTotalAssets: string;
	errorTotalCurrentAssets: string;
	errorTotalCurrentLiabilities: string;
	errorTotalLiabilities: string;
	errorCogs: string;
	errorCashAtBank: string;
	errorDeferredRevenue: string;
	errorDepreciation: string;
	errorDividends: string;
	errorEbit: string;
	errorGrossProfit: string;
	errorDirectLabour: string;
	errorIncreaseRevenueBy: string;
	errorInterestPaid: string;
	errorNetProfit: string;
	errorOtherIncome: string;
	errorRevenue: string;
	errorStock: string;
	errorTradeCreditors: string;
	errorTradeDebtors: string;
	errorYearEnding: string;
	errorYearStart: string;
	errorBanksLendEBITDAMultiplierMax: string;
	errorMonthStart: string;
	errorMonthEnding: string;
}

export const emptyErrorMessageObject = {
	errorBankLoansCurrent: '',
	errorBankLoansNonCurrent: '',
	errorFixedAssets: '',
	errorTotalAssets: '',
	errorTotalCurrentAssets: '',
	errorTotalCurrentLiabilities: '',
	errorTotalLiabilities: '',
	errorCogs: '',
	errorCashAtBank: '',
	errorDeferredRevenue: '',
	errorDepreciation: '',
	errorDividends: '',
	errorEbit: '',
	errorGrossProfit: '',
	errorDirectLabour: '',
	errorIncreaseRevenueBy: '',
	errorInterestPaid: '',
	errorNetProfit: '',
	errorOtherIncome: '',
	errorRevenue: '',
	errorStock: '',
	errorTradeCreditors: '',
	errorTradeDebtors: '',
	errorYearEnding: '',
	errorYearStart: '',
	errorBanksLendEBITDAMultiplierMax: '',
	errorMonthStart: '',
	errorMonthEnding: ''
};

function formatCurrency(value: number): string {
	return new Intl.NumberFormat('en-US', {
		style: 'currency',
		currency: 'USD'
	}).format(value);
}

export default function financialsFormContextHelper(
	state: FinancialsFormInterface,
	action: Action,
	initialState: FinancialsFormInterface
): FinancialsFormInterface {
	console.log('this is the action', action);
	switch (action.type) {
		case 'FIRST_MONTH':
			return {
				...state,
				MonthStart: action.value.toString()
			};

		case 'FIRST_YEAR':
			return {
				...state,
				YearStart: action.value.toString()
			};

		case 'LAST_MONTH':
			return {
				...state,
				MonthEnding: action.value.toString()
			};

		case 'LAST_YEAR':
			return {
				...state,
				YearEnding: action.value.toString()
			};

		case 'REVENUE':
			return {
				...state,
				// Revenue: formatCurrency(+action.value)
				Revenue: action.value.toString()
			};

		case 'COGS':
			return {
				...state,
				COGS: action.value.toString()
			};

		case 'GROSS_PROFIT':
			return {
				...state,
				GrossProfit: action.value.toString()
			};

		case 'DIRECT_LABOUR':
			return {
				...state,
				DirectLabour: action.value.toString()
			};

		case 'EBIT':
			return {
				...state,
				EBIT: action.value.toString()
			};

		case 'NET_PROFIT':
			return {
				...state,
				NetProfit: action.value.toString()
			};

		case 'DEPRECIATION':
			return {
				...state,
				Depreciation: action.value.toString()
			};

		case 'INTEREST_PAID':
			console.log('INTEREST_PAID', action.value);
			return {
				...state,
				InterestPaid: action.value.toString()
			};

		case 'OTHER_INCOME':
			return {
				...state,
				OtherIncome: action.value.toString()
			};

		case 'DIVIDENDS':
			return {
				...state,
				Dividends: action.value.toString()
			};

		case 'CASH_IN_BANK':
			return {
				...state,
				CashAtBank: action.value.toString()
			};

		case 'TRADE_DEBTORS':
			return {
				...state,
				TradeDebtors: action.value.toString()
			};

		case 'STOCK_DAYS_WIP':
			return {
				...state,
				Stock: action.value.toString()
			};

		case 'DEFERRED_REVENUE':
			return {
				...state,
				deferredRevenue: action.value.toString()
			};

		case 'TOTAL_CURRENT_ASSETS':
			return {
				...state,
				totalCurrentAssets: action.value.toString()
			};

		case 'FIXED_ASSETS':
			return {
				...state,
				fixedAssets: action.value.toString()
			};

		case 'TRADE_CREDITORS':
			return {
				...state,
				TradeCreditors: action.value.toString()
			};

		case 'TOTAL_ASSETS':
			return {
				...state,
				totalAssets: action.value.toString()
			};

		case 'TOTAL_CURRENT_LIABILITIES':
			return {
				...state,
				totalCurrentLiabilities: action.value.toString()
			};

		case 'TOTAL_LIABILITIES':
			return {
				...state,
				totalLiabilities: action.value.toString()
			};

		case 'BANK_LOANS_CURRENT':
			return {
				...state,
				bankLoansCurrent: action.value.toString()
			};

		case 'BANK_LOANS_NON_CURRENT':
			return {
				...state,
				bankLoansNonCurrent: action.value.toString()
			};

		case 'INCREASE_REVENUE':
			return {
				...state,
				IncreaseRevenueBy: action.value.toString()
			};

		case 'COMPANY_ID_FINANCIALS':
			return {
				...state,
				companyId: action.value as string
			};

		case 'FINANCIALS_ID':
			return {
				...state,
				financialsId: action.value.toString()
			};

		case 'CLEAR':
			return initialState;

		default:
			return initialState;
	}
}

export type FinancialsTypeContextModel = {
	getFirstMonthHandler: (event: SelectChangeEvent) => void;
	getFirstYearHandler: (event: SelectChangeEvent) => void;
	getLastYearHandler: (event: SelectChangeEvent) => void;
	getLastMonthHandler: (event: SelectChangeEvent) => void;
	getRevenueHandler: (event: ChangeEvent<HTMLInputElement>) => void;
	getCogsHandler: (event: ChangeEvent<HTMLInputElement>) => void;
	getGrossProfitHandler: (event: ChangeEvent<HTMLInputElement>) => void;
	getDirectLabourHandler: (event: ChangeEvent<HTMLInputElement>) => void;
	getEbitHandler: (event: ChangeEvent<HTMLInputElement>) => void;
	getNetProfitHandler: (event: ChangeEvent<HTMLInputElement>) => void;
	getDepreciationAmortisationHandler: (event: ChangeEvent<HTMLInputElement>) => void;
	getInterestPaidHandler: (event: ChangeEvent<HTMLInputElement>) => void;
	getOtherIncomeHandler: (event: ChangeEvent<HTMLInputElement>) => void;
	getDividendsHandler: (event: ChangeEvent<HTMLInputElement>) => void;
	getCashInBankHandler: (event: ChangeEvent<HTMLInputElement>) => void;
	getTradeDebtorsHandler: (event: ChangeEvent<HTMLInputElement>) => void;
	getStockDaysWIPHandler: (event: ChangeEvent<HTMLInputElement>) => void;
	getTotalCurrentAssetsHandler: (event: ChangeEvent<HTMLInputElement>) => void;
	getFixedAssetsHandler: (event: ChangeEvent<HTMLInputElement>) => void;
	getTotalAssetsHandler: (event: ChangeEvent<HTMLInputElement>) => void;
	getTradeCreditorsHandler: (event: ChangeEvent<HTMLInputElement>) => void;
	getTotalCurrentLiabilitiesHandler: (event: ChangeEvent<HTMLInputElement>) => void;
	getTotalLiabilitiesHandler: (event: ChangeEvent<HTMLInputElement>) => void;
	getBankLoansCurrentHandler: (event: ChangeEvent<HTMLInputElement>) => void;
	getBankLoansNonCurrentHandler: (event: ChangeEvent<HTMLInputElement>) => void;
	handleSanitizedChange: (
		originalHandler: (event: ChangeEvent<HTMLInputElement>) => void
	) => ChangeEventHandler<HTMLInputElement> | undefined;
	getIncreaseRevenueByHandler: (event: ChangeEvent<HTMLInputElement>) => void;
	handleInputData: (event: ChangeEvent<HTMLInputElement>) => void;
	bankLoansCurrent: string;
	bankLoansNonCurrent: string;
	fixedAssets: string;
	totalAssets: string;
	totalCurrentAssets: string;
	totalCurrentLiabilities: string;
	totalLiabilities: string;
	BanksLendEBITDAMultiplierMax: string;
	BanksLendEBITDAMultiplierMin: string;
	COGS: string;
	CashAtBank: string;
	Depreciation: string;
	Dividends: string;
	EBIT: string;
	GrossProfit: string;
	DirectLabour: string;
	IncreaseRevenueBy: string;
	InterestPaid: string;
	MonthEnding: string;
	MonthStart: string;
	NetProfit: string;
	OtherIncome: string;
	Revenue: string;
	Stock: string;
	deferredRevenue: string;
	TradeCreditors: string;
	TradeDebtors: string;
	YearEnding: string;
	YearStart: string;
	incrementHandler: (event: FormEvent<Element>) => void;
	decrementHandler: (event: FormEvent<Element>) => void;
	editHandler: (event: FinancialsModel | undefined) => void;
	cancelHandler: () => void;
	submitFinancialFormHandler: () => Promise<boolean>;
	getCompanyIdHandler: (event: string) => void;
	setFinancialsIdHandler: () => void;
	getDeferredRevenueHandler: (event: ChangeEvent<HTMLInputElement>) => void;
	companyId: string;
	financialsId: string;
	errorMessage: ErrorMessageInterface;
	onBlurHandler: () => void;
	formSendSuccessfully: boolean;
	switchToFormHandler: (event: boolean) => void;
	switchToForm: boolean;
};

export const FinancialsFormDefaultValues = {
	getFirstMonthHandler: (): void => {},
	getFirstYearHandler: (): void => {},
	getLastYearHandler: (): void => {},
	getLastMonthHandler: (): void => {},
	getRevenueHandler: (): void => {},
	getCogsHandler: (): void => {},
	getGrossProfitHandler: (): void => {},
	getDirectLabourHandler: (): void => {},
	getEbitHandler: (): void => {},
	getNetProfitHandler: (): void => {},
	getDepreciationAmortisationHandler: (): void => {},
	getInterestPaidHandler: (): void => {},
	getOtherIncomeHandler: (): void => {},
	getDividendsHandler: (): void => {},
	getCashInBankHandler: (): void => {},
	getTradeDebtorsHandler: (): void => {},
	getStockDaysWIPHandler: (): void => {},
	getTotalCurrentAssetsHandler: (): void => {},
	getFixedAssetsHandler: (): void => {},
	getTotalAssetsHandler: (): void => {},
	getTradeCreditorsHandler: (): void => {},
	getTotalCurrentLiabilitiesHandler: (): void => {},
	getTotalLiabilitiesHandler: (): void => {},
	getBankLoansCurrentHandler: (): void => {},
	getBankLoansNonCurrentHandler: (): void => {},
	getIncreaseRevenueByHandler: (): void => {},
	handleSanitizedChange: (): ChangeEventHandler<HTMLInputElement> | undefined => undefined,
	handleInputData: (): void => {},
	bankLoansCurrent: '',
	bankLoansNonCurrent: '',
	fixedAssets: '',
	totalAssets: '',
	totalCurrentAssets: '',
	totalCurrentLiabilities: '',
	totalLiabilities: '',
	BanksLendEBITDAMultiplierMax: '',
	BanksLendEBITDAMultiplierMin: '',
	COGS: '',
	CashAtBank: '',
	Depreciation: '',
	Dividends: '',
	EBIT: '',
	GrossProfit: '',
	DirectLabour: '',
	IncreaseRevenueBy: '100',
	InterestPaid: '',
	MonthEnding: 'January',
	MonthStart: 'January',
	NetProfit: '',
	OtherIncome: '',
	Revenue: '',
	Stock: '',
	deferredRevenue: '',
	TradeCreditors: '',
	TradeDebtors: '',
	YearEnding: '2022',
	YearStart: '2022',
	incrementHandler: (): void => {},
	decrementHandler: (): void => {},
	editHandler: (): void => {},
	cancelHandler: (): void => {},
	submitFinancialFormHandler: async (): Promise<boolean> => false,
	getCompanyIdHandler: (): void => {},
	setFinancialsIdHandler: (): void => {},
	getDeferredRevenueHandler: (): void => {},
	companyId: '',
	financialsId: '',
	errorMessage: emptyErrorMessageObject,
	onBlurHandler: (): void => {},
	formSendSuccessfully: false,
	switchToFormHandler: (): void => {},
	switchToForm: false
};

export interface FinancialsFormInterface {
	bankLoansCurrent: string;
	bankLoansNonCurrent: string;
	fixedAssets: string;
	totalAssets: string;
	totalCurrentAssets: string;
	totalCurrentLiabilities: string;
	totalLiabilities: string;
	BanksLendEBITDAMultiplierMax: string;
	BanksLendEBITDAMultiplierMin: string;
	COGS: string;
	CashAtBank: string;
	Depreciation: string;
	Dividends: string;
	EBIT: string;
	GrossProfit: string;
	DirectLabour: string;
	IncreaseRevenueBy: string;
	InterestPaid: string;
	MonthEnding: string;
	MonthStart: string;
	NetProfit: string;
	OtherIncome: string;
	Revenue: string;
	Stock: string;
	deferredRevenue: string;
	TradeCreditors: string;
	TradeDebtors: string;
	YearEnding: string;
	YearStart: string;
	companyId: string;
	financialsId: string;
}

export const FinancialsFormDefault: FinancialsFormInterface = {
	bankLoansCurrent: '',
	bankLoansNonCurrent: '',
	fixedAssets: '',
	totalAssets: '',
	totalCurrentAssets: '',
	totalCurrentLiabilities: '',
	totalLiabilities: '',
	BanksLendEBITDAMultiplierMax: '',
	BanksLendEBITDAMultiplierMin: '',
	COGS: '',
	CashAtBank: '',
	Depreciation: '',
	Dividends: '',
	EBIT: '',
	GrossProfit: '',
	DirectLabour: '',
	IncreaseRevenueBy: '100',
	InterestPaid: '',
	MonthEnding: '',
	MonthStart: '',
	NetProfit: '',
	OtherIncome: '',
	Revenue: '',
	Stock: '',
	deferredRevenue: '',
	TradeCreditors: '',
	TradeDebtors: '',
	YearEnding: '',
	YearStart: '',
	companyId: '',
	financialsId: ''
};

export enum Users {
	basic,
	grow,
	pro
}
