package apps.utilities;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import server.GameServer;
import util.game.Game;
import util.game.GameRepository;
import util.gdl.factory.exceptions.GdlFormatException;
import util.match.Match;
import util.statemachine.exceptions.GoalDefinitionException;
import util.symbol.factory.exceptions.SymbolFormatException;

/**
 * GameServerRunner is a utility program that lets you start up a match
 * directly from the command line.
 * 
 * @author Evan Cox
 */
public final class GameServerRunner
{
	public static void runMatch(Match match, List<String> hostnames, List<Integer> portNumbers, List<String> playerNames)
	{
		GameServer server = new GameServer(match, hostnames, portNumbers, playerNames);
		server.run();
		try {
			server.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	/**
	 * TODO: Evan, is this comment still accurate? -Sam
	 * 
	 * Main method for running 
	 * args[0] = name of the game (e.g. tic tac toe)
	 * args[1] = startclock
	 * args[2] = playclock
	 * args[3] = the number of players for the given game
	 * args[4] = file generated by play script
	 * @param args
	 * @throws GdlFormatException 
	 * @throws SymbolFormatException 
	 * @throws IOException 
	 * @throws InterruptedException 
	 * @throws GoalDefinitionException 
	 */
	public static void main(String[] args) throws IOException, SymbolFormatException, GdlFormatException, InterruptedException, GoalDefinitionException
	{
		String tourneyName = args[0];
		String gamename = args[1];
		Game game = GameRepository.getDefaultRepository().getGame(gamename);
		int startClock = Integer.valueOf(args[2]); 
		int playClock = Integer.valueOf(args[3]);
		if ((args.length - 4) % 3 != 0)
		{
			System.err.println("Incorrect player/port/host config");
			System.exit(1);
		}
		List<String> hostNames = new ArrayList<String>();
		List<String> playerNames = new ArrayList<String>();
		List<Integer> portNumbers = new ArrayList<Integer>();
		String matchname = tourneyName + gamename;
		for (int i = 4; i < args.length; i+= 3)
		{
			String hostname = args[i];
			Integer portnumber = Integer.valueOf(args[i + 1]);
			String playerName = args[i + 2];
			hostNames.add(hostname);
			portNumbers.add(portnumber);
			playerNames.add(playerName);
			matchname += playerName;
		}
		Match match = new Match(matchname, startClock, playClock, game);
		GameServer server = new GameServer(match, hostNames, portNumbers, playerNames);
		server.run();
		server.join();
		File f = new File(tourneyName);
		if (!f.exists())
		{
			f.mkdir();
			f = new File(tourneyName + "/scores");
			f.createNewFile();
		}
		f = new File(tourneyName + "/" + matchname);
		if (f.exists()) f.delete();
		BufferedWriter bw = new BufferedWriter(new FileWriter(f));
		bw.write(server.getGameXML());
		bw.flush();
		bw.close();
		bw = new BufferedWriter(new FileWriter(tourneyName + "/scores"));
		List<Integer> goals = server.getGoals();
		String goalstr = "";
		String playerstr = "";
		for (int i = 0; i < goals.size(); i++)
		{
			Integer goal = server.getGoals().get(i);
			goalstr += Integer.toString(goal);
			playerstr += playerNames.get(i);
			if (i != goals.size() - 1)
			{
				playerstr += ",";
				goalstr += ",";
			}
		}
		bw.write(playerstr + "=" + goalstr);
		bw.flush();
		bw.close();
	}
}
@@ -3004,16 +3004,22 @@
 /scores%22
+, true
 ));%0A%09%09Li

Append to the scores file rather than overwriting it.