import java.io.*;
import java.net.Socket;
import java.util.Objects;
import java.util.Scanner;

public class Client {

    private final Socket socket;
    private BufferedReader bufferedReader;
    private BufferedWriter bufferedWriter;
    private final String username;

    public Client(Socket socket, String username) {
        this.socket = socket;
        this.username = username;
        try {
            this.bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            this.bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            bufferedWriter.write(username);
            bufferedWriter.newLine();
            bufferedWriter.flush();

        } catch (IOException e) {
            closeEverything();
        }
        listenForSendMessage();
        listenForMessages();
    }

    private void listenForSendMessage() {
        new Thread(() -> {
            Scanner in = new Scanner(System.in);
            while (socket.isConnected()) {
                try {
                    String message = in.nextLine();
                    bufferedWriter.write(username + ": " + message);
                    bufferedWriter.newLine();
                    bufferedWriter.flush();
                } catch (IOException e) {
                    closeEverything();
                }
            }
        }).start();
    }

    private void listenForMessages() {
        new Thread(() -> {
            String message;
            while (socket.isConnected()) {
                try {
                    message = bufferedReader.readLine();
                    System.out.println(message + "\n");
                } catch (IOException e) {
                    closeEverything();
                }
            }
        }).start();
    }

    private void closeEverything() {
        try {
            if (bufferedReader != null) {
                bufferedReader.close();
            }
            if (bufferedWriter != null) {
                bufferedWriter.close();
            }
            if (socket != null) {
                socket.close();
            }
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

    public static void main(String[] args) {
        String username;
        System.out.println("-------------Введите имя");

        Scanner in = new Scanner(System.in);
        username = in.nextLine();
        if (Objects.equals(username, "")) {
            System.out.println("-------------Имя не может быть пустым");
            return;
        }

        try {
            Socket socket = new Socket("localhost", 8888);
            new Client(socket, username);
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }


}
}