import { ConstantNode, Leaf } from './mecanisms/common'
import Allègement from './mecanisms/Allègement'
import ApplicableSi from './mecanisms/Applicable'
import Arrondi from './mecanisms/Arrondi'
import Barème from './mecanisms/Barème'
import Composantes from './mecanisms/Composantes'
import Durée from './mecanisms/Durée'
import Grille from './mecanisms/Grille'
import InversionNumérique from './mecanisms/InversionNumérique'
import Maximum from './mecanisms/Maximum'
import Minimum from './mecanisms/Minimum'
import NonApplicable from './mecanisms/NonApplicable'
import Operation from './mecanisms/Operation'
import ParDéfaut from './mecanisms/ParDéfaut'
import Plafond from './mecanisms/Plafond'
import Plancher from './mecanisms/Plancher'
import Product from './mecanisms/Product'
import Recalcul from './mecanisms/Recalcul'
import Replacement from './mecanisms/Replacement'
import ReplacementRule from './mecanisms/ReplacementRule'
import Rule from './mecanisms/Rule'
import Situation from './mecanisms/Situation'
import Somme from './mecanisms/Somme'
import Synchronisation from './mecanisms/Synchronisation'
import TauxProgressif from './mecanisms/TauxProgressif'
import ToutesCesConditions from './mecanisms/ToutesCesConditions'
import UneDeCesConditions from './mecanisms/UneDeCesConditions'
import UnePossibilité from './mecanisms/UnePossibilité'
import Unité from './mecanisms/Unité'
import Variations from './mecanisms/Variations'
import { useContext } from 'react'
import { EngineContext } from './contexts'

const UIComponents = {
	constant: ConstantNode,
	allègement: Allègement,
	'applicable si': ApplicableSi,
	arrondi: Arrondi,
	barème: Barème,
	composantes: Composantes,
	durée: Durée,
	grille: Grille,
	inversion: InversionNumérique,
	maximum: Maximum,
	minimum: Minimum,
	'non applicable si': NonApplicable,
	operation: Operation,
	'par défaut': ParDéfaut,
	plafond: Plafond,
	plancher: Plancher,
	produit: Product,
	reference: Leaf,
	rule: Rule,
	'nom dans la situation': Situation,
	somme: Somme,
	synchronisation: Synchronisation,
	recalcul: Recalcul,
	replacement: Replacement,
	replacementRule: ReplacementRule,
	'taux progressif': TauxProgressif,
	'toutes ces conditions': ToutesCesConditions,
	'une de ces conditions': UneDeCesConditions,
	'une possibilité': UnePossibilité,
	unité: Unité,
	'variable temporelle': () => '[variable temporelle]',
	variations: Variations,
} as const

export default function Explanation({ node }) {
	const visualisationKind = node.visualisationKind || node.nodeKind
	const engine = useContext(EngineContext)
	if (!engine) {
		throw new Error('We need an engine instance in the React context')
	}

	// On ne veut pas (pour l'instant) déclencher une évaluation juste pour
	// l'affichage.
	// A voir si cela doit évoluer...
	const displayedNode = node.evaluationId ? engine.evaluateNode(node) : node

	const Component = UIComponents[visualisationKind]
	if (!Component) {
		throw new Error(`Unknown visualisation: ${visualisationKind}`)
	}
	return <Component {...displayedNode} />
}
