/*
 *  Kolage
 */

package easycomm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Date;
import java.util.Iterator;

public class ClientHandler extends Thread {

    final String NAME_KW = "NAME";
    final String CLIENTS_KW = "CLIENTS";
    final String MSG_KW = "MESSAGES";
    final String ALLUSERS_KW = "CONNECTED USERS;";
    final String ALLMSG_KW = "ALL MESSAGES;";
    final String NEW_KW = "NEW";
    final String END_KW = "END;";

    private Socket client;
    String clientName;

    public ClientHandler(Socket client) {
        this.client = client;
    }

    @Override
    public void run() {
        try {
            PrintStream out = new PrintStream(client.getOutputStream());
            BufferedReader in = new BufferedReader(
                    new InputStreamReader(
                    client.getInputStream()));

            String[] input;
            String str;
            boolean exists = false;

            str = in.readLine();

            if (str == null) {
                try {
                    Server.clientCounter--;
                    client.close();
                }
                catch (IOException e) {
                    System.out.println("Chyba pri uzavirani klientske relace. - " + e.getMessage());
                }
            }

            if(str.startsWith(NAME_KW)) {
                input = str.split(" ");
                for(User u : Server.users) {
                    if(u.name.equals(input[1])) {
                        exists = true;
                        break;
                    }
                }
                if(exists) {
                    out.println("ERROR - uzivatel s timto jmenem jiz existuje");
                    try {
                        Server.clientCounter--;
                        client.close();
                    }
                    catch (IOException e) {
                        System.out.println("Chyba pri uzavirani klientske relace. - " + e.getMessage());
                    }
                } else {
                    clientName = input[1];
                    out.println("OK - pripojeni probehlo uspesne");
                    Server.users.add(new User(clientName, client.getInetAddress(), client.getPort()));
                }
            }

            System.out.println("Pripojen klient: " + clientName + ", " +
                    client.getInetAddress() + ":" + client.getPort());

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

                if (str == null)
                    break;

                if(str.equals(CLIENTS_KW)) {
                    Iterator it = Server.users.iterator();
                    out.println(ALLUSERS_KW);
                    for(User u : Server.users) {
                        out.println(u.name + ", " + u.adresa + ":" + u.port);
                    }
                    out.println(END_KW);
                }

                if(str.equals(MSG_KW)) {
                    out.println(ALLMSG_KW);
                    for(Message msg : Server.messages) {
                        out.println(String.format(
                                "%s, %s : %s", msg.clientName, msg.timestamp, msg.message));
                    }
                    out.println(END_KW);
                }

                if(str.startsWith(NEW_KW)) {
                    input = str.split(" ",2);
                    Server.messages.add(new Message(new Date(), clientName, input[1]));
                }
            }

        }

        catch (IOException e) {
            System.out.println(e.getMessage());
            return;
        }

        finally {
            try {
                for(User u : Server.users) {
                    if(u.name.equals(clientName)) {
                        System.out.println("Pripojeni s klientem *" + u.name + "* ukonceno.");
                        Server.users.remove(u);
                        break;
                    }
                }
                Server.clientCounter--;
                client.close();
            }
            catch (IOException e) {
                System.out.println("Chyba pri uzavirani klientske relace. - " + e.getMessage());
            }
        }
    }

}
