import java.io.*;
import java.net.Socket;
import java.util.ArrayList;

public class ClientHandler implements Runnable {

    public static ArrayList<ClientHandler> clients = new ArrayList<>();
    private Socket socket;

    private String username;
    private BufferedWriter bufferedWriter;
    private BufferedReader bufferedReader;

    public ClientHandler(Socket socket) {
        try {
            this.socket = socket;
            this.bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            this.bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            this.username = bufferedReader.readLine();
            clients.add(this);
            sendMessage("-------------СЕРВЕР: " + username + " присоединился");
            System.out.println(username + " присоединился");
            new Thread(this).start();
        } catch (IOException e) {
            closeEverything();
        }
    }

    @Override
    public void run() {
        String messageFromClient;
        while (socket.isConnected()) {
            try {
                messageFromClient = bufferedReader.readLine();
                if (messageFromClient != null) {
                    sendMessage(messageFromClient);
                }
            } catch (IOException e) {
                closeEverything();
                break;
            }
        }
    }

    public void sendMessage(String messageToSend) {
        for (ClientHandler clientHandler : clients) {
            try {
                clientHandler.bufferedWriter.write(messageToSend);
                clientHandler.bufferedWriter.newLine();
                clientHandler.bufferedWriter.flush();
            } catch (IOException e) {
                closeEverything();
            }
        }
    }

    private void closeEverything() {
        clients.remove(this);
        sendMessage("-------------СЕРВЕР: " + username + " покинул чат! (Пользователей в чате: " + clients.size() + ")");
        try {
            if (bufferedReader != null) {
                bufferedReader.close();
            }
            if (bufferedWriter != null) {
                bufferedWriter.close();
            }
            if (socket != null) {
                socket.close();
            }
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

}