import java.io.*;
import java.util.*;

public class Taschenrechner {

	private static void clearLog() {
		try {
			BufferedWriter out = new BufferedWriter(new FileWriter("taschenrechner.log"));
			out.write("");
			out.close();
		} catch (FileNotFoundException e) {
			System.err.println("File not found!");
		} catch (IOException e) {
			System.err.println("IO-Fehler");
		}
		try {
			String userAction;
			BufferedReader inStream = new BufferedReader ( new InputStreamReader (System.in));
			inStream.readLine();
		} catch(IOException e) {
			System.out.println("Hier kann eigentlich nichts schiefgehen");
			writeLog(e.toString());
		}
		drawMenu();
	}
	
	private static void startLogging() {
		try {
	        File file = new File("taschenrechner.log");
	        file.createNewFile();
	    } catch (IOException e) {
	    	System.err.println("Fehler beim Dateianlegen aufgetreten");
	    }
	}
	
	private static void writeLog(String logContents) {
		try {
			String oldContent = "";			 
			FileReader fr     = new FileReader("taschenrechner.log");
	         	BufferedReader br = new BufferedReader(fr);
	         	String record;
	         	while ((record = br.readLine()) != null) {
	           		oldContent += (record + "\n"); 
	         	} 
			BufferedWriter out = new BufferedWriter(new FileWriter("taschenrechner.log"));
			Date myDate = new Date();
			out.write(oldContent + myDate.toString() + " - " + logContents + "\n");
			out.close();
		} catch (FileNotFoundException e) {
		    System.err.println("FileStreamsTest: " + e);
		} catch (IOException e) {
		    System.err.println("FileStreamsTest: " + e);
		}
	}
	
	private static void showLog() {
		System.out.println("Logfile - Layer 8 Fehler:");		
		try {
			 FileReader fr     = new FileReader("taschenrechner.log");
	         BufferedReader br = new BufferedReader(fr);
	         String record;
	         while ((record = br.readLine()) != null) {
	           	System.out.println(record);
	         } 
		} catch (FileNotFoundException e) {
		    System.err.println("FileStreamsTest: " + e);
		    writeLog(e.toString());
		} catch (IOException e) {
		    System.err.println("FileStreamsTest: " + e);
		    writeLog(e.toString());
		}
		try {
			String userAction;
			BufferedReader inStream = new BufferedReader ( new InputStreamReader (System.in));
			inStream.readLine();
		} catch(IOException e) {
			System.out.println("Hier kann eigentlich nichts schiefgehen");
			writeLog(e.toString());
		}
		drawMenu();
	}
	
	private static double readDoubleConsole() {
		double returnValue;
		try {
			String userAction;
			BufferedReader inStream = new BufferedReader ( new InputStreamReader (System.in));
			userAction = inStream.readLine();
			returnValue = Double.parseDouble(userAction);
		} catch(NumberFormatException e) {
			System.err.println("Ungueltige Eingabe");
			writeLog(e.toString());
			returnValue = readDoubleConsole();
		} catch(IOException e) {
			System.err.println("Einlesefehler");
			writeLog(e.toString());
			returnValue = readDoubleConsole();
		}
		
		return returnValue;
	}
	
	private static void drawMenu() {		
		System.out.print( "\033[H\033[2J" );
		System.out.println("Optionsauswahl");
		System.out.println("=====================");
		System.out.println("1 -> Menue");
		System.out.println("2 -> Addition");
		System.out.println("3 -> Substraktion");
		System.out.println("4 -> Multiplikation");
		System.out.println("5 -> Divison");
		System.out.println("6 -> Clear Log");
		System.out.println("7 -> Show Log");
		System.out.println("0 -> Beenden");
		System.out.println("=====================");
	}
	
	private static void doCalculate(String actionName, String firstIn, String secondIn, int actionType) {
		double a,b;
		
		System.out.println(actionName);
		System.out.println("=====================");
		System.out.println(firstIn);		
		a = readDoubleConsole();
		System.out.println(secondIn);		
		b = readDoubleConsole();
		switch(actionType) {
			case 1: System.out.println(a + " + " + b + " = " + (a+b)); break;
			case 2: System.out.println(a + " - " + b + " = " + (a-b)); break;
			case 3: System.out.println(a + " * " + b + " = " + (a*b)); break;
			case 4: System.out.println(a + " / " + b + " = " + (a/b)); break;
			default: System.err.println("Ungueltige Auswahl");
		}		
		System.out.println("=====================");
		try {
			String userAction;
			BufferedReader inStream = new BufferedReader ( new InputStreamReader (System.in));
			inStream.readLine();
		} catch(IOException e) {
			System.out.println("Hier kann eigentlich nichts schiefgehen");
			writeLog(e.toString());
		}
		drawMenu();		
	}	
	
	public static void main(String[] args) {

		boolean runProgram = true;
		int choice = 1;
	
		System.out.println("Taschenrechner V 1.0");
		
		startLogging();
		
		do{
			switch (choice) {
			    case 1: drawMenu(); break;
			    case 2: doCalculate("Addition","1. Summand","2. Summand",1); break;
			    case 3: doCalculate("Substraktion","Minuend","Substrahent",2); break;
			    case 4: doCalculate("Multiplikation","1. Faktor","2. Faktor",3); break;
			    case 5: doCalculate("Divison","Divident","Divisor",4); break;
			    case 6: clearLog(); break;	
			    case 7: showLog(); break;
			    case 0: default: runProgram = false;			    
			}
			if(choice != 0) {
				try {
					String userAction;
					BufferedReader inStream = new BufferedReader ( new InputStreamReader (System.in));
					userAction = inStream.readLine();
					choice = Integer.parseInt(userAction);
				} catch(NumberFormatException e) {
					System.err.println("Ungueltige Auswahl, Menue wird erneut aufgerufen");
					writeLog(e.toString());
					choice = 1;
				} catch(IOException e) {
					System.err.println("Einlesefehler, Menue wird erneut aufgerufen");
					writeLog(e.toString());
					choice = 1;
				}
			}					
		} while(runProgram == true);
		System.out.print( "\033[H\033[2J" );
		System.out.println("Danke fuers Benutzen!");
		System.out.println("============================");
		
	}
}
