// Name: Gui Yu Xuan
// Matric ID: A20EC0039
// Section: 01


#include <iostream>
#include <string>
#include <vector>
#include <iomanip>

using namespace std;

class Time
{
	private:
		int hour;
		int minute;
	
	public:
		Time ()
		{
			
		}
		
		Time (int tHour, int tMinute)
		{
			hour = tHour;
			minute = tMinute;
		}
		
		int getHour ()
		{
			return hour;
		}
		
		int getMinute ()
		{
			return minute;
		}
};

class Passenger
{
	protected:
		string name;
		int age;
	
	public:
		Passenger (string passName, int passAge)
		{
			name = passName;
			age = passAge;
		}
		
		virtual void printDetails ()
		{
	
		} 
};

class Kids : public Passenger
{
	private:
		string parentName;
	
	public:
		Kids (string passName, int passAge, string pName) : Passenger (passName, passAge)
		{
			parentName = pName;
		}
		
		void printDetails()
		{
			cout << "Name:\t " << name << "\tAge:\t " << age << "\tParents Name:\t " << parentName << endl;
		}
};

class Adults : public Passenger
{
	private:
		string job;
	
	public:
		Adults (string passName, int passAge, string passJob) : Passenger (passName, passAge)
		{
			job = passJob;
		}
		
		void printDetails ()
		{
			cout << "Name:\t " << name << "\tAge:\t " << age << "\tJob Title:\t " << job << endl;
		}
};

class Flight
{
	private:
		string id;
		string destination;
		Time *depart;
		Time *arrival;
		vector <Passenger*> passengerList;
	
	public:
		Flight (string flightId, string flightDestination, Time *flightDepart, Time *flightArrival) 
		{
			id = flightId;
			destination = flightDestination;
			depart = flightDepart;
			arrival = flightArrival;
		}
		
		void printInfo()
		{
			int numOfAdults = 0;
			int numOfKids = 0;
			 
			cout << "Flight Number: " << id << endl;
			cout << "Destination: " << destination << endl;
			
			cout << setfill ('0');
			
			cout << "Departure: " << depart->getHour() << ":" << setw(2) << depart->getMinute() << endl;
			cout << "Arrival: " << arrival->getHour() << ":" << setw(2) << arrival->getMinute() << endl;
			
			cout << endl;
						
			for (int i=0; i<passengerList.size(); i++)
			{
				if (dynamic_cast<Adults*> (passengerList.at(i)))
				{
					
					numOfAdults++;
					
				}else {
					
					numOfKids++;
				}
			}
				
			cout << "Number of Passengers: " << passengerList.size() << endl;	
			cout << "Number of Adults: " << numOfAdults << endl;
			cout << "Number of Kids: " << numOfKids << endl;
			
			cout << endl;
			
			cout << "Passenger Details: " << endl;
			for (int i=0; i<passengerList.size(); i++)
			{
				passengerList[i]->printDetails();
			}
			
		}
		
		void addPassenger (Passenger *p)
		{
			passengerList.push_back(p);
		}
};

int main ()
{	
	Time depart1(8, 10);
	Time arrival1(9, 00);
	
	Flight flight1 ("NAS7921", "Johore Bahru", &depart1, &arrival1);
	
	Adults adults1 ("Ali", 34, "Lecture");
	Adults adults2 ("Goh", 25, "Student");
	
	Kids kids1 ("Azmi", 3, "Ali");
	
	flight1.addPassenger(&adults1);
	flight1.addPassenger(&adults2);
	flight1.addPassenger(&kids1);
	
	flight1.printInfo();
	

	
}
