//NAME: NG JING ER
//MATRIC: A19EC0115
//SECJ1023-08
//LAB EXERCISE PG 113

#include <iostream>
#include <string>
using namespace std;

class Contact{
	private:
		string phone;
		string email;
	public:
		Contact(){
			phone="";
			email="";   } 
		Contact(string ph, string em){
			phone=ph;
			email=em;	}
		void setPhone(string _phone){ phone=_phone;}
		void setEmail(string _email){ email=_email;}
		string getPhone( ){ return phone;}
		string getEmail( ){ return email;}
};		

class Person{
	protected:
		string name;
		string phone;
		string email;
	private:
		Contact contact;
	public:
		Person(){name="";}
		Person(string a, string b,string c):name(a),contact(b,c){
		name=a;	}
		void setName(string _name){	name=_name;	}
		string getName(){ return name;	}
		string getPhone(){ return contact.getPhone();}
		string getEmail(){ return contact.getEmail();}
		void display(){
			cout<<"Name: "<<getName()<<endl;
			cout<<"Phone: "<<getPhone()<<endl;
			cout<<"Email: "<<getEmail()<<endl;
		}
};

class Staff:public Person{
	protected:
		string position;
	public:
		Staff(){ position="";}
		Staff(string N, string P, string E, string PO):Person(N,P,E),position(PO){ 	}
		void setPosition(string post){ position=post;}
		string getPosition(){ return position;}
		void display(){
			Person::display();
			cout<<"Position: "<<getPosition()<<endl;			
		}
};

class Project{	
	protected:
		string title;
	public:		
		Project(){title=""; }
		void setTitle(string _title){ title=_title;}
		string getTitle( ){ return title;}
};

class Student:public Person{
	protected:
		string program;
	private:
		Project project;
		Staff *staff;
	public:
		Student(){program="";}
		Student(string N, string P, string E, string Prog, string t):Person(N,P,E)
		{	program=Prog;
			project.setTitle(t);
		}
		void setProgram(string prog){ program=prog;}
		void setProject(Project proj){ project=proj;}
		void setAdvisor(Staff *adv){ staff=adv;}
		string getProgram(){ return program;}
		string getProjectTitle(){ return project.getTitle();}
		string getAdvisorName(){ return staff->getName();}
		string getAdvisorPosition(){ return staff->getPosition();}
		void display(){
			Person::display();
			cout<<"Program: "<<getProgram()<<endl;
			cout<<"Project: "<<getProjectTitle()<<endl;
		}
		void print(){
			cout<<"Name: "<<name<<endl;
			cout<<"Project: "<<getProjectTitle()<<endl;
			cout<<"Advisor: "<<getAdvisorName()<<endl;
			cout<<"Advisor Position: "<<getAdvisorPosition()<<endl;			
		}
};

int main(){
	cout<<"\n....................Student's information....................\n"<<endl;
	int SIZE=3;
	
	Student *stud= new Student[SIZE]{	Student("Lim Siew Ying","010897634045","lsying12@live.utm.my","Electrical Engineering","Smart Dustbin"),
										Student("Abu Bakar Razali","0111210000","abraz78@live.utm.my","Computer Science","Money Recognition for Blind People"),
										Student("Nur Amalina Muhammad","0129000123","nam978@live.utm.my","Biomedical Engineering","Dengue Testing Kit")};
	for(int i=0;i<SIZE;i++){
		stud[i].display();
		cout<<endl;	}
	
	cout<<"______________________________________________________________\n\n";
	cout<<"....................Staff's information......................\n"<<endl;
	Staff *staff= new Staff[SIZE]{	Staff("Prof.Dr.Muhammad Roslan Abdullah","0199875678","mroslana29@gmail.com","Lecturer"),
									Staff("Mr Qamarool Zaman","01156781234","qam23@gmail.com","Senior Technician"),
									Staff("Dr.Siti Zubaidah Rosli","0101117456","ctzr983@gmail.com","Research Officer")};
	for(int i=0;i<SIZE;i++){
		staff[i].display();
		cout<<endl;	}
	
	cout<<"______________________________________________________________\n\n";
	cout<<"Assign each student with an advisor for their project......\n"<<endl;
	for(int i=0;i<SIZE;i++){
		stud[i].setAdvisor(&staff[i]);
		stud[i].print();
		cout<<endl; }
	
	cout<<"______________________________________________________________\n\n";
	cout<<"Final List after changes made ......\n"<<endl;
	Staff withdraw;
	stud[2].setAdvisor(&withdraw);
	stud[1].setAdvisor(&staff[0]);
	stud[0].setAdvisor(&staff[1]);
	
	for(int i=0;i<SIZE;i++){
		stud[i].print();
		cout<<endl; }

	return 0; 
}
