//
//  main.cpp
//  ADS P3
//

#define CATCH_CONFIG_RUNNER
#include "Tree.h"
#include "catch.h"
#include <iostream>
#include <fstream>

void mainscreen_addTreeCSV(Tree*& ref) {
	char response;
	cout << "+ Moechten Sie die Daten aus der Datei ExportZielanalyse.csv "
		"importieren(j / n) \n?> ";
	cin >> response;
	if (response == 'j') {
		ifstream csvread;
		csvread.open("../ExportZielanalyse.csv", ios::in);
		if (!csvread.is_open()) {
			cout << "Fehler beim Lesen!" << endl;
			return;
		}
		else {
			string name, age, postcode, income;

			while (!csvread.eof()) {
				getline(csvread, name, ';');
				getline(csvread, age, ';');
				getline(csvread, income, ';');
				getline(csvread, postcode, '\n');
				ref->addNode(name, stoi(age), stod(income), stoi(postcode));
			}
			csvread.close();
		}
		cout << "+ Daten wurden dem Baum hinzugefuegt." << endl;
	}
}

int main() {
	int result = Catch::Session().run();

	Tree* m_Baum = new Tree();
	int engb;

	while (true) {
		cout << "====================================\n"
			"1) Datensatz einfuegen, manuell\n"
			"2) Datensatz einfuegen, CSV Datei\n"
			"3) Suchen\n"
			"4) Ausgabe in Levelorder\n"
			"5) Ausgabe in Levelorder (mit Niveauauswahl)\n"
			"6) Beenden\n"
			"?> ";
		cin >> engb;
		switch (engb) {
		case 1: {
			string name;
			int alter, plz;
			double einkommen;

			cout << "\n+ Bitte geben Sie die den Datensatz ein"
				"\nName \n?> ";
			cin >> name;
			cout << "\nAlter \n?> ";
			cin >> alter;
			cout << "\nEinkommen \n?> ";
			cin >> einkommen;
			cout << "\nPLZ \n?> ";
			cin >> plz;
			m_Baum->addNode(name, alter, einkommen, plz);
			cout << "\n+ Ihr Datensatz wurde eingefuegt" << endl;
			break;
		}
		case 2: {
			mainscreen_addTreeCSV(m_Baum);
			break;
		}
		case 3: {
			string name;
			cout << "+ Bitte geben Sie den zu suchenden Datensatz an\n"
				"Name ?> ";
			cin >> name;
			cout << "+ Fundstellen:\n";
			m_Baum->searchNode(name);
			break;
		}
		case 4: {
			m_Baum->printLevelOrder();
			break;
		}
		case 5: {
			int niveau;
			cout << "\n+ Bitte geben Sie das Niveau ein"
				"\nNiveau \n?> ";
			cin >> niveau;
			m_Baum->print234Tree(niveau);
			break;
		}
		case 6: {
			return 0;
		}
		}
	};

	return 0;
}
