package klient;

import javax.swing.*;

import java.awt.*;
import java.awt.event.*;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.*;
import java.util.*;

/**
 * @author w21826 Piotr Lezon 8MKDR-TI-SZL
 *
 */

public class Klient extends JFrame implements ActionListener, Runnable
{
	static String serwer="localhost";
	static int port=4444;
	static String nick="Domyslny";
	DataOutputStream dataoutputstream;
	DataInputStream datainputstream;
	String dane;
	Socket socket;
	ServerSocket ssocket;
	Thread thread;
	StringTokenizer Tokenizer;
	int uzytkownikow;
	JPanel topPanel;
	JTable table;
	JScrollPane scrollPane;
	String nazwa[]={"Wiadomosc"};
	ArrayList wiadomosci;
	JTextField input;
	JButton send;
	JLabel main,main1,main2,main3,main4,main5,main6;
	
	
	Klient()
	{
		JMenuBar mb = new JMenuBar();
		JMenu jmPlik = new JMenu("Plik");
		mb.add(jmPlik);
		JMenuItem jmiOpPo = new JMenuItem("Opcje polaczenia");
		jmPlik.add(jmiOpPo);
		jmiOpPo.addActionListener(this);
		jmPlik.add(new JSeparator());
		JMenuItem jmiConn = new JMenuItem("Polacz");
		jmPlik.add(jmiConn);
		jmiConn.addActionListener(this);
		JMenuItem jmiDisc = new JMenuItem("Rozlacz");
		jmPlik.add(jmiDisc);
		jmiDisc.addActionListener(this);
		jmPlik.add(new JSeparator());
		JMenuItem jmiZaBC = new JMenuItem("About");
		jmPlik.add(jmiZaBC);
		jmiZaBC.addActionListener(this);
		setJMenuBar(mb);
		
		this.setTitle("Prosty chat");
		this.setLayout(null);
		
		main=new JLabel("Main chat\nKliknij Plik>Ustawienia polaczenia aby ustawic adres serwera, swoj nick oraz port\nKliknij Plik>Polacz aby polaczyc sie z domyslnymi ustawieniami");
		main.setSize(600,100);
		main.setLocation(0,0);
		this.add(main);
		input=new JTextField();
		input.setSize(600,50);
		input.setLocation(0,500);
		this.add(input);
		send=new JButton("Wyslij");
		send.setSize(200,50);
		send.setLocation(600,500);
		this.add(send);
		send.addActionListener(this);

		
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setSize(800,600);
		this.setVisible( true );
	}
	
	public void actionPerformed(ActionEvent e) 
	{
		String komenda=e.getActionCommand();
		if(komenda == "Opcje polaczenia") 
		{
			new Opcje();

		}
		if(komenda == "Polacz")
		{
			ConnectToServer();
		}
		if(komenda == "Rozlacz")
		{
			DisconnectFromServer();
		}
		if(komenda == "About") 
		{
			JOptionPane.showMessageDialog(this,"Prosty komunikator sieciowy\nCreated by Piotr Leżoń\nw21826","About",JOptionPane.YES_OPTION);
		}
		if(komenda == "Wyslij")
		{
			if(socket != null)
			{
				SendMessageToServer("MESS " + nick + ":" + input.getText());
				input.setText("");
				input.repaint();
			}
			else 
			{
				JOptionPane.showMessageDialog(this,"Nie jestes podlaczony do serwera!","About",JOptionPane.YES_OPTION);
			}
		}
	}
	
	
	private void SendMessageToServer(String Message)
	{
		try 
		{
			dataoutputstream.writeBytes(Message+"\r\n");	
		}
		catch(IOException e) 
		{ 
			e.printStackTrace();
		}			
	}
	
	private void ConnectToServer()
	{				
		try 
		{
			socket = new Socket(serwer,port);					
			dataoutputstream = new DataOutputStream(socket.getOutputStream());
			SendMessageToServer("HELO "+nick);			
			datainputstream  = new DataInputStream(socket.getInputStream());
			thread = new Thread(this);
			thread.start();			
			main.setText("Polaczono z serwerem");
			main.repaint();
			System.out.println("KLient:Polaczono z serwerem " + serwer + "na porcie " + port);
		}
		catch(IOException e) 
		{ 
			JOptionPane.showMessageDialog(this, "Klient:Nie mozna polaczyc sie z serwerem!", "Blad!", JOptionPane.ERROR_MESSAGE);
		}			
	}
	
	private void DisconnectFromServer()
	{		
		if(socket != null)
		{
		try 
		{					
			dataoutputstream = new DataOutputStream(socket.getOutputStream());
			SendMessageToServer("QUIT "+nick);	
			System.out.println("Klient:Zakonczono polaczenie");
			socket.close();
			socket=null;
		}
		catch(IOException e) 
		{ 
			JOptionPane.showMessageDialog(this, "Klient:Nie mozna zamknac polaczenia! Moze juz zamkniete?", "Blad!", JOptionPane.ERROR_MESSAGE);
		}	
		}
		else
		{
			JOptionPane.showMessageDialog(this,"Nie jestes podlaczony do serwera!","About",JOptionPane.YES_OPTION);
		}
	}
	
	public void run()
	{
		while(thread != null)
		{
			try 
			{
				dane = datainputstream.readLine();									

				if (dane.startsWith("EXIS"))
				{						
					wiadomosci.add(nick + " juz jest w uzyciu! Zmien nicka!");
					main.setText("Nick jest juz w uzyciu!");
					main.repaint();
				}					 

				if (dane.startsWith("REMO"))
				{						
					main.setText(main.getText() + "\nUzytkownik " + dane.substring(5) + "wylogowal sie");
					main.repaint();
				}

				if( dane.startsWith("MESS"))
				{		
					main.setText(main.getText() + "\n" + dane.substring(5,dane.indexOf(":")) + " " + dane.substring(dane.indexOf(":")));	
					main.repaint();
				}



			}
			catch(Exception e) 
			{ 
				//e.printStackTrace();
			}
		}
		
	}
	
	public static void main(String[] args) 
	{
		new Klient();

	}

}
