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

public class ChatClient extends Thread implements ActionListener{
	
	private PrintWriter out = null;
	private BufferedReader in = null;
	private Socket client = null;
	private ServerSocket server = null;
	private int portNum = 8095;
	private Vector addresses = new Vector();
	private String address = null;
	
	private Vector vct = new Vector();
	private Vector vctUsr = new Vector();
	
	private InetAddress local;

	private String host = "";
	
	private StringBuffer str = new StringBuffer();
	private String mensagem = "";
	
	JFrame frMain;
	JPanel pnMain;
	JPanel pnMsgBt;
	JPanel pnMsgE;
	JPanel pnBt;
	JPanel pnMsgR;
	JPanel pnUsr;
	JSplitPane spMsgUsr;
	
	JLabel lbMsgR;
	JLabel lbMsgE;
	JLabel lbUsr;

	JTextArea txaMsgE;
	JTextArea txaMsgR;
	JScrollPane scpMsgE;
	JScrollPane scpMsgR;

	JList ltUsers;
	JScrollPane scpUsers;

	JButton btEnviar;
	JButton btLimpar;
	
	public ChatClient(){
		
		vctUsr.add("Administração");
		vctUsr.add("Develop/Raphael");
		vctUsr.add("Develop/Thiago");
		vctUsr.add("Develop/Wilder");
		vctUsr.add("Diretoria");
		vctUsr.add("Financeiro");
		vctUsr.add("Negócios");
		vctUsr.add("Treinamento/Adriana");
		vctUsr.add("Treinamento/Fátima");
		
		frMain = new JFrame("SicChat");
		frMain.setResizable(false);
		
		lbMsgR = new JLabel("Mensagens Recebidas");
		lbMsgR.setForeground(Color.blue);
		lbMsgE = new JLabel("Digite sua mensagem:");
		lbMsgE.setForeground(Color.blue);
		lbUsr = new JLabel("Usuários");
		lbUsr.setForeground(Color.blue);
		
		pnMain = new JPanel();
		pnMain.setLayout(new BorderLayout());
		pnMsgBt = new JPanel();
		pnMsgBt.setLayout(new FlowLayout(FlowLayout.LEFT));
		pnBt = new JPanel();
		pnBt.setLayout(new FlowLayout(FlowLayout.CENTER));
		pnMsgR = new JPanel();
		pnMsgR.setLayout(new BorderLayout());
		pnMsgE = new JPanel();
		pnMsgE.setLayout(new BorderLayout());
		pnUsr = new JPanel();
		pnUsr.setLayout(new BorderLayout());
		spMsgUsr = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
		spMsgUsr.setDividerLocation(165);
		
		txaMsgE = new JTextArea(3,15);
		txaMsgE.setLineWrap(true);
		txaMsgE.setToolTipText("Digite sua mensagem e clique no botão enviar. "+'\n'+"Certifique-se de ter selecionado um usuário.");
		scpMsgE = new JScrollPane(txaMsgE);
		txaMsgR = new JTextArea(3,15);
		txaMsgR.setLineWrap(true);
		txaMsgR.setEditable(false);
		txaMsgR.setToolTipText("Aqui você visualiza as mensagens que recebeu.");
		scpMsgR = new JScrollPane(txaMsgR);
		scpMsgR.getViewport().setAutoscrolls(true);
		
		ltUsers = new JList(vctUsr);
		ltUsers.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
		ltUsers.setToolTipText("Selecione o usuário que receberá sua mensagem.");
		scpUsers = new JScrollPane(ltUsers);
		
		btEnviar = new JButton("Enviar");
		btEnviar.setMnemonic('E');
		btEnviar.setToolTipText("Clique aqui para enviar sua mensagem.");
		btLimpar = new JButton("Limpar");
		btLimpar.setMnemonic('L');
		btLimpar.setToolTipText("Clique aqui para limpar a tela.");
		
		pnMsgR.add("North",lbMsgR);
		pnMsgR.add("Center",scpMsgR);
		pnMsgE.add("North",lbMsgE);
		pnMsgE.add("Center",scpMsgE);
		pnUsr.add("North",lbUsr);
		pnUsr.add("Center",scpUsers);
		
		pnBt.add(btEnviar);
		pnBt.add(btLimpar);
		pnMsgBt.add(pnMsgE);
		pnMsgBt.add(pnBt);
				
		spMsgUsr.setLeftComponent(pnMsgR);
		spMsgUsr.setRightComponent(pnUsr);
		
		pnMain.add("Center",spMsgUsr);
		pnMain.add("South",pnMsgBt);

		
		frMain.setContentPane(pnMain);
		frMain.pack();
		frMain.setVisible(true);
		
		btEnviar.setActionCommand("okay");
		btEnviar.addActionListener(this);
		btLimpar.setActionCommand("limpar");
		btLimpar.addActionListener(this);
		
		frMain.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent we){
				System.exit(0);
			}
		});
	}
	public void run(){
		try{
			server = new ServerSocket(portNum);
			System.out.println("Servidor em execução!");
		}catch(IOException e){
			System.out.println("Erro ao carregar o servidor!");
		}
		Socket client = null;
		while (true){
			if (server == null){
				return;
			}
			try{
				client = server.accept();
			}catch(IOException io){
				System.out.println("Não foi possível se conectar ao servidor");
			}
			try{
				out = new PrintWriter(new BufferedOutputStream(client.getOutputStream()),false);
				in = new BufferedReader(new InputStreamReader(client.getInputStream()));
				System.out.println("Conectado ao cliente!");
				
				StringBuffer str = new StringBuffer();
				String inLine = null;
				while ((inLine = in.readLine()) != null){
					str.append(inLine);
					break;
				}
				for (int i = 0; i <= str.length() - 1; i++){
					char ch = str.charAt(i);
					if (ch == '-'){
						str.setCharAt(i, '\n');
					}
				}
				inLine = in.readLine();
				String user = getUser(inLine);

				txaMsgR.append("["+user+"]: "+str.toString() + '\n');
				frMain.show();
				str.setLength(0);
				
				out.close();
				in.close();
				client.close();
			}catch(Exception e){
				System.out.println("Não foi possível se conectar ao cliente!");
			}
		}
	}
	public String getUser(String nome){
		while (true){
			if (nome.equals("admin01")){
				nome = "Administração";
				break;
			}
			if (nome.equals("sic-server")){
				nome = "Develop/Raphael";
				break;
			}
			if (nome.equals("teste01")){
				nome = "Develop/Tiago";
				break;
			}
			if (nome.equals("java")){
				nome = "Develop/Wilder";
				break;
			}
			if (nome.equals("diretor01")){
				nome = "Diretoria";
				break;
			}
			if (nome.equals("financeiro01")){
				nome = "Financeiro";
				break;
			}
			if (nome.equals("negocios01")){
				nome = "Negócios";
				break;
			}
			if (nome.equals("treinamento01")){
				nome = "Treinamento/Fátima";
				break;
			}
			if (nome.equals("treinamento02")){
				nome = "Treinamento/Adriana";
				break;
			}
		}
		return nome;
	}			
	public void getSocket(String msg){
		addresses.add(getAddress());
		for (int x = 0; x <= vct.size() - 1; x++){
			String endereco = (String)vct.get(x);
			try{
				client = new Socket(endereco,portNum);
				out = new PrintWriter(client.getOutputStream(),true);
				in = new BufferedReader(new InputStreamReader(client.getInputStream()));
				System.out.println("Conectado ao servidor!");
			}catch(IOException io){
				System.out.println("Erro durante a conexão ao servidor!");
				txaMsgR.append("["+endereco+"]: "+'\n'+"desconectado"+'\n');
			}
			try{
				try{
					local = InetAddress.getLocalHost();
				}catch(UnknownHostException uhe){
					System.out.println("Host inválido!");
				}
				host = local.getHostName();			
				String inStr;
				str.append(msg);
				for (int i = 0; i <= str.length() - 1; i++){
					char ch = str.charAt(i);
					if (ch == '\n'){
						str.setCharAt(i, '-');
					}
				}
				System.out.println("Cliente: " + str.toString());
				out.println(str.toString());
				out.flush();
				out.println(host);
				out.flush();
				str.setLength(0);
				out.close();
				in.close();
				client.close();
			}catch(IOException io){
				System.out.println("Desconectado do servidor!");
			}
		}
		vct.clear();
	}
	public Vector getAddress(){
		int [] numUsr = ltUsers.getSelectedIndices();
		for (int i = 0; i <= numUsr.length - 1; i++){
			try{
				local = InetAddress.getLocalHost();
			}catch(UnknownHostException uhe){
				System.out.println("Host inválido!");
			}
			String destino = local.getHostName();
			switch (numUsr[i]){
				case 0: vct.add("Admin01"); break;
				case 1: vct.add("Sic-Server"); break;
				case 2: vct.add("Teste01"); break;
				case 3: vct.add("JAVA"); break;
				case 4: vct.add("Diretor01"); break;
				case 5: vct.add("Financeiro01"); break;
				case 6: vct.add("Negocios01"); break;
				case 7: vct.add("Treinamento02"); break;
				case 8: vct.add("Treinamento01"); break;
				default: vct.add(destino); break;
			}
		}
		return vct;
	}
	public void actionPerformed(ActionEvent ae){
		if (ae.getActionCommand().equals("okay")){
			mensagem = txaMsgE.getText();
			getSocket(mensagem);
			try{
				local = InetAddress.getLocalHost();
			}catch(UnknownHostException uhe){
				System.out.println("Host inválido!");
			}
			String userLocal = getUser(local.getHostName());
			txaMsgR.append("["+userLocal+"]: "+mensagem+'\n');
			txaMsgE.setText("");
		}
		if (ae.getActionCommand().equals("limpar")){
			txaMsgR.setText("");
		}
	}
	public static void main(String[]args){
	ChatClient chat = new ChatClient();
//	new Thread(chat).start();
	chat.start();
//	chat.getCheck();
	}
}
