#include <iostream>
#include <set>
#include <algorithm>
#include <vector>
#include "Course.h"


int main() {
    std::vector<Course *> courses;

    bool quit = false;
    while (!quit) {
        std::cout << "1. Create course" << std::endl;
        std::cout << "2. Add student" << std::endl;
        std::cout << "3. Add existing student" << std::endl;
        std::cout << "4. Display student" << std::endl;
        std::cout << "5. Remove student" << std::endl;
        std::cout << "6. Delete student" << std::endl;
        std::cout << "7. Display course" << std::endl;
        std::cout << "8. Display all courses" << std::endl;
        std::cout << "9. Quit" << std::endl;
        std::cout << "Enter your choice: ";
        int choice;
        std::cin >> choice;
        std::string name, lastName, firstName, courseName;
        int matriculationNumber;
        switch (choice) {
            case 1:
                std::cout << "Enter course name: ";
                std::cin.ignore();
                std::getline(std::cin, name);
                courses.push_back(new Course(name));
                break;
            case 2:
                std::cout << "Enter student's first name: ";
                std::cin >> firstName;
                std::cout << "Enter student's last name: ";
                std::cin >> lastName;
                std::cout << "Enter course name: ";
                std::cin >> courseName;
                for (auto *course: courses) {
                    if (course->getName() == courseName) {
                        course->addStudent(new Student(lastName, firstName));
                    }
                }
                break;
            case 3:
                std::cout << "Enter student's matriculation number: ";
                std::cin >> matriculationNumber;
                std::cout << "Enter course name: ";
                std::cin >> courseName;
                for (auto *course: courses) {
                    if (course->getName() == courseName) {
                        Student *student = course->getStudent(matriculationNumber);
                        if (student != nullptr) {
                            course->addStudent(student);
                        }
                    }
                }
                break;
            case 4:
                std::cout << "Enter student's matriculation number: ";
                std::cin >> matriculationNumber;
                for (auto *course: courses) {
                    course->displayStudent(matriculationNumber);
                }

                break;
            case 5:
                std::cout << "Enter student's matriculation number: ";
                std::cin >> matriculationNumber;
                std::cout << "Enter course name: ";
                std::cin >> courseName;
                for (auto *course: courses) {
                    if (course->getName() == courseName) {
                        course->deleteStudent(matriculationNumber);
                    }
                }
                break;
            case 6:
                std::cout << "Enter student's matriculation number: ";
                std::cin >> matriculationNumber;
                // Delete student from all courses
                for (auto *course: courses) {
                    course->deleteStudent(matriculationNumber);
                }
                break;

            case 7:
                std::cout << "Enter course name: ";
                std::cin >> courseName;
                for (auto *course: courses) {
                    if (course->getName() == courseName) {
                        course->displayCourse();
                    }
                }
                break;
            case 8:
                std::cout << "Courses:" << std::endl;
                for (auto *course: courses) {
                    course->displayCourse();
                }
                break;
            case 9:
                quit = true;
                break;
            default:
                std::cout << "Invalid choice." << std::endl;
                break;
        }
    }
    for (auto *course: courses) {
        delete course;
    }
    return 0;
}