package core;

import java.util.Scanner;
import exception.OutOfBoardException;

/**
 * Cette classe permet d'afficher le plateau et contrôler le jeu.
 */
public class Game {

	/**
	 * Le plateau de jeu.
	 */
	private Board board;

	/**
	 * Construit un jeu à partir d'un plateau donné.
	 * 
	 * @param board
	 *            Le plateau de jeu.
	 */
	public Game(Board board) {
		this.board = board;
	}

	/**
	 * Construit par défaut un jeu avec 2 pions sur un plateau 4x4 cases.
	 */
	public Game() {
		this(new Board(4, 4, 2));
	}

	/**
	 * Démarre et contrôle la boucle de jeu.
	 */
	public void start() {
		Scanner scanner = new Scanner(System.in);
		while (!this.isGameOver()) {
			System.out.println(this);
			int chosenint;
			do {
				System.out.println("Choisissez une direction : ");
				int counter = 0;
				for (Direction d : Direction.values()) {
					System.out.println(counter + ": " + d.name());
					counter++;
				}
				chosenint = scanner.nextInt();
			} while (chosenint >= Direction.values().length || chosenint < 0);
			try {
				System.out
						.println(this.moveNextPawn(Direction.values()[chosenint]));
			} catch (OutOfBoardException e) {
				System.out
						.println("Vous ne pouvez pas aller dans cette direction ! Votre tour est perdu...");
			}
		}
		scanner.close();
	}

	/**
	 * Le jeu est terminé s'il reste un seul pion sur le plateau ou si un pion
	 * possède 3 pièces d'or ou plus.
	 * 
	 * @return true si le jeu est terminé.
	 */
	public boolean isGameOver() {
		return (board.numberOfPawns() == 1) || (board.maxGold() >= 3);
	}

	/**
	 * @return Une chaîne de caractères décrivant l'état courant du jeu : le
	 *         plateau + si le jeu est terminé ou non.
	 */
	public String toString() {
		String result = board.toString();
		if (isGameOver())
			result += "\n\n GAME OVER";
		return result;
	}

	/**
	 * Déplace le pion dont c'est le tour dans une direction.
	 * 
	 * @param d
	 *            La direction dans laquelle le pion doit se déplacer.
	 * @return Un message concernant ce qui est arrivé.
	 * @throws OutOfBoardException
	 *             si le déplacement est invalide par rapport au plateau.
	 */
	public String moveNextPawn(Direction d) throws OutOfBoardException {
		return this.board.getNextPawn().move(d);
	}

	public static void main(String[] args) {
		new Game().start();
	}

}
