/* 
 *  Kolage
 */

package easycomm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;

public class Client {

    final static String UPDATE_CLIENTS_KW = "UPDATE CLIENTS";
    final static String NAME_KW = "NAME";
    final static String UPDATE_MSG_KW = "UPDATE MESSAGES";
    final static String CLIENTS_KW = "CLIENTS";
    final static String MSG_KW = "MESSAGES";
    final static String ACCEPTED_KW = "OK";
    final static String REJECTED_KW = "ERROR";
    final static String END_KW = "END;";
    final static String ALLUSERS_KW = "CONNECTED USERS;";
    final static String ALLMSG_KW = "ALL MESSAGES;";

    static PrintStream out;

    static String name = "";

    static void sendMessage(String str) {
        out.println(str);
    }

    public static void main(String[] args) throws UnknownHostException,
                IOException, InterruptedException {

        InetAddress ipAdr = null; int port = -1;

        if(args.length == 3) {
            if(args[0].equals("-n")) {
                name = args[1];
            } else {
                System.out.println("Chybne zadane parametry.");
                System.exit(1);
            }
            
            String[] input = args[2].split(":", 2);

            if(input.length == 2) {
                ipAdr = InetAddress.getByName(input[0]);
                try {
                    port = Integer.parseInt(input[1]);
                }
                catch (NumberFormatException e) {
                    System.out.println("Chybne zadane parametry." + e.getMessage());
                    System.exit(1);
                }
            } else {
                System.out.println("Chybne zadane parametry.");
                System.exit(1);
            }

        } else {
            System.out.println("Chybne zadane parametry.");
            System.exit(1);
        }

        /*
        name = "kolage";
        ipAdr = InetAddress.getByName(null);
        port = 10000;
         * 
         */

        System.out.println("Zkousim se pripojit na server ...");

        Socket sock = null;

        try {
            sock = new Socket(ipAdr, port);
        }
        catch (SocketException e) {
            System.out.println(e.getMessage());
        }
        BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
        out = new PrintStream(sock.getOutputStream());

        out.println(NAME_KW + " " + name);

        String str = null;
        String output = "";

        str = in.readLine();

        if(str.startsWith(REJECTED_KW)) {
            System.out.println("Pripojeni zamitnuto - uzivatel s timto jmenem je jiz na serveru.");
            System.exit(1);
        }

        if(str == null || !str.startsWith(ACCEPTED_KW)) {
            System.out.println("Chyba pri autentizaci jmena...");
            System.exit(1);
        }
        
        ClientGUI cg = new ClientGUI();

        System.out.println("Pripojeno !");
        ClientGUI.labelChange("Connected to " + sock.getInetAddress() + ":" + sock.getPort() + " as " + name);

        while(true) {
            str = in.readLine();

            if(str == null)
                break;

            if(str.equals(UPDATE_CLIENTS_KW)) {
                out.println(CLIENTS_KW);
            }

            if(str.equals(UPDATE_MSG_KW)) {
                out.println(MSG_KW);
            }

            if(str.equals(ALLUSERS_KW)) {
                str = in.readLine();
                while(!str.equals(END_KW)) {
                    output += str + "\n";
                    str = in.readLine();
                }
                ClientGUI.clientMemoChange(output);
                output = "";
            }

            if(str.equals(ALLMSG_KW)) {
                str = in.readLine();
                while(!str.equals(END_KW)) {
                    output += str + "\n";
                    str = in.readLine();
                }
                ClientGUI.messageMemoChange(output);
                output = "";
            }

        }
    }
    
}
