package com.ssj.service.kmt.exercisesys.service;


import com.ssj.framework.core.util.ResponseEntity;
import com.ssj.service.kmt.correctsys.dto.CheckTeacherDetailDto;
import com.ssj.service.kmt.correctsys.request.ApplyOperateReq;
import com.ssj.service.kmt.dto.exercise.ExerciseBookAndLibExportDto;
import com.ssj.service.kmt.exercisesys.dto.Exercise4Dto;
import com.ssj.service.kmt.exercisesys.dto.ExerciseTeachersDTo;
import com.ssj.service.kmt.exercisesys.dto.ExportDistributionExerciseBookDTO;
import com.ssj.service.kmt.exercisesys.request.*;
import com.ssj.service.kmt.request.KmtExerciseBookLibReq;
import org.springframework.data.domain.Pageable;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;


/**
 * @author Mount Liu
 * @date 2020/3/18
 */
public interface KmtExerciseSysService {

    /**
     * 获取验证码
     *
     * @param phone
     * @param type
     * @param userId
     * @return
     * @throws Exception
     */
    ResponseEntity getVerificationCode(String phone, int type, String userId) throws Exception;

    /**
     * 验证验证码
     *
     * @param phone
     * @param code
     * @return
     */
    ResponseEntity verifyCode(String phone, String code) throws Exception;

    /**
     * 账号密码登录
     *
     * @param loginName
     * @param password
     * @return
     */
    ResponseEntity accountLogin(String loginName, String password);

    /**
     * 注册资料信息表
     *
     * @param req
     * @param pageable
     */
    ResponseEntity queryAllRegisterTeacher(ExercisePageReq req, Pageable pageable);

    /**
     * 设置密码
     *
     * @param req
     * @return
     */
    ResponseEntity setPassword(SetPasswordReq req);

    /**
     * 重置登录密码
     *
     * @return
     */
    ResponseEntity resetPassword(ResetPasswordReq req, String userId);


    /**
     * 忘记密码
     *
     * @return
     */
    ResponseEntity forgetPassword(ForgetPasswordReq req) throws Exception;

    /**
     * 换绑手机号
     *
     * @return
     */
    ResponseEntity updateBindPhone(ForgetPasswordReq req, String userId) throws Exception;

    /**
     * 提交资料
     *
     * @return
     */
    ResponseEntity saveInfo(String userId, SaveInfoExesysReq req);

    /**
     * 手机用户扫码绑定微信
     * @param code
     * @param userId
     * @return
     */
    ResponseEntity bindWxUnionId2PhoneUser (String code, String userId);

    /**
     * 获取用户信息
     *
     * @return
     */
    ResponseEntity getMyInfo(String userId);

    /**
     * 申请审批操作
     */
    ResponseEntity applyExerciseTeacherOperate(ApplyOperateReq req);

    /**
     * 查询所有老师列表
     */
    ResponseEntity findTeacherInfoList(MonthPageReq req, Pageable pageable);

    /**
     * 查询最近增加老师的月份
     */
    ResponseEntity findLastInsertMonth();

    /**
     * 查询练习册老师列表
     *
     * @param req 入参
     * @return 练习册列表list
     */
    ResponseEntity findExerciseTeacherList(ExerciseTeacherListReq req);

    /**
     * 查询所有需要导出的老师
     */

    List<ExerciseTeachersDTo> findAllExerciseTeachersDto(String month, Pageable pageable);

    /**
     * 查询Kmt老师列表
     *
     * @param req 入参
     * @return 练习册列表list
     */
    ResponseEntity findKmtTeacherList(FindKmtTeacherListReq req);

    /**
     * 老师转正/冻结/解冻/注销
     *
     * @param req
     * @return
     */
    ResponseEntity changeTeacherWorkingStatus(ChangeTeacherWorkingStatusReq req);

    /**
     * 查询kmt打回的题目
     *
     * @param req
     * @return
     */
    ResponseEntity findKmtTeacherReviseQuestions(FindTeacherReviseQuestionsReq req);

    /**
     * 查询kmt老师详情
     *
     * @param req
     * @return
     */
    ResponseEntity findKmtTeacherDetails(FindKmtTeacherDetailReq req);

    /**
     * 查询练习册老师详情
     *
     * @param req 入参
     * @return 练习册老师详情
     */
    ResponseEntity findExerciseTeacherDetails(ExerciseTeacherDetailReq req);

    /**
     * 刷新练习册加工状态
     *
     * @param selectedExerciseBookIdList 练习册id
     *
     * @return 更新记录数
     */
    int refreshBookStatus(List<String> selectedExerciseBookIdList);

    /**
     * 查询老师信息状态详情
     *
     * @param req 入参
     * @return 老师信息状态详情
     */
    ResponseEntity findTeacherStatusDetail(TeacherInfoStatusDetailReq req);


    /**
     * 查询机构识别率
     */
    ResponseEntity findOrgRecordRateList(KmtExerciseBookLibReq req);


    /**
     * 上传练习册分配导入文件
     *
     * @param userId
     * @param type
     * @param files
     * @return
     */
    ResponseEntity uploadForm(String userId, int type, List<MultipartFile> files);

    /**
     * 查看练习册列表
     * @param req
     * @return
     */
    ResponseEntity findExerciseList(ExerciseListReq req);

    /**
     * 新加或编辑练习册
     * @param req
     * @param userId
     * @return
     */
    ResponseEntity addOrEditExerciseBook(AddOrEditExerciseReq req, String userId);

    /**
     * 查看练习册详情
     * @param req
     * @return
     */
    ResponseEntity findExerciseDetail(ExerciseDetailReq req);

    /**
     * 查看机构列表
     * @param req
     * @return
     */
    ResponseEntity findLibList(FindLibReq req);

    /**
     * 查看出版社列表
     * @return
     */
    ResponseEntity findPressList();

    /** 刷新练习册统计数据
     *
     * @param selectedExerciseBookIdList 练习册id
     *
     * @return 更新记录数
     */
    int refreshExerciseBookCount(List<String> selectedExerciseBookIdList);

    /**
     * 查询练习册统计
     */
    ResponseEntity findExerciseBookCount();

    /**
     * 查询单科练习册列表
     * @param req 入参
     */
    ResponseEntity findExerciseBookCountSubjectDetail(ExerciseBookCountSubjectDetailReq req);

    /**
     * 导出机构识别率
     */
    List<ExerciseBookAndLibExportDto> findAllExportExerciseLib(String subject);

    /**
     * 定时计算优先级
     */
    String getPriority();

    /**
     * 查询题库录入老师列表
     *
     * @param req 入参
     * @return 练习册列表list
     */
    ResponseEntity findEnterTeacherList(FindKmtTeacherListReq req);

    /**
     * 查询题库录入老师详情
     *
     * @param req 入参
     * @return 练习册老师详情
     */
    ResponseEntity findEnterTeacherDetails(FindKmtTeacherDetailReq req);

    /**
     * 查找可分配老师列表
     * @param req
     * @return
     */
    ResponseEntity findCheckTeacherList(FindCheckTeacherListReq req);


    /**
     * 根据类型查找可分配老师列表
     * @param req
     * @return
     */
    ResponseEntity findTeacherListByType(FindCheckTeacherListReq req);

    /**
     * 分配校对老师
     * @param req
     * @return
     */
    ResponseEntity allotCheckTeacher(AllotCheckTeacherReq req);

    /**
     * 查找未校对练习册列表
     *
     * @param req
     * @return
     */
    ResponseEntity findUncheckedExerciseBookList(CheckExerciseBookReq req);

    /**
     * 查找校对中练习册列表
     *
     * @param req
     * @return
     */
    ResponseEntity findCheckExerciseBookList(CheckExerciseBookReq req);
    /**
     * 查找已校对中练习册列表
     *
     * @param req
     * @return
     */
    ResponseEntity findCheckedExerciseBookList(CheckedExerciseBookReq req);

    /**
     * 答案报错查询练习册列表
     * @param req 入参
     */
    ResponseEntity findAnswerProofreadExerciseBookList(AnswerProofreadExerciseBookListReq req);

    /**
     * 查询答案校对后需要修改答案的题目
     * @param req 入参
     * @return 题目列表
     */
    ResponseEntity findAnswerProofreadQuestionList(AnswerProofreadQuestionListReq req);

    List<Exercise4Dto> exportCheckExerciseBookList(CheckExerciseBookReq req);

    /**
     * 角色更改历史记录
     * @param userId
     * @return
     */
    ResponseEntity findRoleHistoryList(String userId);

    /**
     * 查询练习册打回的题目
     *
     * @param req 入参
     */
    ResponseEntity findExerciseTeacherReviseQuestions(ExerciseTeacherReviseQuestionReq req);


    /**
     * 更新练习册状态
     */
    void updateExerciseAnwerStatus();

    /**
     * 查询答案校对老师详情
     */
    ResponseEntity findCheckTeacherDetailsList(CheckTeacherDetailsRequest request);


    /**
     * 查询答案校对老师详情列表
     */
   List<CheckTeacherDetailDto> findCheckTeacherList(CheckTeacherDetailsRequest request);

    /**
     * 统计练习册分配情况
     */
    ResponseEntity findDistributionCount();

    /**
     * 待分配/已分配练习册列表
     *
     * @param req 入参
     */
    ResponseEntity findDistributionExerciseBookList(DistributionExerciseBookListReq req);

    /**
     * 分配练习册老师
     * @param req
     * @return
     */
    ResponseEntity allotExerciseDealTeacher(AllotCheckTeacherReq req);

    /**
     * 结薪
     * @param req
     * @return
     */
    ResponseEntity exerciseTeacherSalary (ExerciseTeacherSalaryReq req);

    /**
     * 查询需要导出的已分配练习册列表
     *
     * @param req 入参
     */
    List<ExportDistributionExerciseBookDTO> findExportDistributionExerciseBookList(ExportDistributionExerciseBookListReq req);

    /**
     * 查询练习册分配筛选项
     */
    ResponseEntity findDistributionExerciseBookFilterOption();

    /**
     * 统计机构识别率并刷新数据
     */

    ResponseEntity CountOrgRate(String subject);

    /**
     * 更新练习册分配信息
     *
     * @param selectedExerciseBookIdList 练习册id list
     * @param triggerType 触发类型（1：分配各加工身份；2：各加工身份提交；3：结薪；4：题目报错）
     *
     * @return 更新数量
     */
    int refreshExerciseBookDistributionCount(List<String> selectedExerciseBookIdList, int triggerType);

}
