//MUHAMMAD ARIFF FANSURI ABDUL RAZAK BIN ROHAIZAD , THANNEERMALAI A/L UDAYAPPAN
//A19EC0194 , A19EC0171


#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>

#define MAX_SIZE 20
#define SS 10

using namespace std;

void getInput(string (&name)[MAX_SIZE],int (&intake)[MAX_SIZE],int (&enrol)[MAX_SIZE],int (&output)[MAX_SIZE]){
	ifstream fileRead;
	fileRead.open("A2_Q1_input.txt");
	int n=0,in1,in2,in3;
	string input;
	
	if(fileRead.fail()){
		cout<<"File ops failed. Please check if the file exists in the user directory."<<endl;
	}else{
		while(!fileRead.eof()){
			in1=in2=in3=0;
			input="null";
			getline(fileRead,input,' ');
			fileRead>>in1;
			fileRead>>in2;
			fileRead>>in3;
			if((input!="null")&&(in1!=0)&&(in2!=0)&&(in3!=0)){
				name[n]=input;
				intake[n]=in1;
				enrol[n]=in2;
				output[n]=in3;
			}
			n++;
		}
	}
	
	fileRead.close();
}

int calTotal(int array[]){
	int sum=0;
	for(int i=0;i<MAX_SIZE;++i){
		sum+=array[i];
	}
	return sum;
}

int getLowest(int array[]){
	int low=array[0],arraypos=0;
	for(int i=0;i<MAX_SIZE;++i){
		if(low>array[i]){
			low=array[i];
			arraypos=i;
		}
	}
	return arraypos;
}

int getHighest(int array[]){
	int high=array[0],arraypos=0;
	for(int i=0;i<MAX_SIZE;++i){
		if(high<array[i]){
			high=array[i];
			arraypos=i;
		}
	}
	return arraypos;
}

void spewOut(string (name)[MAX_SIZE],int (intake)[MAX_SIZE],int (enrol)[MAX_SIZE],int (output)[MAX_SIZE]){//left is the lowest highest and range funcs.
	ofstream outputFile;
	
	//calculate the variables
	int total_intake,total_enrol,total_output;
	int low_intake,low_enrol,low_output;
	int high_intake,high_enrol,high_output;
	int range_intake,range_enrol,range_output;
	float average_intake,average_total,average_output;
	string name_low1,name_low2,name_low3,name_high1,name_high2,name_high3;
	
	total_intake=calTotal(intake);
	total_enrol=calTotal(enrol);
	total_output=calTotal(output);
	
	low_intake=intake[getLowest(intake)];
	low_enrol=enrol[getLowest(enrol)];
	low_output=output[getLowest(output)];
	
	high_intake=intake[getHighest(intake)];
	high_enrol=enrol[getHighest(enrol)];
	high_output=output[getHighest(output)];
	
	range_intake=high_intake-low_intake;
	range_enrol=high_enrol-low_enrol;
	range_output=high_output-low_output;
	
	name_low1=name[getLowest(intake)];
	name_low2=name[getLowest(enrol)];
	name_low3=name[getLowest(output)];
	name_high1=name[getHighest(intake)];
	name_high2=name[getHighest(enrol)];
	name_high3=name[getHighest(output)];
	
	average_intake=(static_cast<float>(calTotal(intake))/20);
	average_total=(static_cast<float>(calTotal(enrol))/20);
	average_output=(static_cast<float>(calTotal(output))/20);
	
	outputFile.open("A2_Q1_output.txt");
	outputFile<<"NUMBER OF STUDENTS' INTAKE, ENROLMENT AND OUTPUT IN PUBLIC UNIVERSITIES (2015)\n"<<endl;
	outputFile<<"---------------------------------------------------------------"<<endl;
	outputFile<<"UNIVERSITY    INTAKE  ENROLMENT   OUTPUT"<<endl;
	outputFile<<"---------------------------------------------------------------"<<endl;
	for(int i=0;i<MAX_SIZE;++i){
		outputFile<<left<<setw(SS)<<name[i]<<right<<setw(SS)<<intake[i]<<setw(SS)<<enrol[i]<<setw(SS)<<output[i];
	}
	outputFile<<endl<<"---------------------------------------------------------------"<<endl;
	outputFile<<"TOTAL"<<setw(SS)<<total_intake<<setw(SS)<<total_enrol<<setw(SS)<<total_output<<endl;
	outputFile<<"AVERAGE"<<setw(SS)<<average_intake<<setw(SS)<<average_total<<setw(SS)<<average_output<<endl;
	outputFile<<"---------------------------------------------------------------"<<endl<<endl;
	outputFile<<"LOWEST NUMBER OF STUDENTS' INTAKE = "<<low_intake<<" ("<<name_low1<<")"<<endl;
	outputFile<<"LOWEST NUMBER OF STUDENTS' ENROLMENT = "<<low_enrol<<" ("<<name_low2<<")"<<endl;
	outputFile<<"LOWEST NUMBER OF STUDENTS' OUTPUT = "<<low_output<<" ("<<name_low3<<")"<<endl<<endl;
	
	outputFile<<"THE HIGHEST NUMBER OF STUDENTS' INTAKE = "<<high_intake<<" ("<<name_high1<<")"<<endl;
	outputFile<<"THE HIGHEST NUMBER OF STUDENTS' ENROLMENT = "<<high_enrol<<" ("<<name_high2<<")"<<endl;
	outputFile<<"THE HIGHEST NUMBER OF STUDENTS' OUTPUT = "<<high_output<<" ("<<name_high3<<")"<<endl<<endl;
	
	outputFile<<"THE RANGE OF NUMBER OF STUDENTS' INTAKE = "<<range_intake<<endl;
	outputFile<<"THE RANGE OF NUMBER OF STUDENTS' ENROLMENT = "<<range_enrol<<endl;
	outputFile<<"THE RANGE OF NUMBER OF STUDENTS' OUTPUT = "<<range_output<<endl;
	
	outputFile.close();
}

int main(){
	string name[MAX_SIZE];
	int intake[MAX_SIZE],enrol[MAX_SIZE],output[MAX_SIZE];
	
	getInput(name,intake,enrol,output);
	
	//diagnose any array using this
	
	/*
	for(int n=0;n<MAX_SIZE;++n){
		cout<<name[n]<<" "<<intake[n]<<" "<<enrol[n]<<" "<<output[n]<<endl;
	}
	*/
	
	spewOut(name,intake,enrol,output);
	return 0;
}
