import logo from './logo.svg';
import {useEffect,useState} from 'react';
import './App.css';

function EquationGroup(p) {
	const {equation,setEquation,data,arr,key,id} = p
	
	const [myArr,setMyArr] = useState(arr)
	
	useEffect(()=>{
		var eqArr = [...equation]
		eqArr[id] = [...myArr]
		setEquation(eqArr)
	},[myArr])
	
	return <>
	<span style={{fontSize:"24px"}}>(</span>
		<div style={{display:"inline-block",border:"3px solid green"}}>
			<button style={{backgroundColor:"blue",color:"white"}}>Add Value</button>
			<button style={{backgroundColor:"green",color:"white"}}>Add Group</button>
			<button style={{backgroundColor:"beige",color:"black"}}>Add Operator</button>
			<br/>
			{arr.map((eq,i)=>Array.isArray(eq)?<EquationGroup equation={myArr} setEquation={setMyArr} data={data} arr={eq} key={i} id={i}/>:eq==="×"||eq==="-"||eq==="+"||eq==="÷"?<EquationOperator equation={myArr} setEquation={setMyArr} data={data} operator={eq} key={i} id={i}/>:<EquationValue equation={myArr} setEquation={setMyArr} data={data} val={eq} key={i} id={i}/>)}
		</div>
	<span style={{fontSize:"24px"}}>)</span>
	</>
}

function EquationOperator(p) {
	const {equation,setEquation,data,operator,key,id} = p
	
	const [op,setOp] = useState(operator)
	
	useEffect(()=>{
		var eqArr = [...equation]
		eqArr[id] = op
		setEquation(eqArr)
	},[op])
	
	return <select value={op} defaultValue={operator} onChange={(ev)=>{setOp(ev.currentTarget.value)}}>
		{["+","-","×","÷"].map((sign)=><option key={sign} value={sign}>{sign}</option>)}
	</select>
}

function EquationValue(p) {
	const {equation,setEquation,data,val,key,id} = p
	
	const [item,setItem] = useState(val)
	
	useEffect(()=>{
		var eqArr = [...equation]
		eqArr[id] = item
		setEquation(eqArr)
	},[item])
	
	return <div style={{display:"inline-block",border:"1px solid black"}}>
	<select value={item} defaultValue={val} onChange={(ev)=>{setItem(ev.currentTarget.value)}}>
		{Object.keys(data).map((key)=><option key={key} value={key}>{key}</option>)}
	</select>
	<br/>
	{data[val]}
	</div>
}

function Equation(p) {
	const {data} = p
	const [equation,setEquation]=useState([["data2"],"+","data3"])
	
	function SolveEquation(eq) {
		var newEq = [...eq]
		//Parenthesis.
		for (var i=0;i<newEq.length;i++) {
			if (Array.isArray(newEq[i])) {
				newEq.splice(i,1,SolveEquation(newEq[i]))
			}
		}
		//Multiplication and Division first.
		for (i=0;i<newEq.length-1;i++) {
			if (newEq[i]==="×") {
				var product = Number(typeof newEq[i-1]==="number"?newEq[i-1]:data[newEq[i-1]])*Number(typeof newEq[i+1]==="number"?newEq[i+1]:data[newEq[i+1]])
				newEq.splice(i-1,3,product)
				i--
			} else
			if (newEq[i]==="÷") {
				var quotient = Number(typeof newEq[i-1]==="number"?newEq[i-1]:data[newEq[i-1]])/Number(typeof newEq[i+1]==="number"?newEq[i+1]:data[newEq[i+1]])
				newEq.splice(i-1,3,quotient)
				i--
			}
		}
		for (i=0;i<newEq.length-1;i++) {
			if (newEq[i]==="+") {
				var sum = Number(typeof newEq[i-1]==="number"?newEq[i-1]:data[newEq[i-1]])+Number(typeof newEq[i+1]==="number"?newEq[i+1]:data[newEq[i+1]])
				newEq.splice(i-1,3,sum)
				i--
			} else
			if (newEq[i]==="-") {
				var difference = Number(typeof newEq[i-1]==="number"?newEq[i-1]:data[newEq[i-1]])-Number(typeof newEq[i+1]==="number"?newEq[i+1]:data[newEq[i+1]])
				newEq.splice(i-1,3,difference)
				i--
			}
		}
		return typeof newEq[0]==="number"?newEq[0]:Number(data[newEq[0]])
	}
	
	return <>
		<button style={{backgroundColor:"blue",color:"white"}}>Add Value</button>
		<button style={{backgroundColor:"green",color:"white"}}>Add Group</button>
		<button style={{backgroundColor:"beige",color:"black"}}>Add Operator</button>
		<br/><br/>
		
		{equation.map((eq,i)=>Array.isArray(eq)?<EquationGroup equation={equation} setEquation={setEquation} data={data} arr={eq} key={i} id={i}/>:eq==="×"||eq==="-"||eq==="+"||eq==="÷"?<EquationOperator equation={equation} setEquation={setEquation} data={data} operator={eq} key={i} id={i}/>:<EquationValue equation={equation} setEquation={setEquation} data={data} val={eq} key={i} id={i}/>)}
		
		<br/><br/>
		<h1>{SolveEquation(equation)}</h1>
	</>
}

function App() {
	const fieldData = {
		data1:84,
		data2:49,
		data3:3.5,
		data4:67
	}
	
  return (
    <div className="App">
		<hr/>
		<Equation data={fieldData}/>
    </div>
  );
}

export default App;