"""
Module with a simple Cornell Student class.

Class demonstrates class attributes, instance attributes,
a constructor, and class methods.

Authors: Anne Bracy (awb93), Daisy Fan (kdf4)
Date: April, 2020
"""

class Student():
    """An instance is a Cornell student

    Class attributes:
       max_credit: maximum number of credits

    Instance attributes:
        netID:     [str], 2-3 letters + 1-4 digits
        courses:   nested list [ [name0, n0], [name1, n1], ... ]
                    name is course name [str], n is number of credits [int]
        major:     declared major [str or None]
        n_credit:  total numnber of credits this semester [int]
                    must be <= max_credit
    """

    max_credit = 22

    def __init__(self, netID, courses=[], major=None):
        """Initializer: instance with netID, and courses which defaults empty

        netID:     [str], 2-3 letters + 1-4 digits
        courses:   nested list [ [name0, n0], [name1, n1], ... ]
                    name is course name [str], n is number of credits [int]
        major:     declared major [str or None]
        """
        assert type(netID) == str, "netID should be type str"
        assert netID[0].isalpha(), "netID should begin with a letter"
        assert netID[-1].isdigit(), "netID should end with an int"
        assert type(courses) == list, "courses should be a list"
        assert major==None or type(major)==str, "major should be None or a str"

        self.netID = netID
        self.courses = courses
        self.major = major
        self.n_credit = 0
        # Add up all the credits
        for one_course in courses:
            self.n_credit += one_course[1]

        assert self.n_credit <= Student.max_credit, "over credit limit"

    def enroll(self, new_course, n):
        """enrolls student in a new course only if they can add n credits to
            their schedule

        new_course: name of course [str]
        n: number of credits of new course [int]
        """
        if self.n_credit + n > Student.max_credit:
            print("I'm sorry but your schedule is full!")
        else:
            self.courses.append([new_course, n])
            self.n_credit += n
            print("welcome to "+new_course)
        print("currently have "+str(self.n_credit)+" credits")

    def drop(self, course_name):
        """removes course with name new_course from courses list

        course_name: name of course to drop [str]
        """
        for one_course in self.courses:
            if one_course[0] == course_name:
                self.n_credit -= one_course[1]
                self.courses.remove(one_course)
                print("Just dropped "+course_name)
        print("currently have "+str(self.n_credit)+" credits")

# Demo
s1 = Student("mep1")
print(s1.courses)
print(s1.n_credit)
s1.enroll("MATH 1920", 3)
s1.enroll("HADM 2200", 3)
s1.enroll("CS 1110", 4)
print(s1.courses)
s1.drop("MATH 1920")
print(s1.courses)
s1.major="Art"
print(s1.netID+" is in "+s1.major+" with "+str(s1.n_credit)+ " credits")
