package algodataufg02_j;

import java.io.*; //Fuer BufferedReader & co

public class Main {

    static String binStr = "00000000";

    //Zeichen
    static char cEins = 'a';
    static char cZwei = '1';
    static char cDrei = '\b';

    //Integer-Zahl
    static int iEins = 1;
    static int iZwei = 12345;
    static int iDrei = -99;

    //Float-Zahl
    static float fEins = 1;
    static float fZwei = 123.45f;
    static float fDrei = -3434.43f;

    //String
    static String szEins = "a";
    static String szZwei = "Huggu_Wuggu";
    static String szDrei = "test\b\btest\btest";
    // DIE ANDEREN VARIABLEN
    //Zeichen
    static char acEins = '-';
    static char acZwei;
    static char acDrei;

    //Integer-Zahl
    static int aiEins;
    static int aiZwei;
    static int aiDrei;

    //Float-Zahl
    static float afEins;
    static float afZwei;
    static float afDrei;

    //String
    static String aszEins;
    static String aszZwei;
    static String aszDrei;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {

        kmdoProz();                         //Kommandoprozessor (Menue) aufrufen
    }

    public static String dec2bin(int d) {
        String bin = "";

        int rest;
        int div;

        rest = d % 2;
        div = d / 2;

        if (div != 0) {
            bin = bin + dec2bin(div);
        }

        bin = bin + String.valueOf(rest);
        return bin;

    }

    static void byteAusgeb() throws IOException {
        DataInputStream in = new DataInputStream(new FileInputStream("testi"));

        int aktByte = 1;

        System.out.format("\nAddr\tDec\tHex\tBin\t     ASC\n");

        int i = 0;
        try {
            while (true) {
                aktByte = in.readByte();

                aktByte = aktByte & 0xFF; //Gibt leider kein unsigned int in Java

                binStr = dec2bin(aktByte);

                i++;

                if (aktByte < 65 || aktByte > 126) { //Nicht druckbares Zeichen
                    System.out.format("%04d:\t%3d\t%02x\t%08d     '.'\n", i, aktByte, aktByte, new Integer(binStr));
                } else {
                    System.out.format("%04d:\t%3d\t%02x\t%08d     '%c'\n", i, aktByte, aktByte, new Integer(binStr), aktByte);
                }
            }
        } catch (EOFException e) {
            System.out.format("\n");
        }

        in.close();

    }

    static void leseBin() throws IOException {
        DataInputStream in = new DataInputStream(new FileInputStream("testi"));

        acEins = in.readChar();
        acZwei = in.readChar();
        acDrei = in.readChar();

        aiEins = in.readInt();
        aiZwei = in.readInt();
        aiDrei = in.readInt();

        afEins = in.readFloat();
        afZwei = in.readFloat();
        afDrei = in.readFloat();

        aszEins = in.readUTF();
        aszZwei = in.readUTF();
        aszDrei = in.readUTF();

        in.close();

        System.out.format("\nInteger: 1=%c, 2=%c, 3=%c\n", acEins, acZwei, acDrei);
        System.out.format("Double:  1=%d, 2=%d, 3=%d\n", aiEins, aiZwei, aiDrei);
        System.out.format("Float:   1=%f, 2=%f, 3=%f\n", afEins, afZwei, afDrei);
        System.out.format("String:  1=%s, 2=%s, 3=%s\n", aszEins, aszZwei, aszDrei);
    }

    static void schreibBin() throws IOException {
        DataOutputStream out = new DataOutputStream(new FileOutputStream("testi"));

        out.writeChar(cEins);
        out.writeChar(cZwei);
        out.writeChar(cDrei);

        out.writeInt(iEins);
        out.writeInt(iZwei);
        out.writeInt(iZwei);

        out.writeFloat(fEins);
        out.writeFloat(fZwei);
        out.writeFloat(fDrei);

        out.writeUTF(szEins);
        out.writeUTF(szZwei);
        out.writeUTF(szDrei);

        out.close();
    }

    static void leseText() throws IOException {
        BufferedReader in = new BufferedReader(
                new InputStreamReader(
                new FileInputStream("testi")));


        acEins = in.readLine().charAt(0);
        acZwei = in.readLine().charAt(0);
        acDrei = in.readLine().charAt(0);

        aiEins = Integer.valueOf(in.readLine());
        aiZwei = Integer.valueOf(in.readLine());
        aiDrei = Integer.valueOf(in.readLine());

        afEins = Float.valueOf(in.readLine());
        afZwei = Float.valueOf(in.readLine());
        afDrei = Float.valueOf(in.readLine());

        aszEins = in.readLine();
        aszZwei = in.readLine();
        aszZwei = in.readLine();

        in.close();

        System.out.format("\nInteger: 1=%c, 2=%c, 3=%c\n", acEins, acZwei, acDrei);
        System.out.format("Double:  1=%d, 2=%d, 3=%d\n", aiEins, aiZwei, aiDrei);
        System.out.format("Float:   1=%f, 2=%f, 3=%f\n", afEins, afZwei, afDrei);
        System.out.format("String:  1=%s, 2=%s, 3=%s\n", aszEins, aszZwei, aszDrei);
    }

    static void schreibText() throws IOException {
        BufferedWriter out = new BufferedWriter(
                new OutputStreamWriter(
                new FileOutputStream("testi")));

        out.write(cEins + "\n" + cZwei + "\n" + cDrei + "\n" +
                iEins + "\n" + iZwei + "\n" + iDrei + "\n" +
                fEins + "\n" + fZwei + "\n" + fDrei + "\n" +
                szEins + "\n" + szZwei + "\n" + szDrei + "\n");

        out.close();
    }

    static void kmdoProz() throws IOException {
        String cmd;
        int exit = 0;
        int treffer = 0; //1 wenn ein Befehl erkannt wurde

        while (exit == 0) {
            treffer = 0;

            System.out.format("Menue:\nauf Textdatei schreiben:   WT\naus Tex" +
                    "tdatei lesen:       RT\nauf Binaerdatei schreiben: WB\na" +
                    "us Binaerdatei lesen:     RB\nDatei byteweise ausgeben  " +
                    " B\nQuit - Programmende        Q\n\n  Eingabe: ");


            BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));

            cmd = buffer.readLine();

            if (cmd.matches("^[WTRBQwtrbq]{1,2}$") != true) {
                treffer = 1;
                System.out.format("\nFehler, ungueltige Eingabe!\n\n");
            }


            if (cmd.equalsIgnoreCase("WT") == true) {
                treffer = 1;
                System.out.format("\nSchreibe auf Textdatei\n\n");
                schreibText();
            }

            if (cmd.equalsIgnoreCase("RT") == true) {
                treffer = 1;
                System.out.format("\nLese aus Textdatei\n\n");
                leseText();
            }

            if (cmd.equalsIgnoreCase("WB") == true) {
                treffer = 1;
                System.out.format("\nSchreibe auf Binaerdatei\n\n");
                schreibBin();
            }

            if (cmd.equalsIgnoreCase("RB") == true) {
                treffer = 1;
                System.out.format("\nLese aus Binaerdatei\n\n");
                leseBin();
            }

            if (cmd.equalsIgnoreCase("B") == true) {
                treffer = 1;
                System.out.format("\nGebe Datei byteweise aus\n\n");
                byteAusgeb();
            }

            if (cmd.equalsIgnoreCase("Q") == true) {
                treffer = 1;
                System.out.format("\nProgrammende\n\n");
                exit = 1;
            }

            if (treffer != 1) {
                System.out.format("\nFehler, Befehl nicht gefunden!\n\n").println();
            }
        }

    }
}