// Name: Kalaivani A/P Subramaniam (A20EC0056)
// Name: Tan Ming Hui (A20EC0155)
// Date : 2021/01/30

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
using namespace std;

struct Annual
{
		string name;
};

struct Annual1
{
	long int Q1,Q2,Q3,Q4;
};

struct Annual3
{
	Annual1 tour;
};

struct Annual2
{
	Annual1 tour;
};

// function prototype
void getData(char*, struct Annual[], struct Annual1[]);
int visitorByQuarters(struct Annual1[], struct Annual3[], int& , int&, int&, int&, int&, int&);
int totalVisitorByAttraction(struct Annual1[], struct Annual2[], int[], int&, int&, int&);
void printReport(struct Annual[] ,struct Annual1[],int,int,int,int,int [], int,int,int,int,int);

int main(){
	char filename[20]= "Figure2.txt";
	Annual attractionName[9];
	Annual1 tour[9];
	Annual3 visitorsByQuarters[9];
	Annual2 totalVisitors[9];
	int k, m;
	int q1=0,q2=0,q3=0,q4=0, total[9] ,t=0, maxQuarter=0, maxAttraction=0;
	getData(filename,attractionName, tour);
	visitorByQuarters(tour, visitorsByQuarters, q1,q2,q3,q4, maxQuarter,k);
	totalVisitorByAttraction(tour, totalVisitors,total,t, maxAttraction,m);
	printReport(attractionName,tour,q1,q2,q3,q4,total,t, maxQuarter,k,maxAttraction,m);

	return 0;
}

void getData(char* filename, struct Annual attractionName[], struct Annual1 tour[] )
{
	ifstream inp1;
	inp1.open(filename);
	if (!inp1.is_open())
	{
		cout << "The file cannot be opened, terminating..." << endl;
		exit (1);
	}
	
	for(int i=0; i<9;i++)
	{
		inp1 >> tour[i].Q1;
		inp1 >> tour[i].Q2;
		inp1 >> tour[i].Q3;
		inp1 >> tour[i].Q4 ;
		getline(inp1, attractionName[i].name);
	}

	inp1.close();
}
	
int visitorByQuarters(struct Annual1 tour[], struct Annual3 visitorsByQuarter[], int &q1 , int &q2, int &q3, int &q4, int &maxQuarter, int &k)
{
	for(int i=0; i<9;i++)
	{
		q1+= tour[i].Q1;
		q2+= tour[i].Q2;
		q3+= tour[i].Q3;
		q4+= tour[i].Q4;
	}
	// find the maximum total visitor for the  quarters
	if ((q1 > q2) && (q1>q3) && (q1>q4))
	{
		maxQuarter=q1;
		k=1;
	}
	
	else if ((q2>q1)&& (q2>q3)&& (q2>q4))
	{
		maxQuarter=q2;
		k=2;
	}
	
	else if ((q3>q1)&& (q3>q2)&& (q3>q4))
	{
		maxQuarter=q3;
		k=3;
	}
	
	else 
	{
		maxQuarter=q4;
		k=4;
	}
	
	return q1,q2,q3,q4,maxQuarter,k;
}

int totalVisitorByAttraction(struct Annual1 tour[], struct Annual2 totalVisitors[], int total[], int &t, int &maxAttraction, int& m)
{	
	// find the maximum visitors by attraction 
	for(int i=0;i<9;i++)
	{
		total[i]= tour[i].Q1+tour[i].Q2+tour[i].Q3+tour[i].Q4;
		t+= total[i];	
		if(total[i]> maxAttraction)
		{
			maxAttraction=total[i];
			m=i;
		}
	}
		return t,maxAttraction,m;
}


void printReport(struct Annual attractionName[] ,struct Annual1 tour[],int q1,  int q2, int q3, int q4, int total[], int t, int maxQuarter, int k, int maxAttraction, int m)
{
	cout << "-----------------Annual Malaysian Tourism Report-------------------"<<endl;
	cout<<left;
	cout << setw(20) <<" Attraction"
		 << setw(10) <<"QT1('09)"
		 << setw(10) <<"QT2('09)"
		 << setw(10) <<"QT3('09)"
		 << setw(10) <<"QT4('09)"	
		 << setw(10) <<"Total" << endl;
		 
	for(int i=0;i<9;i++)
	{
	cout << setw(20) << attractionName[i].name 
		 << setw(10) << tour[i].Q1
		 << setw(10) << tour[i].Q2 
		 << setw(10) << tour[i].Q3 
		 << setw(10) << tour[i].Q4 
		 << setw(10) << total[i] <<endl;
	}
		 
	cout << setw(20) << " Total " 
		 << setw(10) << q1 
		 << setw(10) << q2 
		 << setw(10) << q3 
		 << setw(10) << q4
		 << setw(10) << t<< endl;
	cout << endl;
	cout << "Max Number of Visitor by Attraction: Name = " << attractionName[m].name << ", Number of Visitor = " << maxAttraction << endl;
	cout << "Max Number of Visitor by Quarter: Quarter =" << k  <<", Number of Visitor = " << maxQuarter <<endl;
	cout << "------------------------------------------------------------------------" << endl;	
}
