<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Redux2</title>
	<style>
		td, th{
			border: 1px solid black;
		}
	</style>
</head>
<body>

	<!-- <input type="text" id="tovar"> -->
	<select id='tovar'>
		<option value="пиво">пиво</option>
		<option value="чипсы">чипсы</option>
		<option value="сиги">сиги</option>
	</select>
	<input type="number" id="skok" placeholder="сколько надо?">
	<input type="number" id="bablo" placeholder="сколько денег?">
	<button id="btn">Купить</button>
	<p id="error"></p>

	<script>
		function reducer(state, {type, ШО, СКОКА, БАБЛО}){
    	if (!state){ 
       		return {
            	пиво:{колво:100, цена: 10},
            	чипсы:{колво:100, цена:20},
            	сиги:{колво:100, цена:30},
            	касса:2700
        	}
    	}
    		if (type === 'КУПИТЬ'){ 
    			if((ШО in state) && БАБЛО >= state[ШО].цена * СКОКА  && state[ШО].колво - СКОКА >= 0){
    				return {
        				...state,
              			[ШО]:{колво:state[ШО].колво - СКОКА, цена: state[ШО].цена},
            			касса: +state.касса + (state[ШО].цена*СКОКА)
          			} 
      			}else{
      				error.innerHTML='\&#9785; что-то не так (нет данного товара или не хватает денег) \&#9785;';
      				setTimeout(()=>error.innerHTML='',2000);
      			}
    		}	
      		return state ;
		}

		function createStore(reducer){
    		let state       = reducer(undefined, {}) 
    		let cbs         = []                     
    		const getState  = () => state  
    		const subscribe = cb => (cbs.push(cb),  
                             () => cbs = cbs.filter(c => c !== cb)); 
    		const dispatch  = action => { 
        		const newState = reducer(state, action) 
        			if (newState !== state){ 
            			state = newState  
            			for (let cb of cbs)  cb() 
        			}
    		}
    		return {
        		getState, 	
        		dispatch,
        		subscribe 
    		}
		}

		let store=createStore(reducer);
		btn.onclick=function(){
			for(let [key] of Object.entries(store.getState())){
				if(tovar.value===key){
					store.dispatch({type: 'КУПИТЬ', ШО:tovar.value, СКОКА: skok.value, БАБЛО: bablo.value });
					console.log(store.getState());
				}
			}
		}

		let table=document.createElement('table');
		for(let [key,value] of Object.entries(store.getState())){
			let tr=document.createElement('tr');
			let td=document.createElement('th');
			let td2=document.createElement('td');
			let td3=document.createElement('td');
			td.innerText=key;
			if(typeof value==='object'){
				for(let i in value){
					if(i==='колво'){
						td2.innerText=+value[i];
					}
					if(i==='цена'){
						td3.innerText=value[i];
					}	
				}
			}else{
				td2.innerText=value;
			}
			tr.append(td,td2,td3);
			table.append(tr);
			table.style.border='1px solid black';	
		}
		document.body.append(table);

		const unsubscribe=store.subscribe(()=>{
			while (table.hasChildNodes()) {
    			table.removeChild(table.firstChild);
			}
			for(let [key,value] of Object.entries(store.getState())){
				let tr=document.createElement('tr');
				let td=document.createElement('td');
				let td2=document.createElement('td');
				let td3=document.createElement('td');
				td.innerText=key;
				if(typeof value==='object'){
					for(let i in value){
						if(i==='колво'){
							td2.innerText=value[i];
						}
						if(i==='цена'){
							td3.innerText=value[i];
						}		
					}
				}else{
					td2.innerText=value;
				}
				tr.append(td,td2,td3);
				table.append(tr);
			}
			document.body.append(table);
		})

	

	</script>
</body>
</html>