/**
   SummaryDescription.
   
   /home1/ugrads/t172q/CS2013/BGServer/BGServer.java
   
   Created: Wed May 19 14:20:41 2004
   
   @author Stuart MacGillivray #3148021 (email: <t172q@unb.ca>)
   
*/

import java.io.*;
import java.net.*;

public class BGServer {

  public static final int DEFAULTPORT = 8756;
  
  public static void main(String[] args) 
  {
    int port;
    if (args.length < 1)
      port = DEFAULTPORT;
    else
      port = Integer.parseInt(args[0]);
    ServerSocket s = null;
    try
      {
	s = new ServerSocket(port, 2);
	System.out.println("Now listening on port " + port + ".");
      }
    catch (IOException e)
      {
	System.err.println("Could not listen on port: " + port + ". " + e.getMessage());
	System.exit(-1);
      }

    while (port > 0)
      {

	Socket[] player = new Socket[2];
	try
	  {
	    player[0] = s.accept();
	    player[1] = s.accept();
	  }
	catch (IOException e) 
	  {
	    System.err.println("Accept failed: " + e.getMessage());
	    System.exit(-1);
	  }
	
	BufferedReader[] playerInput = new BufferedReader[2];
	PrintWriter[] playerOutput = new PrintWriter[2];
	
	try 
	  {
	    for (int i = 0; i < player.length; i++)
	      {
		playerInput[i] = new BufferedReader 
		  (new InputStreamReader(player[i].getInputStream()));
		playerOutput[i] = new PrintWriter(player[i].getOutputStream(), true);
	      }
	    
	    BGGame game = new BGGame();

	    boolean[] playerReady = new boolean[]{false, false};

	    while (!game.gameOn())
	      {
		for (int i = 0; i < player.length; i++)
		  if (!playerReady[i])
		    {
		      String output = game.createPlayer(playerInput[i].readLine(), i);
		      if (!output.equals("err"))
			playerReady[i] = true;
		      playerOutput[i].println(output);
		    } 
	      }

	    while (game.gameOn())
	      {
		String[] cache = game.fireAt(playerInput[game.getCurrent()].readLine());
		for (int i = 0; i < player.length; i++)
		  playerOutput[i].write(cache[i]);
	      }
	  }
	catch (IOException e) {
	  System.err.println("Unable to read from or write to the client: "
			     + e.getMessage());
	}
	
	try
	  {
	    for (int i = 0; i < player.length; i++)
	      {
		playerOutput[i].close();
		playerInput[i].close();
		player[i].close();
	      }
	  }
	catch (IOException e) 
	  {
	    System.err.println(e.getMessage());
	  }
      }
    try
      {
	s.close();
      }
    catch (IOException e)
      {
	System.err.println(e.getMessage());
      }
  }
} // BGServer
