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

import java.util.List;

import cn.com.qmth.stmms.biz.campus.model.Campus;
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.ExamSubject;
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.ArbitrateHistory;
import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
import cn.com.qmth.stmms.biz.mark.model.MarkResult;
import cn.com.qmth.stmms.biz.mark.model.TrialLibrary;
import cn.com.qmth.stmms.common.enums.ScorePolicy;

public interface MarkService {

    /**
     * 释放某个评卷员已领取的正评任务
     * 
     * @param library
     * @param marker
     */
    void releaseLibrary(MarkLibrary library, Marker marker);

    /**
     * 释放某个评卷员已领取的试评任务
     * 
     * @param library
     * @param marker
     */
    void releaseLibrary(TrialLibrary library, Marker marker);

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

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

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

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

    /**
     * 评卷员申请领取某个正式评卷任务
     * 
     * @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
     * @param group
     */
    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 history
     */
    void processArbitrate(ArbitrateHistory history);

    /**
     * 管理员/组长打回某个评卷任务
     * 
     * @param library
     * @return
     */
    boolean backLibrary(MarkLibrary library);

    /**
     * 更新某个大题已评任务数量
     * 
     * @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 student
     * @param campus
     * @param group
     * @param subject
     */
    void buildFormalLibrary(ExamStudent student, Campus campus, MarkGroup group, ExamSubject subject);

    /**
     * 根据考生、学习中心、大题构造试评评卷任务
     * 
     * @param student
     * @param campus
     * @param group
     */
    void buildTrialLibrary(ExamStudent student, Campus campus, MarkGroup group);

    /**
     * 评卷员提交评卷任务
     * 
     * @param task
     * @param marker
     * @return
     */
    boolean 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);

}
