/**
* Possible sum combination Algorithm
*
* @param {array} arr - Array of Numbers
* @param {int} n - number of items
*
*/
var possibleCombinationSum = function(arr, n) {
  if (arr.indexOf(n) >= 0) { return true; }
  if (arr[0] > n) { return false; }
  if (arr[arr.length - 1] > n) {
    arr.pop();
    return possibleCombinationSum(arr, n);
  }
  var listSize = arr.length, combinationsCount = (1 << listSize)
  for (var i = 1; i < combinationsCount ; i++ ) {
    var combinationSum = 0;
    for (var j=0 ; j < listSize ; j++) {
      if (i & (1 << j)) { combinationSum += arr[j]; }
    }
    if (n === combinationSum) { return true; }
  }
  return false;
};
/**
* Stars component
*
* @param {object} props
*
*/
const Stars = (props) => {
  return (
    
    {_.range(props.numberOfStars).map(i => 
       
    )}
    
  );
}; 
/**
* Button component
*
* @param {object} props
*
*/
const Button = (props) => {
let button;
switch(props.correctAnswer) {
	case true:
  	button = 
      ;
    break;
  case false:
  	button = 
      ;  
    break;
  default:
    	button =
        ;      
      break;
}
  return (
    
      {button}
      
      
    
  );
};
/**
* Numbers component
*
* @param {object} props
*
*/
const Numbers = (props) => {
	const numberClassName = (number) => {
  	if(props.selectedNumbers.indexOf(number) >= 0) {
    	return 'selected'
    }
    
    if(props.usedNumbers.indexOf(number) >= 0) {
    	return 'used'
    }
  };
  return (
  	
    	
    	  {Numbers.list.map((number, i) => 
        	 props.selectNumber(number)}>
          	{number}
          
        )}
    	
     
  );
}
Numbers.list = _.range(1,10);
/**
* Answer component
*
* @param {object} props
*
*/
const Answer = (props) => {
  return (
    
    {props.selectedNumbers.map((number, i) => 
         props.deselectNumber(number)}>
          {number}
        
      )} 
    
  );
};
/**
* DoneFrame component
*
* @param {object} props
*
*/
const DoneFrame = (props) => {
	return (
  	
  	  
{props.gameStatus}
      
  	
  );
	
}
/**
* Game component
*
*/
class Game extends React.Component {
static randomNumber = () => 1 + Math.floor(Math.random() * 9);
static initialState = () => ({
	selectedNumbers: [],
  randomNumberOfStars: Game.randomNumber(),
  correctAnswer: null,
  usedNumbers: [],
  redraws: 5,
  gameStatus: null
});
state = Game.initialState();
  selectNumber = (clickedNumber) => {
    if (this.state.selectedNumbers.indexOf(clickedNumber) >= 0) { return; }
  	this.setState(prevState => ({
    	correctAnswer: null,
  		selectedNumbers: prevState.selectedNumbers.concat(clickedNumber)
  	}));
  };
  
  deselectNumber = (clickedNumber) => {
  	this.setState(prevState => ({
    	correctAnswer: null,
    	selectedNumbers: prevState.selectedNumbers.filter(number => number !== clickedNumber)
    }));
  }
  
  checkAnswer = () => {
  	this.setState(prevState => ({
    	correctAnswer: prevState.randomNumberOfStars === prevState.selectedNumbers
                              .reduce((acc, n) => acc + n, 0)
    }))
  };
  
  acceptAnswer = () => {
  	this.setState(prevState => ({ 
    	usedNumbers: prevState.usedNumbers.concat(prevState.selectedNumbers),
      selectedNumbers: [],
      correctAnswer: null,
      randomNumberOfStars: Game.randomNumber()
    }), this.updateGameStatus);
  };
  
  redraw = () => {
  	if (this.state.redraws === 0) { return; }
  	this.setState(prevState => ({
    	randomNumberOfStars: Game.randomNumber(),
      correctAnswer: null,
      selectedNumbers: [],
      redraws: prevState.redraws - 1
    }), this.updateGameStatus);
  };
  
  possibleSolutions = ({ randomNumberOfStars, usedNumbers }) => {
  	const possibleNumbers = _.range(1, 10).filter(number => usedNumbers.indexOf(number) === -1);
    return possibleCombinationSum(possibleNumbers, randomNumberOfStars);
  };
  
  updateGameStatus = () => {
  	this.setState(prevState => {
    	if(prevState.usedNumbers.length === 9) {
      	return { gameStatus: 'Done. Nice' };
      }
      if(prevState.redraws === 0 && !this.possibleSolutions(prevState)) {
      	return { gameStatus: 'Game Over!' };
      }
    });
  };
  
  resetGame = () => {
  	this.setState(Game.initialState())
  };
  render() {
  const { selectedNumbers, randomNumberOfStars, correctAnswer, usedNumbers, redraws, gameStatus } = this.state;
    return (
      
        Play Nine
        
        
        
        {gameStatus ? 
        	
 :
          
        }
       
    );
  }
}
/**
* App component
*
* @param {object} props
*
*/
class App extends React.Component {
  render() {
    return (
      
        
      
    );
  }
}
ReactDOM.render(, mountNode);