//
// Les milles et une bornes
//
//  traitement des requetes
//

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


public class client {
    String pseudo[]=new String[4]; // les joueurs
    int inPlay=0;
    static final int NEW_GAME=1, PIOCHE=2, JOUE=3, PATIENTE=4;
    Socket s = null;
    DataInputStream sin ;
    PrintStream sout;
    DataInputStream in;
    String joueur="";
  
    public static void main(String[] args) {
      int DEFAULT_PORT = 6789;
      int port = DEFAULT_PORT;
      String host="127.0.0.1";
      if (args.length >= 1) {
	host = args[0];  
      }
      new client(host, port);
      // Tell the user that we've connected
      System.out.println("Connected to " + s.getInetAddress().getHostName() + ":"+ s.getPort());
      System.out.println("\nEOF (CTRL+D) to end.\n");

      // Create a stream for reading lines of text from the console
      in = new DataInputStream(System.in);

      inPlay=NEW_GAME;
      while(inplay>0)
	playGame();

      System.out.println("bye bye.");

    }

    public client(String host, int port){

      try {
	// Create a socket to communicate to the specified host and port
	s = new Socket(host, port);
	// Create streams for reading and writing lines of text
	// from and to this socket.
	sin = new DataInputStream(s.getInputStream());
	sout = new PrintStream(s.getOutputStream());
	
      }
      catch (Exception e) { e.printStackTrace(); }
      // Always be sure to close the socket
      finally {
	try { if (s != null) s.close(); } catch (IOException e2) { ; }
      }
    }

  public void parseMessage(String msg){
   int len;
   int ind;
   
   String cmd=""; // la commande
   String arg=""; // les arguments

    ind=msg.indexOf(' ');
    cmd=(ind==-1?msg:msg.substring(0, ind)); // la commande
    arg=(ind==-1?"":msg.substring(ind+1)); // les arguments

    if(cmd.equalsIgnoreCase("Joueurs")){
      System.out.println("::"+msg);

    }if(cmd.equalsIgnoreCase("Distribcartes")){
      System.out.println("::"+msg);
      inPlay=PATIENTE; // Next step

    }if(cmd.equalsIgnoreCase("Piocheur")){
       if(arg.equalsIgnoreCase(joueur)){
	 System.out.println("C'est a moi de jouer !!!!");
	 inPlay=PIOCHE; // Next step
       }else
	 System.out.println("Patiente: "+msg);

    }if(cmd.equalsIgnoreCase("Carte")){
     System.out.println("::"+msg);
     inPlay=JOUE; // Next step

    }if(cmd.equalsIgnoreCase("CarteRefusee")){
      System.out.println("::"+msg);
      inPlay=JOUE; // same step

    }if(cmd.equalsIgnoreCase("CarteJetee")){
      System.out.println("::"+msg);
      inPlay=PATIENTE; // Next step

    }if(cmd.equalsIgnoreCase("CarteJouee")){
      System.out.println("::"+msg);
      inPlay=PATIENTE; // Next step

    }
  }

  public void playGame(){
   int len;
   int ind;
   String req=""; // requete
   String cmd=""; // la commande
   String rep=""; // pour la reponse
   int j=0;

   //while(inPlay>0){ 

   switch(inPlay){
   case NEW_GAME:
     System.out.print("your name> "); 
     System.out.flush();
     rep = readLine();
     joueur=rep;
     sout.println("NewGame "+joueur);
     // attente du message "Joueurs J1 j2 ..."
     parseMessage(waitAndGetMessage()); 
     // attente du message "DistribCartes ..."
     parseMessage(waitAndGetMessage()); 
     
     break;
   case PATIENTE:
     // attente du message "Piocheur j#"
     parseMessage(waitAndGetMessage()); 
     break;
   case PIOCHE:
     // print a prompt
     System.out.print("Pioche Nouvelle ou Derniere ?> "); 
     System.out.flush();
     rep = readLine();
     sout.println("Pioche "+rep);
     // recoit la carte
     parseMessage(waitAndGetMessage()); 
     break;
   case JOUE:
     // print a prompt
     System.out.print("Joue C? J?/Jette C?> "); 
     System.out.flush();
     rep = readLine();
     sout.println(rep);
     // recoit la reponse
     parseMessage(waitAndGetMessage());
     break;
   default:
     System.out.println("Joueur:"+j+", etat:"+inPlay+", requete:"+req);
     inPlay=0;
   }
   
   
  }
  
   String waitAndGetMessage(){
    String line =null;

    try {
      while(sin.available()<0); // attente

      line = sin.readLine();
      if (line == null) System.out.println("bye bye ");
      

    }catch (IOException e) { try{s.close();}catch(Exception e2){;} }
    //finally { ; }
    return line;
  }  
  
  String readLine(){
    String line =null;
    try {
      line= in.readLine();
    }catch (IOException e) { ; }
    return line;
  }
  

}
