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

public class Servidor extends JFrame implements Runnable,ActionListener
{
	Thread runner;
	
	private static final int PORTNUM = 1234;
	private ServerSocket serverSocket;
	private Socket clientSocket;
	
	//0 = Servidor desconectado, Cliente desconectado
	//1 = Servidor conectado, Cliente desconectado
	//2 = Servidor conectado, Cliente conectado
	int status = 0;
	PrintWriter os;
	String conv = "";
	String convnet = "";

	JButton btConectar = new JButton("Conectar");
	JTextField txtStatus = new JTextField(15);
	JTextArea txtChat = new JTextArea(15,33);
	JTextField txtMsg = new JTextField(15);
	JButton btEnvia = new JButton("Enviar");
	JLabel lbl1 = new JLabel("Digite o Texto");
	


	
	
	
	public static void main(String args[])
	{				
		JFrame frame = new Servidor();
		frame.pack();
		frame.setVisible(true);
	}
	
	public Servidor()
	{
		super("Servidor");
		GeraLayout();
		txtStatus.setText("Desconectado");
	}
	
	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,1,1,GridBagConstraints.HORIZONTAL,GridBagConstraints.WEST);
		gridbag.setConstraints(btConectar,constraints);
		btConectar.addActionListener(this);
		pane.add(btConectar);

		constroiGrade.Controi(constraints,1,0,2,1,99,1,GridBagConstraints.HORIZONTAL,GridBagConstraints.WEST);
		txtStatus.setHorizontalAlignment(SwingConstants.CENTER);
		gridbag.setConstraints(txtStatus,constraints);
		pane.add(txtStatus);

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

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

		constroiGrade.Controi(constraints,0,4,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 run()
	{
		Thread thisThread = Thread.currentThread();
		while (thisThread == runner)
		{
			try
			{
				Thread.sleep(1000);
				if (status == 1) //Conecta o Cliente
				{
					clientSocket = serverSocket.accept(); //Aceita a conexao do Cliente
					
					//Depois de aceitar o cliente envia mensagem de boas vindas
					os = new PrintWriter(clientSocket.getOutputStream(),false);
					os.println("--->> Bem Vindo Servidor, você está conectado <<---");
					os.flush();
					
					status = 2;
				}
				else if (status == 2) //Verifica se o cliente enviou mensagem
				{
					InputStreamReader isr = new InputStreamReader(clientSocket.getInputStream());
					BufferedReader is = new BufferedReader(isr);
					convnet = "" + is.readLine();
					conv = conv + "CLIENTE: " + convnet + "\n";
					txtChat.setText(conv);
				}
			}
			catch (Exception e){}
		}
	}
	
	public void actionPerformed(ActionEvent evt)
	{
		Object source = evt.getSource();
		if (source == btConectar)
		{
			if (btConectar.getLabel() == "Conectar")
			{
				try
				{
					txtStatus.setText("Conectando o servidor, aguarde...");
					serverSocket = new ServerSocket(PORTNUM);
					status = 1;
					txtStatus.setText("Conectado");
					runner = new Thread(this);
					runner.start();
					btConectar.setLabel("Desconectar");
					repaint();
				}
				catch (Exception e) {}
			}
			else if(btConectar.getLabel() == "Desconectar")
			{
				try
				{
					txtStatus.setText("Desconectando o servidor, aguarde...");
					runner = null;
					serverSocket = null;
					txtStatus.setText("Desconectado");
					btConectar.setLabel("Conectar");
					repaint();
				}
				catch (Exception e) {}
			}
		}
		else if (source == btEnvia)
		{
			try
			{
				if (status == 2) //Se houver cliente conectado então envia mensagem
				{
					os = new PrintWriter(clientSocket.getOutputStream(),false);
					os.println(txtMsg.getText());
					os.flush();

					conv = conv + "SERVIDOR: " + txtMsg.getText() + "\n";
					txtChat.setText(conv);
					txtMsg.setText("");
				}
				else if (status == 1)
				{
					JOptionPane.showMessageDialog(null,"O sistema não pode enviar a mensagem." + "\n" + "Nenhum cliente está conectado no momento.","Alerta do Sistema",JOptionPane.INFORMATION_MESSAGE);
				}
				else if (status == 0)
				{
					JOptionPane.showMessageDialog(null,"O servidor não foi conectado.","Alerta do Sistema",JOptionPane.INFORMATION_MESSAGE);
				}
			}
			catch (Exception e){}
		}
	}
}