package cn.com.qmth.stmms.biz.mark.service;

import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
import cn.com.qmth.stmms.biz.exam.model.Marker;
import cn.com.qmth.stmms.biz.mark.model.*;
import cn.com.qmth.stmms.common.enums.ScorePolicy;
import cn.com.qmth.stmms.common.enums.ThirdPolicy;

import java.util.List;

public interface MarkService {

    /**
     * 释放某个评卷员已完成的评卷任务
     *
     * @param result
     * @param marker
     */
    void releaseTask(SubmitResult result, Marker marker);

    /**
     * /** 释放某个大题的锁定任务
     *
     * @param group
     */
    void releaseByGroup(MarkGroup group);

    /**
     * 重置某个大题的所有评卷任务
     *
     * @param group
     */
    void resetByGroup(MarkGroup group);

    /**
     * 删除某个大题
     *
     * @param group
     */
    void deleteGroup(MarkGroup group);

    /**
     * 修改并重置某个大题
     *
     * @param group
     * @param third
     */
    void updateGroup(MarkGroup group, List<ExamQuestion> questionList, ScorePolicy policy, ThirdPolicy third,
            boolean selective);

    /**
     * 评卷员申请领取某个正式评卷任务
     *
     * @param library
     * @param marker
     */
    boolean applyLibrary(MarkLibrary library, Marker marker);

    /**
     * 评卷员申请领取某个试评评卷任务
     *
     * @param library
     * @param marker
     * @return
     */
    boolean applyLibrary(TrialLibrary library, Marker marker);

    /**
     * 评卷员是否已领取某个正式评卷任务
     *
     * @param library
     * @param marker
     * @return
     */
    boolean hasApplied(MarkLibrary library, Marker marker);

    /**
     * 评卷员是否已领取某个试评评卷任务
     *
     * @param library
     * @param marker
     * @return
     */
    boolean hasApplied(TrialLibrary library, Marker marker);

    /**
     * 释放某个评卷员的所有锁定任务
     *
     * @param marker
     */
    void releaseByMarker(Marker marker);

    /**
     * 重置某个评卷员
     *
     * @param marker
     */
    void resetMarker(Marker marker);

    /**
     * 根据考生删除评卷任务
     *
     * @param student
     */
    void deleteByStudent(ExamStudent student);

    /**
     * 对某个考生某个科目进行主观题统分
     *
     * @param student
     * @param groups
     */
    // void scoreCalculate(ExamStudent student, List<MarkGroup> groups);

    /**
     * 管理员/组长处理仲裁卷
     *
     * @param markResult
     * @param userId
     */
    void processArbitrate(MarkResult markResult, Integer userId);

    /**
     * 管理员/组长重置（打回）某个评卷任务
     *
     * @param library
     * @return
     */
    boolean rejectLibrary(MarkLibrary library, Integer userId, String reason, boolean isRest);

    /**
     * 更新某个大题已评任务数量
     *
     * @param group
     */
    void updateMarkedCount(MarkGroup group);

    /**
     * 更新某个大题评卷任务总量
     *
     * @param group
     */
    void updateLibraryCount(MarkGroup group);

    /**
     * 更新某个科目所有大题评卷任务总量与已评数量
     *
     * @param examId
     * @param subjectCode
     */
    void updateAllCount(Integer examId, String subjectCode);

    /**
     * 某个大题已申请的评卷任务数量
     *
     * @param group
     * @return
     */
    int applyCount(MarkGroup group);

    /**
     * 某个评卷员已申请的评卷任务数量
     *
     * @param marker
     * @return
     */
    int applyCount(Marker marker);

    /**
     * 评卷员提交评卷任务
     *
     * @param result
     * @param marker
     * @return
     */
    SubmitResult submitTask(MarkResult result, Marker marker);

    /**
     * 管理员/组长重置某个试评任务
     *
     * @param library
     * @return
     */
    boolean resetLibrary(TrialLibrary library);

    /**
     * 某个评卷员已完成的评卷任务数量
     *
     * @param marker
     * @return
     */
    long markedCount(Marker marker);

    /**
     * 计算并更新指定评卷员的评卷质量指标
     *
     * @param marker
     */
    void updateQuality(Marker marker);

    /**
     * 判断评卷员是否需要更新评卷质量
     *
     * @param marker
     * @param expireMinutes
     * @return boolean
     */
    boolean needUpdateQuality(Marker marker, long expireMinutes);

    /**
     * 管理员/组长打回某个学生分组的评卷任务
     *
     * @param library
     * @return
     */
    // boolean backStudentByGroup(ExamStudent student, Integer groupNumber,
    // Integer userId);

    /**
     * 管理员/组长打回某个学生的指定题目
     *
     * @param student
     * @param questionList
     * @param userId
     * @param resson
     * @return
     */
    boolean rejectedStudent(ExamStudent student, MarkStepDTO[] questionList, Integer userId, String reason);

    /**
     * 删除某个小题
     *
     * @param question
     */
    boolean deleteByQuestion(List<ExamQuestion> question);

    /**
     * 管理员/组长打回某个任务的指定题目
     *
     * @param library
     * @param questionList
     * @param userId
     * @return
     */
    boolean rejectLibrary(MarkLibrary library, MarkStepDTO[] questionList, Integer userId, String reason);

    /**
     * 考生判断是否主观题全部评卷完成
     *
     * @param studentId
     * @param groupCount
     * @param unGroupQuestionCount
     */
    void checkStudentSubjective(Integer studentId, long groupCount, long unGroupQuestionCount);

    void groupTrialToFormal(int examId, String subjectCode);

}
