//NAME: NG JING ER
//MATRIC: A19EC0115
//SECJ1023-08
//ASSIGNMENT 2

#include <iostream>
#include <string>
using namespace std;

class Name{
	private:
		string _firstname;
		string _lastname;
		
	public:
		Name(string firstname,string lastname){
			_firstname=firstname;
			_lastname=lastname;
		}
		friend ostream &operator<<(ostream &output,Name &n){
			output<<n._firstname<<" "<<n._lastname;
			return output;
		}
};

class Course{
	private:
		string _code;
		string _name;
	public:
		Course(){
			_code="";
			_name="";
		}
		Course(string code,string name){
			_code=code;
			_name=name;
		}
		string getCode(){ return _code;}
		string getName(){ return _name;}
};

const int Cnum=3;

class Student{
	private:
		Name _name;
		Course _course[Cnum];
		
	public:
		Student(Name name, Course *course):_name(name)
			{	if (course!=0)
				_course[0]=*course;
			}
		bool addCourse(Course *course){
			string courseCode="";
			
			if (course == 0) 
			return false;
			bool allow=false;
			
			for (int i=0;i<Cnum;i++){
				if (_course[i].getCode()==course->getCode())
					return false;
				if (_course[i].getCode()==courseCode)
					{	_course[i]=*course;
						allow=true;
						break;	}
			}
			return allow;	
		}
		
		string getRegisteredCourses(){
			string courseList;
			string Empty="";
		
			for (int i=0;i<Cnum;i++){	
				if (_course[i].getCode()!=Empty)
					courseList+=_course[i].getName();
			}	
			if (courseList==Empty) 
			courseList = " None";
		
			return courseList;
		}
		
		friend ostream &operator<<(ostream &output,Student &s){
			output<<s._name<<" registered courses: "<<s.getRegisteredCourses();
			return output;
		}
};

int main(){
	Course coursesProvided[]={ Course("0101"," Cryptography "),Course("0234"," Programming "),Course("1234"," Calculus "),Course("2356"," History "), Course("3658"," Geography ")};
	
	//no course registered
	Name n1("Jane","Chiam");
	Student s1(n1,0);
	cout<<s1<<endl<<endl;
	
	//2 courses registered
	s1.addCourse(&coursesProvided[1]);
	s1.addCourse(&coursesProvided[3]);
	cout<<s1<<endl<<endl;
	
	//course repeated
	s1.addCourse(&coursesProvided[3]);
	if (s1.addCourse(&coursesProvided[3])){
		cout<<"Registration successful"<<endl;}	
	else{
		cout<<"Registration failed"<<endl<<endl;}	
	
	//3 courses registered
	s1.addCourse(&coursesProvided[0]);
	cout<<s1<<endl<<endl;
	
	return 0;
	
}
