import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;

/**
 * El programa comienza el juego Kalaha.
 * 
 */
public class Kalaha 
{
	/**
	 * Maxima profundidad de busqueda alpha-beta . 
	 */
	private static int PROFUNDIDAD;
	
	/**
	 * Numero de piedras iniciales en cada hoyo al comienzo.
	 */
	public int PIEDRAS;

	/**
	 * Numero de hoyos por jugador.
	 */
	public int HOYOS;
	
	/**
	 * Comprobar si el movimiento del jugador humano es valido o no.
	 * @param tablero el tablero a comprobar.
	 * @param hoyo el numero de hoyos a comprobar.
	 * @return Devuelve true si el movimiento es valido.
	 */
	
	public String entrada, nivel, eleccion;
	boolean humano;
	boolean control;
	KalahaPosicion posicionActual;
	PrintWriter writer ;
	public boolean MovimientoValido(int[] tablero, int hoyo) 
	{
		if (HOYOS==5)
			return  hoyo >= 6 && hoyo <= 10 && tablero[hoyo] != 0;
		// HOYOS=6
		return  hoyo >= 7 && hoyo <= 12 && tablero[hoyo] != 0;	
	}
	
	/**
	 * Comprueba si el nivel elegido es valido o no.
	 * @param entradanivel el nivel elegido. 
	 * @return Devuelve true si el nivel elegido es valido.
	 */
	public static boolean NivelLegal(int entradanivel)
	{
		return entradanivel >= 1 && entradanivel <= 3;
	}

	/**
	 * Constructor
	 */
	
	
	//public static void main(String[] args)
	public Kalaha()
	{
		
		this.Jugar();

		
	}
	
	public void Jugar()
	{
		posicionActual = new KalahaPosicion(PIEDRAS,HOYOS);
	    KalahaGUI gui = new KalahaGUI(this);
	    gui.TextoBotones();
		
		
		int entradanivel = 0;
		do 
		{
			control = false;
			gui.openHumanoDialog();
			
			//System.out.println("Elegir modalidad de juego");
			gui.jTextArea1.append("ELIGE LA MODALIDAD DE JUEGO \n");
			
				while (control == false)
				{
					try {
						Thread.sleep(100);
					} catch (final InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
			
				}
			gui.closeeleccionDialog();
			
			gui.openPiedrasDialog();
			PIEDRAS = 0;
			HOYOS = 0;
			//System.out.println("Elegir el tablero");
			gui.jTextArea1.append("ELIGE EL TABLERO \n");
			
				while (PIEDRAS == 0)
				{
					try {
						Thread.sleep(100);
					} catch (final InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				
				}
			  posicionActual = new KalahaPosicion(PIEDRAS,HOYOS);
			  gui.closeeleccionDialog(); 
			
			
			gui.opennivelDialog();
			nivel = null;
			
			//System.out.println("Elegir el nivel de dificultad");
			gui.jTextArea1.append("ELIGE EL NIVEL DE DIFICULTAD \n");
		
				while (nivel == null)
				{
					try {
						Thread.sleep(100);
					} catch (final InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
				}
			
				
			
			if (!NivelLegal(entradanivel = Integer.parseInt(nivel.trim())))
			//System.out.println("Nivel no valido: Elige un numero entre 1 y 3");
			gui.jTextArea1.append("NIVEL NO VALIDO: ELIGE UN NUMERO ENTRE 1 y 3\n");
		}
		while (!NivelLegal(entradanivel));
		switch (entradanivel)
		{
			case 1: PROFUNDIDAD = 1;gui.closeeleccionDialog(); break;
			case 2: PROFUNDIDAD = 5;gui.closeeleccionDialog(); break;
			case 3: PROFUNDIDAD = 15;gui.closeeleccionDialog(); break;
		}
		//System.out.println("Elige si quieres empezar");
		gui.jTextArea1.append("¿QUIERES EMPEZAR?\n");
		gui.openeleccionDialog();
		eleccion = null;
		
		
	
			while (eleccion == null)
			{
				try {
					Thread.sleep(100);
				} catch (final InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
			
		posicionActual.maxTurn = !"y".equalsIgnoreCase(eleccion.trim());
		gui.closeeleccionDialog();
		gui.openGame();
		
		//System.out.println(posicionActual + "\n  JUEGO COMENZADO\n");
		gui.jTextArea1.append("COMIENZA LA PARTIDA\n");
		while (!posicionActual.gameOver()) 
		{
			//Turno del humano
			//if (!posicionActual.maxTurn)
			if (humano && !posicionActual.maxTurn) //Usar esto si queremos jugar Computer Vs. Computer.
			{
				final BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
				int hoyo = 0;
				do 
				{
					
					//System.out.println("\nTu Turno,pincha en el hoyo que quieres repartir");
					gui.jTextArea1.append("TU TURNO\n");
					entrada = null;
					while (entrada == null)
					{
						try {
							Thread.sleep(100);
						} catch (final InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						
					}
					hoyo = Integer.parseInt(entrada);
					if (!MovimientoValido(posicionActual.tablero, hoyo))
						gui.jTextArea1.append("MOVIMIENTO NO VALIDO: ELIGE UN HOYO CON PIEDRAS.\n");
						//System.out.println("Movimiento no valido: Elige un numero entre 7 y 12 y que no este vacio.\n"); 
				} 		
				while (!MovimientoValido(posicionActual.tablero, hoyo));
				gui.jTextArea1.append("TU TURNO \n");
				System.out.println("Tu turno");
//				posicionActual.Mover(new KalahaMove(hoyo)); //Este método mueve el objeto de movimiento. 
				posicionActual.Mover(hoyo); //Este método mueve el objeto entero.
			}
			//Turno de la maquina
			else 
			{
				//System.out.println("\n Turno de la maquina");
				gui.jTextArea1.append("TURNO DE LA MAQUINA. LA MAQUINA ESTA PENSANDO...\n");
				
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
				final double time1 = System.currentTimeMillis();
                posicionActual.Mover(posicionActual.getmejormov(Kalaha.PROFUNDIDAD));
				final double time2 = System.currentTimeMillis();
				//System.out.println("Tiempo de busqueda: "+ (time2-time1)/1000 +" segundos");
			}
			gui.refresh();
			//System.out.println(posicionActual);
			//System.out.println("------------------------------");
		}
		gui.jTextArea1.append("FIN :");
		//System.out.println("FIN: ");
		if (HOYOS==6){
		if (posicionActual.tablero[6] < posicionActual.tablero[13])
			gui.jTextArea1.append("¡GANASTE!\n ");
			//System.out.println("Has ganado :-(\n" + posicionActual);
		else if (posicionActual.tablero[6] > posicionActual.tablero[13])
			//System.out.println("La maquina ha ganado :-)\n" + posicionActual);
		    gui.jTextArea1.append("LA MAQUINA HA GANADO.\n");
		else
			gui.jTextArea1.append("EMPATE.\n");
			//System.out.println("Tablas :-) = :-) \n" + posicionActual);
		}else{
		if (posicionActual.tablero[5] < posicionActual.tablero[11])
			gui.jTextArea1.append("¡GANASTE!\n ");
			//System.out.println("Has ganado :-(\n" + posicionActual);
		else if (posicionActual.tablero[5] > posicionActual.tablero[11])
			//System.out.println("La maquina ha ganado :-)\n" + posicionActual);
		    gui.jTextArea1.append("LA MAQUINA HA GANADO.\n");
		else
			gui.jTextArea1.append("EMPATE.\n");
			//System.out.println("Tablas :-) = :-) \n" + posicionActual);	
			
		}

		
	}
	
	// este metodo se usa para cambiar el valor de la cadena de entrada. De este modo, el usuario
	// puede tocar el agujero que quiere repartir de la GUI
	
	public void entradahoyoeleccion(String eleccion)
    {
    	
    	this.entrada = eleccion;
    }
	//Similar al metodo anterior pero para la cadena Nivel, usada para elegir el nivel de dificultad
	public void entradanivel(String eleccion)
	{
		this.nivel = eleccion;
	}
	//Similar a los metodos anteriores pero para elegir si empieza la maquina o el humano
	public void entradaeleccion(String eleccion)
	{
		this.eleccion = eleccion;
	}
	
		
	
	/**
	 * Metodo principal que empieza el programa.
	 * @param args
	 */
	public static void main(String[] args)
	{
		Kalaha game = new Kalaha();
	}
}