/*
File name: hw6.cpp
Author: Bo Bayles
E-mail address: bmb3h6@umr.edu  
Description: This program accepts user input for a course, number of hours,
  and grades, then calculates the user's GPA.
*/

#include "hw6.h"
#include <string>
#include <iostream>
using namespace std;

struct Course
{
  string cName;
  int hours;
  char grade;
};

char DisplayMenu(int iClasses, int iHours, float fGpa);
void AddCourse(Course courses[], int iClasses);
void ModCourse(Course courses[], int iClasses);
void DispCourses(Course courses[], int iClasses);
int CalcHours(Course courses[], int iClasses, int iHours);
float CalcGpa (Course courses[], int iClasses, int iHours);


int main()
{
  int iHours = 0, iClasses = 0;
  float fGpa = 0;
  char cMenu;
  Course courses[13];
  
  do
  {
    iHours = CalcHours (courses, iClasses, iHours);
    fGpa = CalcGpa(courses, iClasses, iHours);
    
    cMenu = DisplayMenu(iClasses, iHours, fGpa);
    
    switch (cMenu)
    {
      case '1':
            AddCourse(courses, iClasses);
            iClasses++;
            break;
      case '2':
            DispCourses(courses, iClasses);
            break;
      case '3':
            ModCourse(courses, iClasses);
            break;
      case '4':
            break;
    }
  }  
  while(cMenu != '4');     


return 0;
}

char DisplayMenu(int iClasses, int iHours, float fGpa)
{
  char cMenu;

  cout << endl << "Number of courses: " << iClasses
       << "\t" << "Hours: " << iHours
       << "\t" << "GPA: " << fGpa << endl;

  cout << "\t \t MENU" << endl
       << "\t 1) Add Course" << endl
       << "\t 2) Display Courses" << endl
       << "\t 3) Modify Course" << endl
       << "\t 4) Quit" << endl
       << "Your choice (1-4): ";
  cin >> cMenu;
    
  return cMenu;
}

void AddCourse(Course courses[], int iClasses)
{
  cout << endl << "Enter the name of the course (no spaces): ";
  cin >> courses[iClasses].cName;
  
  do
  {
    cout << "Enter the number of hours for the course: ";
    cin >> courses[iClasses].hours;
    
    if ((courses[iClasses].hours < 0) || (courses[iClasses].hours > 13))
      cout << "Invalid entry." << endl;
  }  
  while ((courses[iClasses].hours < 0) || (courses[iClasses].hours > 13));
  
  do
  {
    cout << "Enter your grade in the course (A, B, C, D, F): ";
    cin >> courses[iClasses].grade;
    
    if ((courses[iClasses].grade < 'A') ||
        (courses[iClasses].grade > 'F') ||
        (courses[iClasses].grade == 'E'))
      cout << "Invalid entry." << endl;
  }  
  while ((courses[iClasses].grade < 'A') ||
        (courses[iClasses].grade > 'F') ||
        (courses[iClasses].grade == 'E'));
  
  return;
}

void DispCourses(Course courses[], int iClasses)
{
  for (int i = 0; i < iClasses; i++)
  {
    cout << endl << (i+1) << ") Name: \t" << courses[i].cName << endl
       << "   Hours: \t" << courses[i].hours << endl
       << "   Grade: \t" << courses[i].grade << endl;
  }

  return;
}

void ModCourse(Course courses[], int iClasses)
{
  int iWhichCourse = 0;
    
  cout << endl << "Modify Course:" << endl;
  DispCourses(courses, iClasses);
  cout << endl << "Which course do you want to modify?: ";
  
  cin >> iWhichCourse;
  iWhichCourse--;
  
  AddCourse(courses, iWhichCourse);
  
  return;
}

int CalcHours(Course courses[], int iClasses, int iHours)
{
  iHours = 0;
    
  for (int i = 0; i < iClasses; i++)
  {
    iHours = iHours + courses[i].hours;
  }

  return iHours;
}

float CalcGpa (Course courses[], int iClasses, int iHours)
{
  int iMultiplier = 0;
  float fGpa = 0;
  
    for (int i = 0; i < iClasses; i++)
  {
    switch (courses[i].grade)
    {
    case 'A':
            iMultiplier = 4;
            break;
    case 'B':
            iMultiplier = 3;
            break;
    case 'C':
            iMultiplier = 2;
            break;
    case 'D':
            iMultiplier = 1;
            break;
    case 'F':
            iMultiplier = 0;
            break;
    }
    
    fGpa = fGpa + (courses[i].hours * iMultiplier);
  }
  if (iHours != 0)
    fGpa = fGpa / iHours;
  
  return fGpa;
}

