def judge_keguan(request):
    postjson = jh.post2json(request)
    action = postjson['action']
    paperid = postjson['paperid']
    ph = PaperHelper()
    ret = {'code': 404, 'info': 'unknown action ' + action}

    if action == 'judge_keguan':
        # take out each submit and compare with normal answer
        # then save the result into the model.
        print("paperId is" + paperid)
        paper = Paper.objects.get(pid=paperid)
        answerlist = TestRecord.objects.filter(Q(paperid=paperid) & Q(confirmed='no'))
        for var in answerlist:
            # print(var.answers)
            score = ph.JudgeKeguan(json.loads(var.answers), json.loads(paper.prolist))
            # print(score)
            record = TestRecord.objects.get(Q(stuid=var.stuid) & Q(paperid=paperid) & Q(confirmed='no'))
            record.keguan_grade = json.dumps(score['score'])
            record.keguan_detail = json.dumps(score['detail'])
            record.save()
            pass
        ret = {'code': 200, 'info': 'ok'}
        ###
        pass

    elif action == 'clean_keguan':
        answerlist = TestRecord.objects.filter(Q(paperid=paperid)
                                               & Q(confirmed='no')).update(keguan_grade=-1, keguan_detail="")
        ret = {'code': 200, 'info': 'ok'}
        pass

    return HttpResponse(json.dumps(ret), content_type="application/json")
def judge_zhuguan(request):
    postjson = jh.post2json(request)
    action = postjson['action']
    paperid = postjson['paperid']
    ph = PaperHelper()
    ret = {'code': 404, 'info': 'unknown action ' + action}

    if action == 'getans':
        stuid = postjson['stuid']
        student = TestRecord.objects.get(Q(stuid=stuid) & Q(paperid=paperid))
        zhuguan = ph.GetZhuguan(json.loads(student.answers))
        judge = {}
        has_judge = 0
        if student.zhuguan_grade != -1:
            judge = student.zhuguan_detail
            judge = json.loads(judge)
            has_judge = 1
        # print(zhuguan)
        ret = {'code': 200, 'count': zhuguan['count'], 'list': zhuguan['zhuguan_list'],
               'has_judge': has_judge, 'judge': judge, 'confirmed': student.confirmed}
        pass

    elif action == 'submit':
        stuid = postjson['stuid']
        record = TestRecord.objects.get(Q(stuid=stuid) & Q(paperid=paperid) & Q(confirmed='no'))
        record.zhuguan_grade = json.dumps(postjson['score'])
        record.zhuguan_detail = json.dumps(postjson['detail'])
        record.save()
        ret = {'code': 200, 'info': 'ok'}
        pass

    elif action == 'clean_zhuguan':
        answerlist = TestRecord.objects.filter(Q(paperid=paperid)
                                               & Q(confirmed='no')).update(zhuguan_grade=-1, zhuguan_detail="")
        ret = {'code': 200, 'info': 'ok'}
        pass

    elif action == 'getpro':
        paper = Paper.objects.get(pid=paperid)
        pro = ph.GetProb(json.loads(paper.prolist)['question_list'], postjson['proid'])
        ret = {'code': 200, 'problem': pro['problem'], 'right': pro['right']}
        pass

    elif action == 'nextid':
        records = TestRecord.objects.filter(Q(paperid=paperid) & Q(zhuguan_grade=-1) & Q(confirmed='no'))
        if records.count() == 0:
            ret = {'code': 201, 'info': 'no next student is found'}
        else:
            ret = {'code': 200, 'nextid': records[0].stuid}
        pass

    return HttpResponse(json.dumps(ret), content_type="application/json")
def auto_save(request):
    ret = {'code': 403, 'info': 'denied method ' + request.method}
    ph = PaperHelper()

    if request.method == 'POST':
        # acquire paperid from form
        postjson = jh.post2json(request)
        print(postjson)
        paperid = postjson['paperid']
        storeid = postjson['storeid']
        print(paperid)
        paperdb = Paper.objects.get(pid=paperid)
        original_prolist = json.loads(paperdb.prolist)
        prolist = postjson['prolist']



        for pro in prolist:
            if pro['valid'] == 'false':
                continue
            problem = pro['problem']
            ptype = pro['type']
            if ptype == '主观题':
                ptype = 'zhuguan'
            else:
                ptype = 'keguan'
            point = pro['point']
            right = pro['right']
            wrong1 = pro['wrong1']
            wrong2 = pro['wrong2']
            wrong3 = pro['wrong3']
            ph.AddPro(original_prolist, problem, ptype, point, right, wrong1, wrong2, wrong3)
            paperdb.prolist = json.dumps(original_prolist)

        paperdb.save()
        '''
    paperdb = Paper.objects.get(pid = paperid)
    original_prolist = json.loads(paperdb.prolist)
    ph.AddPro(original_prolist, problem["problem"], problem["ptype"], problem["point"],
     problem["right"], problem["wrong1"], problem["wrong2"], problem["wrong3"])
    paperdb.prolist = json.dumps(original_prolist)
    paperdb.save()
    '''

        # delete file after used
        ret = {'code': 200, 'info': 'ok'}
        pass

    return HttpResponse(json.dumps(ret), content_type="application/json")
def modify_paper_stulist(request):
    postjson = jh.post2json(request)
    paperid = postjson['paperid']
    action = postjson['action']
    ph = PaperHelper()
    ret = {'code': 404, 'info': 'unknown action' + action}
    # TODO(LOW): verify paperid whether existing
    ###
    print(paperid)
    paperdb = Paper.objects.get(pid=paperid)
    if (action == 'addstu'):
        stulist = postjson['stulist']
        stuarray = stulist.split(';')
        original_stulist = json.loads(paperdb.stulist)
        count = 0
        for var in stuarray:
            # TODO(LOW): verify var(stuid) whether existing
            #
            result = UserList.objects.filter(username=var)
            if not result.exists():
                continue

            if (var == ''):
                continue
            ph.AddStu(original_stulist, var)
            count += 1
        paperdb.stulist = json.dumps(original_stulist)
        paperdb.save()
        ret = {'code': 200, 'info': 'ok', 'count': count}

    elif (action == 'delstu'):
        stu_to_del = postjson['stu_to_del']
        original_stulist = json.loads(paperdb.stulist)
        ph.DelStu(original_stulist, stu_to_del)
        paperdb.stulist = json.dumps(original_stulist)
        paperdb.save()
        ret = {'code': 200, 'info': 'ok', 'deleted': stu_to_del}

    elif (action == 'cleanstu'):
        original_stulist = json.loads(paperdb.stulist)
        gradelist = json.loads(paperdb.stulist)
        count = original_stulist['count']
        empty_list = ph.CreateStuList()
        paperdb.stulist = json.dumps(empty_list)
        paperdb.save()
        ret = {'code': 200, 'info': 'ok', 'count': count}

    return HttpResponse(json.dumps(ret), content_type="application/json")
def judge_manage(request):
    ret = {'code': 200, 'info': 'ok'}
    postjson = jh.post2json(request)
    action = postjson['action']
    paperid = postjson['paperid']
    ph = PaperHelper()
    if action == 'getans':
        ret = {'code': 200, 'info': 'ok'}
        # build the list of all students' answers
        retlist = []
        illulist = [0, 0, 0, 0, 0]
        db = TestRecord.objects.filter(paperid=paperid)
        for var in db:
            retlist.append(claRecord(var.paperid, var.stuid, var.submit_time, var.answers,
                                     var.keguan_grade, var.keguan_detail, var.zhuguan_grade, var.zhuguan_detail,
                                     var.total_score, var.confirmed))
            print(var.total_score)
            if not var.confirmed == "yes":
                continue
            if (var.total_score < 60):
                illulist[0] += 1
            elif var.total_score >= 90:
                illulist[4] += 1
            else:
                illulist[int((var.total_score - 50) / 10)] += 1
        print(illulist)
        jsonarr = json.dumps(retlist, default=lambda o: o.__dict__, sort_keys=True)
        loadarr = json.loads(jsonarr)
        ret = {'code': 200, 'info': 'ok', 'anslist': loadarr, 'illulist': illulist}
        ###

    elif action == 'delans':
        # delete the specified answer sheet from records
        stuname = postjson['stuname']
        TestRecord.objects.filter(Q(stuid=stuname) & Q(paperid=paperid) & Q(confirmed='no')).delete()
        ret = {'code': 200, 'info': 'ok'}
        ###

    elif action == 'submit':
        records = TestRecord.objects.filter(Q(paperid=paperid) & Q(confirmed='no'))
        for var in records:
            record = TestRecord.objects.get(Q(stuid=var.stuid) & Q(paperid=paperid) & Q(confirmed='no'))
            record.confirmed = 'yes'
            record.total_score = record.keguan_grade + record.zhuguan_grade
            record.save()
            pass
        ret = {'code': 200, 'info': 'ok'}
        pass

    return HttpResponse(json.dumps(ret), content_type="application/json")
def result_manage(request):
    ph = PaperHelper()
    ret = {'code': 404, 'info': 'unknown method ' + request.method}
    if request.method == 'GET':
        paperid = request.GET.get('paperid')
        stuid = request.session['login_name']
        db = Paper.objects.get(pid=paperid)
        paper_pro = json.loads(db.prolist)

        db1 = TestRecord.objects.get(paperid=paperid, stuid=stuid)
        stu_res = json.loads(db1.answers)
        zhuguan_grd = json.loads(db1.zhuguan_detail)
        test = ph.Paper2Result(paper_pro, stu_res, zhuguan_grd)
        ###
        subcount = TestRecord.objects.filter(paperid=paperid).count()
        infoname_t = UserInfo.objects.filter(username=db.teaname).values("name")[0]["name"]
        test_info = json.dumps(claPaper(db.pid, db.pname, db.teaname, db.penabled,
                                        'notused', 'notused', str(subcount), infoname_t), default=lambda o: o.__dict__,
                               sort_keys=True)
        test_info = json.loads(test_info)
        # print(test)
        ret = {'code': 200, 'info': 'ok', 'test': test, 'test_info': test_info}
    return HttpResponse(json.dumps(ret), content_type="application/json")