/* eslint-disable import/no-cycle */ import type { Elements as ElementsActions } from 'Components/Calculation/config/map/actions'; import type * as Values from 'Components/Calculation/config/map/values'; import { getValueName } from 'Components/Calculation/config/map/values'; import type { BaseOption } from 'Elements/types'; import type RootStore from 'stores/root'; import OptionsStore from './options'; import StatusStore from './statuses'; import ValidationStore from './validation'; import ValuesStore from './values'; export default class CalculationStore { $values: ValuesStore; $status: StatusStore; $options: OptionsStore; $validation: ValidationStore; constructor(rootStore: RootStore) { this.$values = new ValuesStore(rootStore); this.$status = new StatusStore(rootStore); this.$options = new OptionsStore(rootStore); this.$validation = new ValidationStore(rootStore); } resetElement = (elementName: Values.Elements) => { this.resetElementValue(elementName); this.$options.resetOptions(elementName); this.$status.resetStatus(elementName); this.$validation.clearErrors(elementName); }; blockElement = (elementName: Values.Elements | ElementsActions) => { this.$status.setStatus(elementName, 'Disabled'); }; unblockElement = (elementName: Values.Elements | ElementsActions) => { this.$status.setStatus(elementName, 'Default'); }; getElementValue(elementName: E) { const valueName = getValueName(elementName); return this.$values.getValue(valueName) as Values.ElementsTypes[E]; } setElementValue = (elementName: E, value: Values.ElementsTypes[E]) => { const valueName = getValueName(elementName); this.$values.setValue(valueName, value); }; resetElementValue = (elementName: Values.Elements) => { const valueName = getValueName(elementName); this.$values.resetValue(valueName); }; setElementOptions = ( elementName: T, options: BaseOption[] ) => { this.$options.setOptions(elementName, options); }; resetElementOptions = (elementName: T) => { this.$options.resetOptions(elementName); }; getElementOption(elementName: T) { const value = this.getElementValue(elementName); return this.$options.getOptions(elementName)?.find((x) => x.value === value); } }