package Client;

import java.io.*;
import java.security.*;
import javax.crypto.*;
import java.math.*;
import java.util.*;
import org.bouncycastle.openssl.*;
import org.bouncycastle.util.encoders.*;

public class Main implements Runnable{
  static private BufferedReader $con = null;

  static private TCP $tcp = null;
  static private UDP $udp = null;
  static public Config $cfg = new Config("client");


static public void main(String[] $args)throws Exception{
  System.out.println("CLIENT Starting...");

  $udp = new UDP($cfg.getString("server.host"),$cfg.getInt("server.tcp.port"));
  $tcp = new TCP($cfg.getString("server.host"),$cfg.getInt("server.udp.port"));

  new Thread(new Main()).start();
  System.out.println("CLIENT IDLE.");
}

public void run(){
  try{
    Thread.currentThread().setPriority(9);
    $con = new BufferedReader (new InputStreamReader(System.in));
    while($con != null)try{auswertung($con.readLine().trim());}catch(Exception $e){$e.printStackTrace();} //Eingaben auswerten
  }catch(Exception $e){$e.printStackTrace();}
  $con = null;
}

static public void auswertung(String $eingraw)throws Exception{
  if($eingraw.equals("") || $eingraw == null)return; // Ignore null-commands
  String[] $eing = $eingraw.split("\\s+"); //regex: whitespace character once and more

  if($eing[0].equalsIgnoreCase("!login")){
    if($eing.length == 1){
      PEMReader in = new PEMReader(new FileReader($cfg.getString("keys.private.dir")+File.separator+$eing[1]+".pem"), new PasswordFinder() { 
      @Override 
      public char[] getPassword(){
        try{System.out.println("Enter pass phrase:"); return (new BufferedReader(new InputStreamReader(System.in)).readLine()).toCharArray();}catch(Exception $e){$e.printStackTrace();}return null;
      }}); 
      $tcp.$prk = ((KeyPair) in.readObject()).getPrivate();

      byte[] $rand = new byte[32]; 
      new SecureRandom().nextBytes($rand);
      $tcp.$challenge = new String(Base64.encode($rand));

      $tcp.send($eingraw+" "+new String(Base64.encode($rand)));
      return;
    }else{
      System.out.println("Ungültige Loginanfrage. !login <username>");
    }
  }

  if($eing[0].equalsIgnoreCase("!end")){
    $tcp.send("!logout");
    $tcp.shutdown();
    $udp.shutdown();
    $con.close();
    $con = null;
    return;
  }
  if($eing[0].equalsIgnoreCase("!list")){$udp.send($eingraw); return;}
  if($eing[0].equalsIgnoreCase("!info")){$udp.send($eingraw); return;}
  if($eing[0].charAt(0) == '!'){$tcp.send($eingraw); return;}
  System.out.println("Unknown input: "+$eingraw);
}
}