import java.io.*;
import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


public class Client extends JFrame {

  JTextField entry = new JTextField(30);
  JTextArea result = new JTextArea(10, 30);
  String host;
  int port;

  public static void main(String argv[]) {
    if (argv.length != 2) {
      System.out.println("usage: command host port");
      System.exit(1);
    }
    new Client(argv[0], argv[1]);
  }


  public Client(String host, String port) {
    this.host = host;
    this.port = Integer.parseInt(port);

    Container contentPane = getContentPane();
    // BorderLayout = disposition de type "points cardinaux"
    contentPane.setLayout(new BorderLayout());

    // --- ActionListener -------------

    ActionListener al = new ActionListener() {
      public void actionPerformed(ActionEvent e) {
	System.out.println(">Entry:" + entry.getText());
	
	String retour = Discute(entry.getText());
	System.out.println(">Result: " + retour);

	entry.setText("");
	//result.setText(retour);
	result.append(retour + "\n");
      }
    };

    // --- Ligne1 ---------------------

    JPanel ligne1 = new JPanel();
    contentPane.add(BorderLayout.NORTH, ligne1);

    ligne1.setLayout(new BorderLayout());
    ligne1.add(BorderLayout.WEST, new JLabel("Result:"));

    JButton quit = new JButton("Exit");
    ligne1.add(BorderLayout.EAST, quit);

    quit.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
	System.exit(0);
      }
    });


    // --- Ligne2 ---------------------

    JScrollPane ligne2 = new JScrollPane(result);
    contentPane.add(BorderLayout.CENTER, ligne2);

    // --- Ligne3 ---------------------

    JPanel ligne3 = new JPanel();
    contentPane.add(BorderLayout.SOUTH, ligne3);

    ligne3.add(new JLabel("Enter: "));
 
    ligne3.add(entry);
    entry.addActionListener(al);

    JButton send = new JButton("Send");
    ligne3.add(send);
    send.addActionListener(al);

    // --- Ouvrir le Frame ------------

    setTitle("Client");
    pack();
    show();
  }


  String Discute(String mess) {
    String p = host + ":" + port;
    Socket server;

    try {
      server = new java.net.Socket(host, port);
    }
    catch (java.net.UnknownHostException e) {
      System.out.println("!couldn't find host: " + p + " : " + e);
      return null;
    }
    catch (java.io.IOException e) {
      System.out.println("!couldn't contact host: " + p + " : " + e);
      return null;
    }

    InputStream in;
    OutputStream out;

    try {
      in = server.getInputStream();
      out = server.getOutputStream();
    }
    catch (java.io.IOException e) {
      System.out.println("!couldn't create input and output streams: " + e);
      return null;
    }

    DataOutputStream to_server = new DataOutputStream(out);
    BufferedReader from_server = new BufferedReader(new InputStreamReader(in));

    String retour;

    // recuperer message de debut de comm du serveur
    try {
      retour = from_server.readLine();
      System.out.println("retour1: " + retour);
    }
    catch (java.io.IOException e) {
      System.out.println("couldn't read: " + e);
      return null;
    }

    // envoyer requete au serveur
    try {
      to_server.writeBytes(mess+".\n");
    }
    catch (java.io.IOException e) {
      System.out.println("couldn't write: " + e);
      return null;
    }

    // recuperer le resultat envoye par serveur en retour
    try {
      retour = from_server.readLine();
      System.out.println("retour2: " + retour);
    }
    catch (java.io.IOException e) {
      System.out.println("couldn't read: " + e);
      return null;
    }

    // si tout s'est bien passe: retourne le resultat
    return retour;
  }
}



