import json
from random import randint

Majors = ["computer science","computer engineering","electrical engineering","physics","biology","chemistry","film","math","history","leisure studies","anthropology","business","english lit"]
Grades = ['A','B','C','D','F']
GradeVals = {'A':4, 'B':3, 'C':2, 'D':1, 'F':0}
# GradeVals['B'] = 3   

class student:
    def __init__(self,n):
        self.name = n
        self.ID = 702000000 + randint(0,999999)
        self.major = Majors[randint(0,len(Majors)-1)]
        self.transcript = {}   # empty hashtable  "csc15":'B'
    # constructor

    ##### methods:

    def changemajor(self,nm):
        self.major = nm
    #

    def addcourse(self,course,grade):
        self.transcript[course] = grade
    #

    def gpa(self):
        n = len(self.transcript)
        if n==0: return randint(0,400)/100.0
        ax = 0  # sum of grades
        for course in self.transcript:
            ax += GradeVals[self.transcript[course]]
        return int(ax*100/n + 0.5)/100.0  # rounds off

    def tostring(self):
        return self.name+", I D number "+str(self.ID)+", majors in "+self.major+" and has a gpa of "+str(self.gpa())+"."
    def __str__(self):
        return self.tostring()

    def serialize(self):  # produce hashtable/returns json string
        self.srep = {"Name":self.name, "ID":self.ID, "Major":self.major}
        self.srep["Transcript"] = self.transcript
        self.srep["CLASS"] = "student"
        return json.dumps(self.srep)
    #serialize

    def deserialize(self,jreps): # reconstruct from dict representation
        jrep = json.loads(jreps)
        #print(type(jrep))
        if "CLASS" in jrep and jrep["CLASS"]=="student":
            self.name = jrep["Name"]
            self.ID = jrep["ID"]
            self.major = jrep["Major"]
            self.transcript = jrep["Transcript"]
    #deserialize
#class student

"""
#s1 = student("matt")
#print(s1.tostring())
#print(s1)
Roster = ["Brandon","Warlyn","Jayson","Kamleen","Vivian","Matt","Michael","Jonila","John","Brian","KaiRui","Matthew"]


Students = []
for name in Roster: Students.append( student(name) )
#for stu in Students: print(stu)

Courses = ["csc14","csc15","math71","eng1","phys11"]
# construct random transcript:
for s in Students:
  for course in Courses:
      s.addcourse(course,Grades[randint(0,len(Grades)-1)])    
# random courses
#s1 = Students[5]
#if s1.major!="cs": s1.changemajor("cs")

#print(s1)
#print(s1.transcript)

#print(s1.serialize())

## Write json to file
fd = open("stuinfo.txt","w")
wrapper = {}  # json wrapper for all students
for s in Students:
    wrapper[s.name] = s.serialize()
json.dump(wrapper,fd)
fd.close()
"""

## read json from string, reconstruct dict of student objects:
def readstus(bigstring):
  Stus = {}
  jrep = json.loads(bigstring)   # get wrapper table
  for name in jrep:
    s = student(name)
    s.deserialize(jrep[name])  # jrep[name] is a string
    Stus[name] = s
  #for each key name in dict jrep
  return Stus
#readstus


