/**
 *
 */
package computer;

import game.TabToInt;
import game.TicTacToeFrame;

/**
 * @author alexis
 *
 */
public class MrComputer {

	private MrComputer() {}

	static public int getSolution(TicTacToeFrame game, boolean isX) throws Exception{
		int temp[] = new int[9];
		int count = 0;

		for(int i = 0; i < 9; i++)			//permet de regarder pour gagner avant tout le reste
		{
			TicTacToeFrame previsionGame;

			if(isX)
			{
				if(!game.getO(i, 0)&&!game.getX(i,0)){
					previsionGame = game.setX(i,0);
					if(previsionGame.getWinnerX())
						return i;//j+i*3;//*3;
				}
			}
			else
			{
				if(!game.getO(i, 0)&&!game.getX(i,0)){
					previsionGame = game.setO(i,0);
					if(previsionGame.getWinnerO())
						return i;//j+i*3;//9+j+i*3;
				}
			}
		}

		for(int i = 0; i < 3; i++)			//permet de regarder pour bloquer lautre avant tout le reste
		{
				TicTacToeFrame tempo;

				if(isX)
				{
					if(!game.getO(i, 0)&&!game.getX(i,0)){
						tempo = game.setO(i,0);
						if(tempo.getWinnerO())
							return i;//j+i*3;//*3;
					}
				}
				else
				{
					if(!game.getO(i, 0)&&!game.getX(i,0)){
						tempo = game.setX(i,0);
						if(tempo.getWinnerX())
						{
							return i;//i+j*3;//9+j+i*3;
						}
					}
				}
		}

		for(int i = 0; i < 9; i++)			//si on peut pas gagner ou bloquer, jouer strategiquement
		{
			if(isX)
				if(!game.getO(i, 0)&&!game.getX(i,0))
					temp[count] = solve(game.setX(i,0),isX,!isX);
				else
					temp[count]-= 1000;
			else
				if(!game.getO(i, 0)&&!game.getX(i,0))
					temp[count] = solve(game.setO(i,0),isX,!isX);
				else
					temp[count]-= 1000;
			count++;
		}

		return highestOfTable(temp);
	}

	static private int solve(TicTacToeFrame _game, boolean isX, boolean currentTurn) throws Exception{
		int probabilite = 0;

		for(int i = 0; i < 9; i++)
			if(currentTurn)
				if(!_game.getX(i,0) && !_game.getO(i, 0))
					probabilite = solve(_game.setX(i,0),isX,!currentTurn);

			else
				if(!_game.getX(i,0) && !_game.getO(i, 0))
					probabilite = solve(_game.setO(i,0),isX,!currentTurn);


		if(_game.getWinnerX())
		{
			if(isX)
				probabilite++;
			else
				probabilite--;
		}
		else if(_game.getWinnerO())
		{
			if(!isX)
				probabilite++;
			else
				probabilite--;
		}

		return probabilite;
	}

	static private int highestOfTable(int table[]){
		int temp = 0;

		for(int i = 0; i < 9; i++)
			if(table[i] > table[temp])
				temp = i;
		return temp;
	}

	/**
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		TicTacToeFrame game = TicTacToeFrame.fromEmpty();

		game = game.setX(2, 2);
		System.out.println(MrComputer.getSolution(game,false));
		game = game.setO(MrComputer.getSolution(game,false),0);
		System.out.println(game.toString());

		game=game.setX(1, 1);
		System.out.println(MrComputer.getSolution(game,false));
		game = game.setO(MrComputer.getSolution(game,false),0);
		System.out.println(game.toString());

		
		game=game.setX(0, 1);
		System.out.println(MrComputer.getSolution(game,false));
		game = game.setO(MrComputer.getSolution(game,false),0);
		System.out.println(game.toString());
	}

}
