// file Student.java

import java.util.Vector;
import type.lang.*;

public class Student
{
   // constructor methods

   public Student(String studID, String studName)
   {  SE.require(studID.length() == REQUIRED_ID_LENGTH);
      for(int i = 0; i < studID.length(); i++)
      {  SE.require(Character.isDigit(studID.charAt(i)));
      }
      id = studID;
      name = studName;
      courses = new Vector();
      grades = new Vector();
      courseIndex = 0;
   }

   // instance methods

   // accessors

   public String getID()
   {  return id;
   }

   public String getName()
   {  return name;
   }

   public String getCourseGrade(String course)
    {  int i = courses.indexOf(course);
      if(i < 0)
      {  return null;
      }
      else
      {  return (String)grades.elementAt(i);
      }      
   }

   public String getFirstCourse()
   {  courseIndex = 0;
      return getNextCourse();
   }

   public String getNextCourse()
   {  if(courseIndex >= courses.size())
      {  return null;
      }
      else
      {  String course = (String)courses.elementAt(courseIndex);
         courseIndex++;
         return course;
      }
   }

   // mutators

   public boolean setCourseGrade(String course, String grade)
   {  if(grade.length() != 1 ||
         POSS_GRADES.indexOf(grade) < 0 ||
         course.length() != REQUIRED_COURSE_DIGITS)
      {  return false;
      }
      for(int i = 0; i <  REQUIRED_COURSE_DIGITS; i++)
      {  if(!Character.isDigit(course.charAt(i)))
         {  return false;
         }
      }
      int i = courses.indexOf(course);
      if(i < 0)
      {  courses.addElement(course);
         grades.addElement(grade.toUpperCase());
      }
      else
      {  grades.setElementAt(grade.toUpperCase(),i);
      }
      return true;
   }

   // specialized methods

   public double getGpa()
   {  double total = 0.0;
      for(int i = 0; i < courses.size(); i++)
      {  String grade = (String)grades.elementAt(i);
         if(grade.equals("A"))
         {  total += 5.0;
         }
         else if(grade.equals("B"))
         {  total += 4.0;
         }
         else if(grade.equals("C"))
         {  total += 3.0;
         }
         else if(grade.equals("D"))
         {  total += 2.0;
         }
         else if(grade.equals("E"))
         {  total += 1.0;
         }
      }
      if(courses.size() == 0)
      {  return 0.0;
      }
      else
      {  return total / courses.size();
      }
   }

   // standard methods

   public boolean equals(Student other)
   {  return (id.equals(other.id));
   }

   public String toString()
   {  return "COSC student: " + name;
   }

   // instance variables/attributes/fields

   private String id;
   private String name;
   private Vector courses;
   private Vector grades;
   private int courseIndex;

   // class/static variables/attributes/fields

   private static final int REQUIRED_ID_LENGTH = 9;
   private static final int REQUIRED_COURSE_DIGITS = 4;
   private static final String POSS_GRADES = "ABCDEFabcdef";

}// end class Student

