package allumettes;

/** Lance une partie des 13 allumettes en fonction des arguments fournis
 * sur la ligne de commande.
 * @author	Xavier Crégut
 * @version	$Revision: 1.5 $
 */
public class Partie {

	/** Nombre d'allumettes en jeu dans la partie. */
	private static final int NB_EN_JEU = 13;

	/** Lancer une partie. En argument sont donnés les deux joueurs sous
	 * la forme nom@stratégie.
	 * @param args la description des deux joueurs
	 */
	public static void main(String[] args) {
		try {
			verifierNombreArguments(args);

			// Traitement des arguments
			String infoJoueur1[] = args[0].split("@");
			String infoJoueur2[] = args[1].split("@");

			// Création des joueurs
			Joueur j1 = new Joueur(infoJoueur1[0],
					initialiserStrategie(infoJoueur1[1]));
			Joueur j2 = new Joueur(infoJoueur2[0],
					initialiserStrategie(infoJoueur2[1]));
			JeuReel leJeu = new JeuReel(NB_EN_JEU);
			Arbitre arbitre = new Arbitre(j1, j2);
			arbitre.arbitrer(leJeu);

		} catch (ConfigurationException e) {
			System.out.println();
			System.out.println("Erreur : " + e.getMessage());
			afficherUsage();
			System.exit(1);
		}
	}

	/**
	 * Initialiser la stratégie en fonction de son nom.
	 * @param str Le nom de la stratégie
	 * @return La stratégie d'un sous-type du type Strategie
	 */
	private static Strategie initialiserStrategie(String str) {
		switch (str) {
		case "humain":
			return new StrategieHumain();
		case "naif":
			return new StrategieNaif();
		case "rapide":
			return new StrategieRapide();
		case "expert":
			return new StrategieExpert();
		default:
			return null;
		}
	}

	/**
	 * Vérifier le nombre d'aguments donné en ligne de
	 * commandes.
	 * @param args Les arguments de la ligne de commandes
	 */
	private static void verifierNombreArguments(String[] args) {
		final int nbJoueurs = 2;
		if (args.length < nbJoueurs) {
			throw new ConfigurationException("Trop peu d'arguments : "
					+ args.length);
		}
		if (args.length > nbJoueurs + 1) {
			throw new ConfigurationException("Trop d'arguments : "
					+ args.length);
		}
	}

	/** Afficher des indications sur la manière d'exécuter cette classe. */
	public static void afficherUsage() {
		System.out.println("\n" + "Usage :"
				+ "\n\t" + "java allumettes.Partie joueur1 joueur2"
				+ "\n\t\t" + "joueur est de la forme nom@stratégie"
				+ "\n\t\t" + "strategie = naif | rapide | expert | humain | tricheur"
				+ "\n"
				+ "\n\t" + "Exemple :"
				+ "\n\t" + "	java allumettes.Partie Xavier@humain "
					   + "Ordinateur@naif"
				+ "\n"
				);
	}

}
