/*------------------------------------------------------------------------------
Description:  Semester class for Assignment 1
Author: Chris Huyler
Language: C++
Name: Semester.h
Date: February 2, 2000
------------------------------------------------------------------------------*/
#include "Course.h"
#include <cstring.h>
#include <conio.h>

class Semester {
	public:
	 Semester();                                   // NULL constructor
    void ResetSemesterStats();						  // resets stats so they can be calculated
    void PrintSemesterGradeReport();				  // prints out report for semester
    void PrintSemesterTranscript();               // prints out transcript for semester

    void CalcSemesterStats();							  // calculates stats for semester

    void SetInitSemester();                       // sets all info for semester
    void Setterm();                               // sets term
    void Setyear();										  // sets year
    void Setcampus();									  // Sets campus
    void Setmajor();										  // Sets major
    void Addcourse();                             // Adds course to semester
    bool Removecourse();                          // removes course from semester
    int Getterm();                                // returns term (1,2 or 3)
    int& Getyear();                                // returns year
    string& Getcampus();                           // returns campus
    string& Getmajor();									  // returns major
    Course& Getcourse();                           // returns course
    float& Gettotal_credits();                     // returns total_credits
    float& Gettotal_earned_credits();
    float& Gettotal_GPA_credits();                 // returns total_GPA_credits
    float& Getgpa();                               // returns GPA
    float& Getquality_pts();                       // returns quality points

	private:
    int Findcourse();									  // searches schedule for course
 	 enum termDef{Fall,Spring,Summer};
    termDef term;
    int year;
    string campus;
    string major;
    float tr_credits;
    float total_credits;
    float total_earned_credits;
    float total_GPA_credits;
    float gpa;
    float quality_pts;
    Course schedule[10];
    int course_counter;
};

Semester::Semester(){
   course_counter = 0;
   ResetSemesterStats();
}
void Semester::ResetSemesterStats(){
   tr_credits = 0;
   total_credits = 0;
   total_earned_credits = 0;
   total_GPA_credits = 0;
   gpa = 0;
   quality_pts = 0;
}
void Semester::PrintSemesterGradeReport(){
	ResetSemesterStats();
   CalcSemesterStats();
   clrscr();
	cout << "\n\n------------------           ";
   switch(term){
   	case Fall: cout << "FALL";break;
      case Spring: cout << "SPRING";break;
      case Summer: cout << "SUMMER";break;
   }
   cout <<"  "<<year<<"           ------------------";
   cout <<"\n\n       DEPT COURSE-ID    NAME                    CREDITS  GRADE ";
   for(int i=0;i<course_counter;i++)
   	schedule[i].PrintCourseGradeReport();
   cout << "\n\n                        Term Totals                  ";
   cout << total_credits;
   cout << "\n\n\nPress space...";
   getch();
}
void Semester::PrintSemesterTranscript(){
   ResetSemesterStats();
   CalcSemesterStats();
	cout << "\n\n------------------           ";
   switch(term){
   	case Fall: cout << "FALL";break;
      case Spring: cout << "SPRING";break;
      case Summer: cout << "SUMMER";break;
   }
   cout <<"  "<<year<<"           ------------------";
	cout << "\n\nCAMPUS: " << campus;
   cout << "\n\nMAJOR:  " << major;
   for(int i=0;i<course_counter;i++)
   	schedule[i].PrintCourseTranscript();
   cout << "\n\n              Tr Cr  Cr Atmpt  Cr Earn  GPA Cr  Qual Pts     GPA";
   cout << "\n\nSEMESTER:     "<<tr_credits<<"        "<<total_credits<<"        "
        <<total_earned_credits<< "        "<< total_GPA_credits<<"     "<<quality_pts<< "   "<<gpa;


}
void Semester::CalcSemesterStats(){
	float temp_cr;
   for(int i=0; i<course_counter; i++){
      temp_cr = schedule[i].Getcredits();
      if(!schedule[i].GetPF() && !schedule[i].GetWD())
      	total_GPA_credits += temp_cr;
      if(!schedule[i].GetWD())
      	total_earned_credits += temp_cr;
      total_credits += temp_cr;
   	quality_pts += schedule[i].Getquality_pts();
   }
	gpa = quality_pts / total_GPA_credits;
}
void Semester::SetInitSemester(){
   clrscr();
   cout << "Enter data for semester...\n";
	Setterm();
   Setyear();
   Setcampus();
   Setmajor();
   char ans;
   cout << "\n\nAdd a course to schedule(y/n)?: ";
   cin >> ans;
   while(ans == 'y' && course_counter < 10){
   	Addcourse();
      cout << "\n\nAdd another course(y/n)?: ";
      cin >> ans;
   }
}
void Semester::Setterm(){
   int num;
	cout << "\nSelect term -\n  1) Fall\n  2) Spring\n  3) Summer";
   cout << "\nEnter number then press ENTER: ";
   cin >> num;
   switch(num) {
   	case 1: term = Fall; break;
      case 2: term = Spring; break;
      case 3: term = Summer; break;
   }
}
void Semester::Setyear(){
	cout << "\nEnter year of term(eg. ""2000""): ";
   cin >> year;
}
void Semester::Setcampus(){
	cout << "\nEnter campus (eg. ""IthacaCollege""): ";
   cin >> campus;
}
void Semester::Setmajor(){
	cout << "\nEnter major (eg. ""ComputerScience""): ";
   cin >> major;
}
void Semester::Addcourse(){
	schedule[course_counter].SetInitCourse();
   course_counter++;
}
bool Semester::Removecourse(){
   int temp = Findcourse();
   if(temp != (-1)){
   	schedule[temp]=schedule[course_counter];
      course_counter--;
      return (true);
   }
   else
   	return(false);
}
int Semester::Getterm(){
   int temp;
	switch(term) {
   	case Fall: temp=1; break;
      case Spring: temp=2; break;
      case Summer: temp=3; break;
   }
   return(temp);
}
int& Semester::Getyear(){
	return(year);
}
string& Semester::Getcampus(){
	return(campus);
}
string& Semester::Getmajor(){
	return(major);
}
float& Semester::Gettotal_credits(){
	return(total_credits);
}
float& Semester::Gettotal_earned_credits(){
	return(total_earned_credits);
}
float& Semester::Gettotal_GPA_credits(){
	return(total_GPA_credits);
}
float& Semester::Getgpa(){
	return(gpa);
}
float& Semester::Getquality_pts(){
	return(quality_pts);
}
Course& Semester::Getcourse(){
	return(schedule[Findcourse()]);
}
int Semester::Findcourse(){
	int temp_counter=(course_counter-1), temp_dept, temp_num;
	cout << "\nEnter deptartment number and";
   cout << "\ncourse number(eg 312 24500): ";
   cin >> temp_dept >> temp_num;
   bool found = false;
   while(temp_counter >= 0 && !found)
   	if (schedule[temp_counter].Getdept() == temp_dept)
         if(schedule[temp_counter].Getcourse_id() == temp_num)
         	found = true;
         else
            temp_counter--;
      else
      	temp_counter--;
   return(temp_counter);
}


