// Written by Dr. Deborah Hwang for CS 350
// Pizza server application to accept file write requests from
// Pizza Order Form application

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

class PizzaServer 
{
   final boolean DEBUG = true;

   public static void main(String[] args) 
   {
      PizzaServer ps = new PizzaServer();
      ps.start();
   }  // end main

   public void start() 
   {
      PizzaServerThread pst;
      ServerSocket serverRecSocket = null;
      PrintWriter fileout;

      if (DEBUG)
	 System.err.println("PizzaServer: establish socket");
      try 
      {
         // Establish server side socket, use any free port
         serverRecSocket = new ServerSocket(0);
      }  // end try
      catch (IOException e) 
      {
         System.err.println(
            "PizzaServer: could not create server socket for rendezvous");
         return;
      }  // end catch

      if (DEBUG)
	 System.err.println("PizzaServer: write port file");
      try
      {
         // Write a file with the assigned port number into webspace
         fileout = new PrintWriter(
	           new FileWriter (
		      "/home/hwang/www_home/f06-courses/cs350/PizzaPort.txt"));
	 fileout.println ("PizzaServer listening on rendezvous port: "
		   + serverRecSocket.getLocalPort());
         fileout.flush();
         fileout.close();
      }  // end try
      catch (IOException e) 
      {
         System.err.println("PizzaServer: problems with port file");
         return;
      }  // end catch

      while (true)
      {
         pst = connectToClient(serverRecSocket);
      } //end while (true) loop
   }  // end start

   protected PizzaServerThread connectToClient(ServerSocket serverRecSocket) 
   {
      Socket rendezvousSocket = null;
      PizzaServerThread pst = null;

      if (DEBUG)
	 System.err.println("PizzaServer: wait to connect to client");

      //Listen for client connection on the rendezvous socket.
      try 
      {
         rendezvousSocket = serverRecSocket.accept();
	 if (DEBUG)
	    System.err.println ("PizzaServer: connection accepted\n");
      }  // end try
      catch (IOException e) 
      {
          System.err.println("PizzaServer: accept failed.");
          e.printStackTrace();
          return null;
      }  // end catch

      //Create a thread to handle this connection.
      try 
      {
	 if (DEBUG)
	    System.err.println("PizzaServer: creating thread for connection\n");
         pst = new PizzaServerThread(rendezvousSocket);
         pst.start();
      }  // end try
      catch (Exception e) 
      {
         System.err.println("Couldn't create PizzaServerThread:");
         e.printStackTrace();
         return null;
      }  // end catch

      return pst;
   }  // end connectToClient

}  // end PizzaServerClass
