int main() {
	int action = -1;
	Controller controller;
	TaskList* taskList = new TaskList();
	TaskLoader* taskLoader = new TaskLoader("tasks");
	
	taskLoader->loadTasks(taskList);
	
	while(action != 0) {
		system("clear");
		std::cout << "Wybierz opcje:\n" << std::endl;
		std::cout << "1 - Dodaj zadanie" << std::endl;
		std::cout << "2 - Wypisz listę zadań" << std::endl;
		std::cout << "0 - Zakończ działanie programu\n" << std::endl;
		std::cout << "Podaj nr opcji: ";
		while(!(std::cin >> action) || ((action != 1) && (action != 2) && (action != 0))) {
			std::cout << "Podałeś zły nr opcji. Spróbuj jeszcze raz: ";
			std::cin.clear();
			std::cin.ignore (1000, '\n'); 
		}
		
		
		switch(action) {
			case 1:
				controller.addTask(taskList);
				break;
			case 2:				
				while(action != 0) {
					system("clear");
					
					controller.showTasksList(taskList);
				
					std::cout << std::endl;
					std::cout << std::endl;
					std::cout << std::endl;
					std::cout << "Wybierz opcje:\n" << std::endl;
					std::cout << "1 - Przejdź do wybranego zadania" << std::endl;
					std::cout << "0 - Powróć do głównego menu" << std::endl;
					std::cout << "Podaj nr opcji: ";
					while(!(std::cin >> action) || ((action != 1) && (action != 0))) {
						std::cout << "Podałeś zły nr opcji. Spróbuj jeszcze raz: ";
						std::cin.clear();
						std::cin.ignore (1000, '\n'); 
					}
				
					switch(action) {
						case 1:
							int taskId;
							std::cout << "Podaj id zadania: ";
							while(!(std::cin >> taskId) || !((taskList->getNumberOfTasks() + 1 > taskId) && (taskId > 0))) {
								std::cout << "Podałeś zły nr id zadania. Spróbuj jeszcze raz: ";
								std::cin.clear();
								std::cin.ignore (1000, '\n'); 
							}
							
							taskId--;
							
							while(action != 0) {
								system("clear");
								
								controller.showTask(taskList->getTask(taskId));
								
								std::cout << std::endl;
								std::cout << std::endl;
								std::cout << std::endl;
								std::cout << "Wybierz opcje:\n" << std::endl;
								std::cout << "1 - Edytuj zadanie" << std::endl;
								std::cout << "2 - Usuń zadanie" << std::endl;
								std::cout << "0 - Powróć do listy zadań" << std::endl;
								std::cout << "Podaj nr opcji: ";
								while(!(std::cin >> action) || ((action != 1) && (action != 2) && (action != 0))) {
									std::cout << "Podałeś zły nr opcji. Spróbuj jeszcze raz: ";
									std::cin.clear();
									std::cin.ignore (1000, '\n'); 
								}
								
								switch(action) {
									case 1:
										controller.editTask(taskList->getTask(taskId));
										break;
									case 2:
										controller.removeTask(taskList, taskId);
										action = 0;
										break;
									case 0:
										break;
									default:
										break;
								}
							}
							
							action = -1;
							
							break;
						case 0:
							break;
						default:
							break;
					}
				}
				
				action = -1;
				
				break;
			case 0:
				break;
			default:
				break;
		}
	}
	
	taskLoader->saveTasks(taskList);
	
	return 0;
}
int main() {
	int action = -1;
	Controller controller;
	TaskList* taskList = new TaskList();
	taskLoader = new TaskLoader("tasks");
	
	taskLoader->loadTasks(taskList);
	
	while(action != 0) {
		system("clear");
		std::cout << "Wybierz opcje:\n" << std::endl;
		std::cout << "1 - Dodaj zadanie" << std::endl;
		std::cout << "2 - Wypisz listę zadań" << std::endl;
		std::cout << "0 - Zakończ działanie programu\n" << std::endl;
		std::cout << "Podaj nr opcji: ";
		while(!(std::cin >> action) || ((action != 1) && (action != 2) && (action != 0))) {
			std::cout << "Podałeś zły nr opcji i nasatąpiło wyrzucenie nic nie zaczącego wyjątku." << std::endl;
			try {
				throw std::exception();
			} catch(std::exception& e) {
				std::cout << "Następuje obsługe nic nie zaczącego wyjątku" << std::endl;
				std::cout << e.what();
			}
			std::cout << "Spróbuj jeszcze raz: ";
			std::cin.clear();
			std::cin.ignore (1000, '\n'); 
		}
		
		
		switch(action) {
			case 1:
				try {
					controller.addTask(taskList);
				} catch(std::exception& e) {
					std::cout << "Podałeś złą wartść. Wszystkie poprzednie zaminy zostaną zapisane i nastąpi wyjcie z programu.";
					taskLoader->saveLastLoadedTasks();
					exit(0); 
				}
				break;
			case 2:				
				while(action != 0) {
					system("clear");
					
					controller.showTasksList(taskList);
				
					std::cout << std::endl;
					std::cout << std::endl;
					std::cout << std::endl;
					std::cout << "Wybierz opcje:\n" << std::endl;
					std::cout << "1 - Przejdź do wybranego zadania" << std::endl;
					std::cout << "0 - Powróć do głównego menu" << std::endl;
					std::cout << "Podaj nr opcji: ";
					while(!(std::cin >> action) || ((action != 1) && (action != 0))) {
						std::cout << "Podałeś zły nr opcji. Spróbuj jeszcze raz: ";
						std::cin.clear();
						std::cin.ignore (1000, '\n'); 
					}
				
					switch(action) {
						case 1:
							int taskId;
							std::cout << "Podaj id zadania: ";
							while(!(std::cin >> taskId) || !((taskList->getNumberOfTasks() + 1 > taskId) && (taskId > 0))) {
								std::cout << "Podałeś zły nr id zadania. Spróbuj jeszcze raz: ";
								std::cin.clear();
								std::cin.ignore (1000, '\n'); 
							}
							
							taskId--;
							
							while(action != 0) {
								system("clear");
								
								controller.showTask(taskList->getTask(taskId));
								
								std::cout << std::endl;
								std::cout << std::endl;
								std::cout << std::endl;
								std::cout << "Wybierz opcje:\n" << std::endl;
								std::cout << "1 - Edytuj zadanie" << std::endl;
								std::cout << "2 - Usuń zadanie" << std::endl;
								std::cout << "0 - Powróć do listy zadań" << std::endl;
								std::cout << "Podaj nr opcji: ";
								while(!(std::cin >> action) || ((action != 1) && (action != 2) && (action != 0))) {
									std::cout << "Podałeś zły nr opcji. Spróbuj jeszcze raz: ";
									std::cin.clear();
									std::cin.ignore (1000, '\n'); 
								}
								
								switch(action) {
									case 1:
										try {
											controller.editTask(taskList->getTask(taskId));
										} catch(std::exception& e) {
											std::cout << "Podałeś złą wartść. Wszystkie poprzednie zaminy zostaną zapisane i nastąpi wyjcie z programu.";
											taskLoader->saveLastLoadedTasks();
											exit(0);
										}
										break;
									case 2:
										controller.removeTask(taskList, taskId);
										action = 0;
										break;
									case 0:
										break;
									default:
										break;
								}
							}
							
							action = -1;
							
							break;
						case 0:
							break;
						default:
							break;
					}
				}
				
				action = -1;
				
				break;
			case 0:
				break;
			default:
				break;
		}
	}
	
	taskLoader->saveTasks(taskList);
	
	return 0;
}