//Name: Muhammad Aiman Bin Abdul Razak
//Matrics No: A20EC0082
//Programming Technique II Assignment 2

#include <iostream>
#include <string>
#include <iomanip>
#include <vector>

using namespace std;

class Time{
	private:
		int hour, minute;
	public:
		Time(int temphour, int tempminute){
			hour=temphour;
			minute=tempminute;
		}
		int getHour(){
			return hour;
		}
		int getMinute(){
			return minute;
		}
};

class Passenger{
	private:
		string name;
		int age;
	public:
		Passenger(string tempname, int tempage){
			name=tempname;
			age=tempage;			
		}
		virtual void printDetails(){
			cout<<"Name:\t"<<name;
			cout<<"\tAge:\t"<<age;
		}
};

class Kids : public Passenger{
	private:
		string parentName;
	public:
		Kids(string tempname, int tempage, string tempparentName) : Passenger(tempname, tempage){
			parentName=tempparentName;
		}
		void printDetails(){
			Passenger::printDetails();
			cout<<"\tParents Name:\t"<<parentName<<endl;
		}
};

class Adults : public Passenger{
	private:
		string job;
	public:
		Adults(string tempname, int tempage, string tempjob) : Passenger(tempname, tempage){
			job=tempjob;
		}
		void printDetails(){
			Passenger::printDetails();
			cout<<"\tJob Title\t"<<job<<endl;
		}
};

class Flight{
	private:
		string id, destination;
		Time *depart, *arrival;
		vector<Passenger*>passengerList;
	public:
		Flight(string tempid, string tempdestination, Time *tempdepart, Time *temparrival){
			id=tempid;
			destination=tempdestination;
			depart=tempdepart;
			arrival=temparrival;
		}
		void addPassenger(Passenger* temppassenger){
			passengerList.push_back(temppassenger);
		}
		void printInfo(){
			int numAdults=0, numKids=0;
			cout<<"Flight Number:\t"<<id<<endl;
			cout<<"Destination:\t"<<destination<<endl;
			cout<<"Departure:\t"<<depart->getHour()<<":"<<setw(2)<<setfill('0')<<depart->getMinute()<<setfill(' ')<<endl;
			cout<<"Arrival:\t"<<arrival->getHour()<<":"<<setw(2)<<setfill('0')<<arrival->getMinute()<<setfill(' ')<<endl<<endl;
			cout<<"Number of Passengers:\t"<<passengerList.size()<<endl;
			
			for (int i=0; i<passengerList.size(); i++){
				if (dynamic_cast<Adults*>(passengerList.at(i)))
					numAdults+=1;
				else
					numKids+=1;
			}
			
			cout<<"Number of Adults:\t"<<numAdults<<endl;
			cout<<"Number of Kids:\t\t"<<numKids<<endl<<endl;
			cout<<"Passengers Details:"<<endl;
			for (int i=0; i<passengerList.size(); i++){
				passengerList[i]->printDetails();
			}
		}
};

int main(){
	Time maindepart(8,10);
	Time mainarrival(9,00);
	Flight flight("NAS7921", "Johore Bahru", &maindepart, &mainarrival);
	Adults adult1("Ali", 34, "Lecturer");
	Adults adult2("Goh", 25, "Student");
	Kids kid1("Azmi", 3, "Ali");
	flight.addPassenger(&adult1);
	flight.addPassenger(&adult2);
	flight.addPassenger(&kid1);
	flight.printInfo();
}
