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.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.ArbitrateHistory;
import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
import cn.com.qmth.stmms.biz.mark.model.MarkSpecialTag;
import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
import cn.com.qmth.stmms.biz.user.model.User;
import cn.com.qmth.stmms.common.enums.ScorePolicy;

public interface MarkService {

    /**
     * /** 释放某个大题的锁定任务
     * 
     * @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<Double> scores, ScorePolicy policy);

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

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

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

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

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

    /**
     * 对某个考生某个科目进行主观题统分
     * 
     * @param examId
     * @param subjectCode
     * @param studentId
     */
    void scoreCalculate(Integer examId, String subjectCode, Integer studentId);

    /**
     * 管理员/组长处理仲裁卷
     * 
     * @param history
     */
    void processArbitrate(ArbitrateHistory history);

    /**
     * 评卷员提交某个评卷任务
     * 
     * @param library
     * @param trackList
     * @param tagList
     * @return
     */
    boolean submitLibrary(MarkLibrary library, Marker marker, List<MarkTrack> trackList, List<MarkSpecialTag> tagList);

    /**
     * 管理员/组长直接对考生打分
     * 
     * @param student
     * @param user
     */
    void submitStudent(ExamStudent student, User user);

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

    /**
     * 更新某个大题评卷任务数量
     * 
     * @param examId
     * @param subjectCode
     * @param groupNumber
     */
    void updateLibraryCount(Integer examId, String subjectCode, Integer groupNumber);

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

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

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

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

}
