package javacodebook.io.randomaccess;

import java.io.*;

/**
 * Die Klasse PersonDatabase steuert den Zugriff auf den FileManager und
 * stellt die Methoden zum Hinzufügen, Finden und Löschen von Personen
 * sowie zur Auflistung aller Datensätze zur Verfügung.
 */
public class PersonDatabase {

    private FileManager fileManager;
    BufferedReader in = null;

    /**
     * Erzeugt eine neue PersonDatenbank. Als Parameter wird der Dateiname
     * angegeben, unter dem die Daten gespeichert werden sollen.
     */
    public PersonDatabase(String dataFile) {
        try {
            fileManager = new FileManager(dataFile, new Person());

            //Eingabestrom zum Einlesen der Werte anlegen
            InputStreamReader reader = new InputStreamReader(System.in);
            in = new BufferedReader(reader);
        } catch(IOException e) {
            System.out.println("Konnte Datei nicht öffnen");
            e.printStackTrace(System.out);
        }
    }

    public void addPerson() {
        try {
            Person p = new Person();
            System.out.print("Name: ");
            p.setName(in.readLine());
            System.out.print("Alter: ");
            p.setAlter(Integer.parseInt(in.readLine()));
            System.out.print("Adresse: ");
            p.setAdresse(in.readLine());
            fileManager.addEntry(p);
        } catch(IOException e) {
            System.out.println("Konnte Datensatz nicht hinzufügen");
            e.printStackTrace(System.out);
        }
    }

    public Person findPerson() {
        Person p = null;
        try {
            System.out.print("Name: ");
            String name = in.readLine();
            p = (Person)fileManager.findEntry(name);
            if(p != null) {
                System.out.println(p.toString());
            }
            else {
                System.out.println(name + " nicht gefunden");
            }
        } catch(IOException e) {
            System.out.println("Konnte Datensatz nicht finden");
            e.printStackTrace(System.out);
        }
        return p;
    }

    public void deletePerson() {
        try {
            Person p = findPerson();
            if(p != null) {
                fileManager.deleteEntry(p);
                System.out.println(p.getName() + " wurde gelöscht");
            }
        } catch(IOException e) {
            System.out.println("Konnte Datensatz nicht finden");
            e.printStackTrace(System.out);
        }
    }

    public void showAll() {
        try {
            DataEntry[] personen = fileManager.getAllEntries();
            java.util.Arrays.sort(personen);
            for(int i = 0; i < personen.length; i++)
                System.out.println(((DataEntry)personen[i]).toString());
        } catch(IOException e) {
            System.out.println("Konnte Datensatz nicht finden");
            e.printStackTrace(System.out);
        }
    }

    public static void main(String[] args) throws IOException {
        if(args.length < 1) {
            printUsage();
            System.exit(0);
        }
        String fileName = args[0];
        PersonDatabase database = new PersonDatabase(fileName);
        try {
            //Schleife über das Kommandozeilen-Menü
            boolean repeat = true;
            while(repeat) {
                System.out.println("Bitte wählen Sie eine Funktion:");
                System.out.print("(h)inzufügen  (s)uchen  (l)öschen  ");
                System.out.print("(a)lle Datensätze anzeigen  ");
                System.out.println("b(e)enden");
                InputStreamReader reader = new InputStreamReader(System.in);
                BufferedReader in = new BufferedReader(reader);
                char c = (char)in.read();
                switch(c) {
                    case 'h':
                        System.out.println("Neuer Datensatz:");
                        database.addPerson();
                        break;
                    case 's':
                        System.out.println("Datensatz suchen:");
                        database.findPerson();
                        break;
                    case 'l':
                        System.out.println("Datensatz löschen");
                        database.deletePerson();
                        break;
                    case 'a':
                        System.out.println("Alle Datensätze:");
                        database.showAll();
                        break;
                    case 'e':
                        System.out.println("Programm wird beendet");
                        repeat = false;
                        break;
                    default:
                        System.out.println("Unbekannter Befehl " + c);
                        break;
                }
            }
        } catch(Exception e) {
            e.printStackTrace(System.out);
        }
    }

    private static void printUsage() {
        System.out.println("Benutzung: java javacodebook.io.randomacces.PersonDatabase dateiname");
    }
}
