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

public class Cliente extends JFrame implements Runnable,ActionListener
{
	PrintWriter out;
	Socket socket;
	String IPNUM;
	private static final int PORTNUM = 1234;
	Thread runner;
	
	//0 = Cliente desconectado
	//1 = Cliente conectado
	int status = 0;
	String convnet = "";
	String conv = "";
	
	JLabel lbl2 = new JLabel("Digite nome do Host ou IP do servidor");
	JButton btConectar = new JButton("Conectar");
	JTextField txtIP = new JTextField(15);
	TextArea txtChat = new TextArea(15,33);
	JTextField txtMsg = new JTextField(15);
	JButton btEnvia = new JButton("Enviar");
	JLabel lbl1 = new JLabel("Digite o Texto");
	
	public void run()
	{
		Thread thisThread = Thread.currentThread();
		while (runner == thisThread)
		{
			try
			{
				Thread.sleep(1000);
				if (status == 1)
				{
					InputStreamReader isr = new InputStreamReader(socket.getInputStream());
					BufferedReader in = new BufferedReader(isr);
					convnet = "" + in.readLine();
					conv = conv + "SERVIDOR: " + convnet + "\n";
					txtChat.setText(conv);
				}
			}
			catch (Exception e){}
		}
	}
	
	public Cliente()
	{	
		super("Cliente");
		GeraLayout();
	}		

	public static void main(String args[])
	{
		JFrame frame = new Cliente();
		frame.pack();
		frame.setVisible(true);
	}
	
	private void GeraLayout()
	{
		GridBagLayout gridbag = new GridBagLayout();
		GridBagConstraints constraints = new GridBagConstraints();
		Grade constroiGrade = new Grade();

		JPanel pane = new JPanel();
		pane.setLayout(gridbag);

		constroiGrade.Controi(constraints,0,0,1,1,100,1,GridBagConstraints.BOTH,GridBagConstraints.WEST);
		gridbag.setConstraints(lbl2,constraints);
		pane.add(lbl2);

		constroiGrade.Controi(constraints,0,1,2,1,99,1,GridBagConstraints.HORIZONTAL,GridBagConstraints.WEST);
		gridbag.setConstraints(txtIP,constraints);
		pane.add(txtIP);

		constroiGrade.Controi(constraints,2,1,1,1,1,1,GridBagConstraints.HORIZONTAL,GridBagConstraints.WEST);
		gridbag.setConstraints(btConectar,constraints);
		btConectar.addActionListener(this);
		pane.add(btConectar);

		constroiGrade.Controi(constraints,0,2,3,1,100,99,GridBagConstraints.BOTH,GridBagConstraints.WEST);
		gridbag.setConstraints(txtChat,constraints);
		pane.add(txtChat);

		constroiGrade.Controi(constraints,0,3,3,1,100,1,GridBagConstraints.BOTH,GridBagConstraints.WEST);
		gridbag.setConstraints(lbl1,constraints);
		pane.add(lbl1);

		constroiGrade.Controi(constraints,0,4,3,1,100,1,GridBagConstraints.BOTH,GridBagConstraints.WEST);
		gridbag.setConstraints(txtMsg,constraints);
		pane.add(txtMsg);

		constroiGrade.Controi(constraints,0,5,3,1,100,1,GridBagConstraints.NONE,GridBagConstraints.CENTER);
		gridbag.setConstraints(btEnvia,constraints);
		btEnvia.addActionListener(this);
		pane.add(btEnvia);

		setContentPane(pane);
	}

	public Insets getInsets()
	{
		return new Insets(30,10,10,10);
	}
	
	public void actionPerformed(ActionEvent evt)
	{
		Object source = evt.getSource();
		if (source == btConectar)
		{
			try
			{
				if (status == 0)
				{
					IPNUM = txtIP.getText();
					socket = new Socket(IPNUM,PORTNUM);
					status = 1;
					runner = new Thread(this);
					runner.start();
					
					//--> ENVIA AUTOMENSAGEM PARA O SERVIDOR, PARA AVISAR QUE UM CLIENTE CONECTOU 					
					out = new PrintWriter(socket.getOutputStream(),true);
					out.println("### O CLIENTE ESTÁ CONECTADO ###");
					out.flush();
				}
			}
			catch (Exception e) {}
		}
		else if (source == btEnvia)
		{
			try
			{
				if (status == 1)
				{

					out = new PrintWriter(socket.getOutputStream(),true);
					out.println(txtMsg.getText());
					out.flush();
					
					conv = conv + "CLIENTE: " + txtMsg.getText() + "\n";
					txtChat.setText(conv);
					txtMsg.setText("");
				}
				else if (status == 0)
				{
					JOptionPane.showMessageDialog(null,"O sistema não pode enviar a mensagem."	+ "\n" + "O Cliente não está conectado ao um servidor","Aviso do Sistema",JOptionPane.INFORMATION_MESSAGE);
				}
			}
			catch (Exception e){}
		}
	}
}
