import pickle
import os
class School:
    def __init__(self, city):
        self.city = city
        self.courses = {}
        self.teacheres = {}
        self.students = {}
        self.classes = {}
class Student:
    def __init__(self, name, belong_school, belong_class):
        self.name = name
        self.password = '123456'
        self.school = belong_school
        self.classes = belong_class
    def check_course(self):
        all_classes = self.check_class()
        print(all_classes.courses)
    def check_class(self):
        print(self.classes)
        return self.classes
class Course:
    def __init__(self, name, period, price, schoolobj):
        self.name = name
        self.period = period
        self.price = price
        self.school = schoolobj
class Teacher:
    def __init__(self, name, schoolobj):
        self.username = name
        self.password = "123456"
        self.school = schoolobj
    def check_class(self):
        if os.path.exists('classes.pkl'):
            teach_classes = []
            with open('classes.pkl', 'rb') as f_teacher:
                classes_ret = pickle.load(f_teacher)
                all_teachers = classes_ret.teachers
                for key in all_teachers:
                    if all_teachers[key] == self.username:
                        teach_classes.append(classes_ret.name)
            print('你教学的班级: ', teach_classes)
            f.close()
            return teach_classes
        else:
            print('目前管理员还未创建班级,请通知管理员创建班级')
    def check_courses(self):
        if os.path.exists('classes.pkl'):
            teach_courses = []
            with open('classes.pkl', 'rb') as f_teachers:
                classes_ret = pickle.load(f_teachers)
                all_teachers = classes_ret.teachers
                for key in all_teachers:
                    if all_teachers[key] == self.username:
                        teach_courses.append(classes_ret.name)
            print('你教学的课程: ', teach_courses)
            f.close()
        else:
            print('目前管理员还未创建课程,请通知管理员创建课程')
    def check_students(self):
        # 先找到自己负责的班级
        # 然后列出该班级中所有的学生
        result = {}
        all_classes = self.check_class()
        with open('students.pkl', 'rb') as f:
            all_students = pickle.load(f)
            for classes in all_classes:
                result[classes] = []
                for student in all_students:
                    if student.classes == classes:
                        result[classes].append(student.name)
        return result
    def change_score(self, student, course, score):
        # 从pickle文件中找到该学生,然后修改其成绩
        all_students = self.check_students()
        for st in all_students:
            if st == student:
                # {"name": {"linux": 80, "python": 90}}
                st[course][score] = score
                break
        print("修改成功!")
class Classes:
    def __init__(self, name, courses, teacheres):
        self.name = name
        self.courses = courses
        self.teachers = teacheres
class Admin:
    def __init__(self, namename, password):
        self.namename = namename
        self.password = password
    @staticmethod
    def create_school(city):
        school = School(city)
        with open('school.pkl', 'wb') as f:
            pickle.dump(school, f)
        print('{}校区创建成功!'.format(city))
    @staticmethod
    def create_teacher(name, password):
        teacherobj = Teacher(name, password)
        with open('teacher.pkl', 'wb') as f:
            pickle.dump(teacherobj, f)
        print('{}老师创建成功'.format(name))
    @staticmethod
    def create_class(classname, course, teacher):
        classobj = Classes(classname, course, teacher)
        with open('classes.pkl', 'wb') as f:
            pickle.dump(classobj, f)
            f.close()
        print('{}班级创建成功!'.format(classname))
    @staticmethod
    def create_course(coursename, period, price, school_name):
        courseobj = Course(coursename, period, price, school_name)
        with open('courses.pkl', 'wb') as f:
            pickle.dump(courseobj, f)
            f.close()
        price('{}课程创建成功!'.format(coursename))
if __name__ == '__main__':
    print("=========================================")
    print("========== 欢迎使用学校管理系统 =========")
    print("=========================================")
    # 启动时,初始化管理员的账号密码,然后告诉管理员,让他们自己去操作即可
    admins_dic = {}
    admin1 = Admin('admin1', '123456')
    admin2 = Admin('admin2', '123456')
    admins_dic['admin1'] = admin1
    admins_dic['admin2'] = admin2
    
    with open('admins.pkl', 'wb') as f:
        pickle.dump(admins_dic, f)
    f.close()
    
    while True:
        print("1.管理员")
        print("2.讲师")
        print("3.学员")
        print("退出请输入Exit!")
        option_id = input("请选择你的角色: ")
        if option_id == "1":
            i = 0
            while i < 3:
                username = input('请输入账号: ')
                password = input('请输入密码: ')
                if username == 'admin' and password == '123456':
                    print('管理员{}登录成功,恭喜!'.format(username))
                    while True:
                        print("1. 创建学校")
                        print("2. 创建课程")
                        print("3. 创建讲师")
                        print("4. 创建班级")
                        print("5. 创建学员")
                        print("6. 退出")
                        op_id = input("请选择你要进行的操作: ")
                        # 这个地方应该调用对象的方法来操作
                        if op_id == "1":
                            school_dic = {}
                            while True:
                                city_name = input("请输入校区所在地: ")
                                school = School(city_name)
                                school_dic[city_name] = school
                                print("{}校区创建成功!".format(city_name))
                                ret = input("你还要创建学校吗? Y/N: ")
                                if ret.lower() == 'n':
                                    break
        
                            with open('school.pkl', 'wb') as f:
                                pickle.dump(school_dic, f)
                            f.close()
                        elif op_id == "2":
                            courses_dic = {}
                            while True:
                                course_name = input("请输入课程名: ")
                                course_price = input("请输入课程价格: ")
                                course_period = input("请输入课程周期: ")
                                print("当前的学校有: ")
                                with open('school.pkl', 'rb') as f:
                                    ret = pickle.load(f)
                                    for key in ret:
                                        print(key)
                                course_school = input("请输入课程所属学校: ")
        
                                course = Course(course_name, course_period, course_price, course_school)
                                courses_dic[course_name] = course
                                print("{}课程创建成功!".format(course_name))
                                ret = input("你还要创建课程吗? Y/N: ")
                                if ret.lower() == 'n':
                                    break
                                f.close()
                            with open('courses.pkl', 'wb') as f:
                                pickle.dump(courses_dic, f)
                            f.close()
                        elif op_id == "3":
                            teachers_dic = {}
                            while True:
                                teacher_name = input("请输入讲师的名字: ")
        
                                print("当前的学校有: ")
                                with open('school.pkl', 'rb') as f:
                                    ret = pickle.load(f)
                                    for key in ret:
                                        print(key)
                                teacher_school_name = input("请输入讲师所属学校: ")
                                teacher_school_obj = ret[teacher_school_name]
        
                                teacher = Teacher(teacher_name, teacher_school_obj)
        
                                teachers_dic[teacher_name] = teacher
        
                                print("{}讲师创建成功!".format(teacher_name))
                                ret = input("你还要创建讲师吗? Y/N: ")
                                if ret.lower() == 'n':
                                    break
        
                                f.close()
        
                            with open('teachers.pkl', 'wb') as f:
                                pickle.dump(teachers_dic, f)
                            f.close()
                        elif op_id == "4":
                            classes_dic = {}
                            teacher_list = []
                            courses_list = []
                            while True:
                                class_name = input("请输入班级的名字: ")
        
                                print("当前的讲师有: ")
                                with open('teachers.pkl', 'rb') as f:
                                    ret = pickle.load(f)
                                    for key in ret:
                                        print(key)
                                teacher_name = input("请问要让哪位/哪些讲师负责该班级(多个讲师以逗号隔开): ")
                                if ',' in teacher_name:
                                    for teacher in teacher_name.split(','):
                                        if teacher != '':
                                            techer_obj = ret[teacher]
                                            teacher_list.append(techer_obj)
                                else:
                                    techer_obj = ret[teacher_name]
                                    teacher_list.append(techer_obj)
        
                                f.close()
        
                                print("当前的课程有: ")
                                with open('courses.pkl', 'rb') as f:
                                    ret = pickle.load(f)
                                    for key in ret:
                                        print(key)
                                courses_name = input("请问要让该班级学哪些课程(多个课程以逗号隔开): ")
                                if ',' in courses_name:
                                    for course in courses_name.split(','):
                                        if course != '':
                                            course_obj = ret[course]
                                            courses_list.append(course_obj)
                                else:
                                    course_obj = ret[courses_name]
                                    courses_list.append(course_obj)
        
                                f.close()
        
                                class_obj = Classes(class_name, courses_list, teacher_list)
        
                                classes_dic[class_name] = class_obj
        
                                print("{}班级创建成功!".format(class_name))
                                ret = input("你还要创建班级吗? Y/N: ")
                                if ret.lower() == 'n':
                                    break
        
                                f.close()
        
                            with open('classes.pkl', 'wb') as f:
                                pickle.dump(classes_dic, f)
                            f.close()
                        elif op_id == "5":
                            students_dic = {}
                            while True:
                                student_name = input("请输入学生的名字: ")
        
                                print("当前的学校有: ")
                                with open('school.pkl', 'rb') as f:
                                    ret = pickle.load(f)
                                    for key in ret:
                                        print(key)
                                student_school_name = input("请输入学生所属学校: ")
                                student_school_obj = ret[student_school_name]
                                f.close()
        
                                print("当前的班级有: ")
                                with open('classes.pkl', 'rb') as f:
                                    ret = pickle.load(f)
                                    for key in ret:
                                        print(key)
                                student_class_name = input("请输入学生所属班级: ")
                                student_class_obj = ret[student_class_name]
                                f.close()
        
                                student = Student(student_name, student_school_obj, student_class_obj)
        
                                students_dic[student_name] = student
        
                                print("{}学生创建成功!".format(student_name))
                                ret = input("你还要创建学生吗? Y/N: ")
                                if ret.lower() == 'n':
                                    break
        
                                f.close()
        
                            with open('students.pkl', 'wb') as f:
                                pickle.dump(students_dic, f)
                            f.close()
                        elif op_id == "6":
                            break
                        else:
                            print("你的选择无效,请重新选择!")
                            
                print('账号密码错误, 请重试!')
                i += 1
                print('剩余次数: {}'.format(3 - i))
            break
        elif option_id == "2":
            i = 0
            while i < 3:
                username = input('请输入账号: ')
                password = input('请输入密码: ')
        
                if (username == 'yang' or username == 'wang') and password == '123':
                    print('讲师{}登录成功,恭喜!'.format(username))
                    with open('teachers.pkl', 'rb') as f:
                        ret = pickle.load(f)
                        teacher_obj = ret[username]
                    while True:
                        print("1. 查看班级")
                        print("2. 查看课程")
                        print("3. 查看学员")
                        print("4. 修改学员分数")
                        print("5. 退出")
                        op_id = input("请选择你要进行的操作: ")
                        if op_id == "1":
                            teacher_obj.check_class()
                        elif op_id == "2":
                            teacher_obj.check_courses()
                        elif op_id == "3":
                            teacher_obj.check_students()
                        elif op_id == "4":
                            teacher_obj.change_score()
                        elif op_id == "5":
                            break
                        else:
                            print("你的输入无效,请重新输入")
                            break
                print('账号密码错误, 请重试!')
        
                i += 1
                print('剩余次数: {}'.format(3 - i))
            break
        elif option_id == "3":
            i = 0
            while i < 3:
                username = input('请输入账号: ')
                password = input('请输入密码: ')
                if (username == 'zhangsan' or username == 'lisi') and password == '123':
                    print('学员{}登录成功,恭喜!'.format(username))
                    with open('students.pkl', 'rb') as f:
                        ret = pickle.load(f)
                        student_obj = ret[username]
                    while True:
                        print("1. 查看班级")
                        print("2. 查看课程")
                        print("3. 退出")
                        op_id = input("请选择你要进行的操作: ")
                        if op_id == "1":
                            student_obj.check_class()
                        elif op_id == "2":
                            student_obj.check_courses()
                        elif op_id == "3":
                            break
                        else:
                            print("你的输入无效,请重新输入")
                            break
                print('账号密码错误, 请重试!')
                i += 1
                print('剩余次数: {}'.format(3 - i))
            break
        elif option_id.lower() == 'exit':
            break
        else:
            continue
# 管理员需要先登录,然后创建相关的数据(管理员的账号密码目前设置成初始化)
# 其他角色才能做后续的操作(其他角色的也是如此)