import java.net.*;
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Client {
  public static void main(String[] args) {
    InetAddress serverAddress;
    Socket s;
    OutputStreamWriter toServer;
    BufferedReader fromServer;
    // Response regex pattern
    Pattern responsePattern = Pattern.compile(":(\\S+)\\s+(\\d{3})\\s+(\\S+)\\s+:?(.+)");
    // Message regex pattern (z.B. PRIVMSG oder NOTICE)
    Pattern messagePattern = Pattern.compile(":(\\S+)\\s+([A-Z]+)\\s+(\\S+)\\s+:?(.+)");

    try {
      // Löse den Hostnamen auf 
      serverAddress = InetAddress.getByName("rnvs.rnp.lab.nm.ifi.lmu.de");
    } catch (UnknownHostException e) {
      System.out.println("Fehler beim Auflösen des Hostnamen");
      return;
    }

    try {
      // Erstelle einen Socket und verbinde auf Port 6667
      s = new Socket(serverAddress, 6667);
      // Ab hier können wir annehmen, dass die Verbindung aufgebaut wurde
      // Initialisiere die beiden Server
      toServer = new OutputStreamWriter(s.getOutputStream());
      fromServer = new BufferedReader(new InputStreamReader(s.getInputStream()));
      // Schicke NICK und USER Nachrichten an den Server
      toServer.write("NICK mynick\r\n");
      toServer.write("USER mynick 0 mynick :Max Mustermann\r\n");
      toServer.flush();

      String line;
      // Lese zeilenweise vom Socket, bis dieser geschlossen wird
      while((line = fromServer.readLine()) != null) {
	      Matcher m = responsePattern.matcher(line);
              // Handelt es sich um eine Antwort, z.B. RPL_WELCOME?
	      if(m.matches()) {
		      System.out.format("[RPL][%s][%s][%s] %s\n", m.group(1), m.group(2), m.group(3), m.group(4));

		      // Wenn die Verbindung erfolgreich war (status 001), verschicke die Nachricht
		      if (m.group(2).equals("376")) {
			      toServer.write("PRIVMSG rnvs-bot :Eine Nachricht - gar mit Leerzeichen!\r\n");
			      toServer.flush();
		      }
	      } else {
		      m = messagePattern.matcher(line);
                      // Handelt es sich um eine Nachricht, z.B. PRIVMSG?
		      if (m.matches()) {
			      System.out.format("[MSG][%s][%s][%s] %s\n", m.group(1), m.group(2), m.group(3), m.group(4));
                              // Wir haben eine Antwort erhalten -> QUIT veranlasst den Server den Socket zu schließen
			      toServer.write("QUIT\r\n");
			      toServer.flush();
		      }
	      }
         }
      } catch (IOException e) {
	      System.out.println("Fehler beim Erstellen des Sockets: " + e.getMessage());
	      return;
      }

    }
  }
