package allumettes;

/**
 * Classe permettant d'arbitrer la partie en faisant respecter
 * les différentes règles du jeu.
 * @author Édouard Lumet
 *
 */
public class Arbitre {

	// Attributs
	/** Premier joueur de la partie. */
	private Joueur joueur1;
	/** Second joueur de la partie. */
	private Joueur joueur2;

	/**
	 * Constructeur de la classe Arbitre.
	 * @param j1 Le premier joueur
	 * @param j2 Le second joueur
	 */
	public Arbitre(Joueur j1, Joueur j2) {
		this.joueur1 = j1;
		this.joueur2 = j2;
	}

	/**
	 * Méthode pour arbitrer le jeu, avec passage d'un
	 * joueur à un autre et surveillance des règles.
	 * @param jeu Le jeu à arbitrer
	 */
	public void arbitrer(JeuReel jeu) {
		JeuProxy proxy = new JeuProxy(jeu);
		Joueur joueurCourant = this.joueur1;
		try {
			while (jeu.getNombreAllumettes() > 0) {
				try {
					// Affichage
					System.out.println("Nombre d'allumettes "
							+ "restantes : "
							+ jeu.getNombreAllumettes());
					System.out.println("Au tour de "
							+ joueurCourant.getNom());

					// Détermine le nombre d'allumette(s) à prendre
					int prise = joueurCourant.getPrise(proxy);

					// Affichage
					System.out.print(joueurCourant.getNom()
						+ " prend " + prise + " allumette");
					if (prise > 1) {
						System.out.println("s.");
					} else {
						System.out.println(".");
					}

					// Retrait du nombre d'allumette(s)
					jeu.retirer(prise);

					System.out.println();

					// Changement de joueur
					if (joueurCourant == this.joueur1) {
						joueurCourant = this.joueur2;
					} else {
						joueurCourant = this.joueur1;
					}
				} catch (CoupInvalideException e) {
					System.out.println("Erreur ! " + e.getMessage());
					System.out.println("Recommencez !");
				}
			}

			// Partie terminée, affichage de l'issue du jeu
			if (joueurCourant == joueur1) {
				System.out.println(joueur2.getNom() + " a perdu !");
			} else {
				System.out.println(joueur1.getNom() + " a perdu !");
			}
			System.out.println(joueurCourant.getNom() + " a gagné !");

		} catch (OperationInterditeException e) {
			System.out.println("Partie abandonnée car "
					+ joueurCourant.getNom() + e.getMessage());
		}
	}
}
