package com.ssj.service.sys.homework.service;

import com.ssj.bean.sys.homework.domain.Homework;
import com.ssj.bean.weixin.zyb.domain.ZuoybStudentPush;
import com.ssj.framework.core.common.service.BaseService;
import com.ssj.service.conch.parents.dto.CorrectDetailDto;
import com.ssj.service.conch.parents.dto.CorrectDetailDto2;
import com.ssj.service.conch.parents.dto.HistoryTaskDto;
import com.ssj.service.conch.parents.v1.dto.AdminCorretionDetailDto;
import com.ssj.service.conch.parents.v1.dto.CorrectDetailDto3;
import com.ssj.service.conch.parents.v1.dto.CorrectDetailDto4;
import com.ssj.service.conch.student.dto.AppCorrectDetailDto;
import com.ssj.service.conch.student.dto.RelateKnowledgeDto;
import com.ssj.service.conch.teacher.dto.HomeworkDTO;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.Date;
import java.util.List;
import java.util.Map;

public interface HomeworkService extends BaseService<Homework, String> {

    // Homework finishHomework(String parentId, String registerId, String subject, String derver, Long startTime,
    // Long endTime, Long usedTime);

    CorrectDetailDto3 getCorrectDetailDto3(Homework homework);

    /**
     * 管理员查看批改详情
     * @param homework
     * @return
     */
    AdminCorretionDetailDto getAdminCorrectDetail(Homework homework);

    /**
     * 分页查询作业列表
     * @param searchParam
     * @param pageable
     * @return
     */
    Page<Map<String, Object>> findHomeworkByPage(Map<String, Object> searchParam, Pageable pageable);

    Homework finishHomework(String parentId, String derver, Long startTime, Long endTime,
                            Long usedTime);

    /**
     * 查询这一天的作业记录
     * @param vipId
     * @param subject
     * @param beginTime
     * @return
     */
    Homework findByVipIdAndSubject (String vipId, String subject, Date beginTime);

    /**
     * 开始作业记录，库里有记录则修改相应字段
     * @param vipId
     * @param subject
     * @param beginTime
     * @param type
     * @return
     */
    Homework beginHomeworkRecord (String vipId, String subject, Date beginTime, int type);

    /**
     * 结束作业记录，没有作业记录则返回空
     * @param vipId
     * @param subject
     * @param endTime
     * @param costTime
     * @return
     */
    Homework endHomeworkRecord (String vipId, String subject, Date endTime, int costTime);

    /**
     * 批改作业完成记录， 没有作业记录则返回空
     * @param vipId
     * @param subject
     * @param correctTime
     * @return
     */
    Homework correctFinishRecord (String vipId, String subject, Date correctTime);

    /**
     * 手动输入作业耗时记录作业时间，用于作业吧，推算开始时间记录数据
     * @param vipId
     * @param subject
     * @param endTime
     * @param costTime
     * @return
     */
    Homework manualModificationEndTime (String vipId, String subject, Date endTime, int costTime);
    
    /**
     * @param vipId
     * @param subject
     * @return
    
     * 方法说明:查询当天作业记录
    
     * 创立日期:2019年4月17日 上午10:31:19
     * 创建人:yangcan
    
     */
    public Homework findByTodaySubjectHomework(String vipId,String subject);

    /**
     * 查询某天学科的作业
     * @param vipId
     * @param subject
     * @param dateTime
     * @return
     */
    Homework findDateSubjectHomework (String vipId, String subject, Date dateTime);

    /**
     * 查询当天的作业记录
     * @param vipId
     * @return
     */
    List<Homework> queryDateHomework (String vipId, Date datetime);

    /**
     * 查询历史作业任务
     * @param vipId 学生id
     * @param maxCreateTime 最大时间
     * @param pageable 分页实体
     * @return
     */
    Page<Map<String, Object>> findDateByVipIdIncludeToday(String vipId, String maxCreateTime, Pageable pageable);

    /**
     * 查询近一段时间的学习轨迹时长
     * @param vipId
     * @param beginTime
     * @param endTime
     * @return
     */
    List<Map<String, Object>> findDatesLearningTime (String vipId, String beginTime, String endTime);

    /**
     * 查询一段时间内各学科的报告数和作业用时
     * @param vipId 学生id
     * @param beginTime 开始时间（例：2019-12-10）
     * @param endTime 结束时间（例：2019-12-10）
     * @return 统计结果列表
     */
    List<Map<String, Object>> findDatesSubjectAndUsedTime(String vipId, String beginTime, String endTime);

    /**
     * 查询作业反馈报告
     * @param pushId
     * @return
     */
    Map<String, Object> findHomeworkReport (ZuoybStudentPush push);

    /**
     * 查询公共部分历史的作业数据
     * @param push
     * @return
     */
    HistoryTaskDto findCommonHistoryTask (ZuoybStudentPush push, List<Homework> hwList);

    /**
     * 返回学习状态列表
     * @param push
     * @return
     */
    List<Map<String, String>> findLearningStatus (ZuoybStudentPush push);

    /**
     * 查询各科作业详情
     * @param hwList
     * @return
     */
    List<AppCorrectDetailDto> findCorrectDetails(List<Homework> hwList);

    AppCorrectDetailDto getAppCorrectDetailDto(String homeworkId);

    /**
     * 根据科目作业id获取批改详情
     * @param homeworkId
     * @return
     */
    CorrectDetailDto getCorrectDetailDto(String homeworkId);

    /**
     * 根据科目作业获取批改详情
     * @param hw
     * @return
     */
    CorrectDetailDto getCorrectDetailDto(Homework hw);

    /**
     * 分页查找拍照作业列表
     * @param vipId
     * @param maxCreateTime
     * @param pageable
     * @return
     */
    Page<Map<String, Object>> findHomeworkPageByVipId(String vipId, String maxCreateTime, Pageable pageable);

    /**
     * 删除没有作业图片的homework记录
     */
    void deleteNoPictureHomework ();

    /**
     * 查询作业反馈报告
     */
    Map<String, Object> findHomeworkReport2(String pushId);

    CorrectDetailDto2 getCorrectDetailDto2(Homework homework);

    /**
     * 判断作业是否已批改完成，是返回1，否返回0
     * @param homeworkId
     */
    Integer isCorrected(String homeworkId);

    /**
     * 根据老师id和批改类型（0未完成  1已完成），查询作业列表，用于小程序在线批改
     */
    Page<HomeworkDTO> findByTeacherIdAndType(String teacherId, Integer type, String beginDateTimeStr, String endDateTimeStr, Pageable pageable);

    /**
     * 查询学生作业的信息（年级、科目、版本）
     */
    Map<String, Object> findHomeworkInfoById(String homeworkId);

    /**
     * 开始作业批改计时
     * @param homeworkId 学科作业id
     */
    void startCorrectTiming(String homeworkId);

    /**
     * 结束作业批改的计时，并返回批改耗时（单位：秒）
     */
    Integer stopCorrectTiming(String homeworkId);

    /**
     * 查询作业反馈报告
     */
    Map<String, Object> findHomeworkReport3(String pushId, String parentId);

    /**
     * 查询是否有存在的作业记录
     * @param vipId 学生id
     * @param startTime 开始时间
     * @param subject 科目
     */
    Homework findByVipIdStartTimeSubject(String vipId, Date startTime, String subject);

    /**
     * 分页查询时间区间内的作业
     * @param beginTimeStr 开始时间点
     * @param endTimeStr 结束时间点
     * @param pageable
     */
    Page<Homework> findByCreateTimeBetween(String beginTimeStr, String endTimeStr, Pageable pageable);

    /**
     * 开始作业批改时间
     * @param homeworkId
     */
    void beginHomeworkCorrection (String homeworkId);


    String getHomeworkTime(Homework homework);

    void endHomeworkRecord(String vipId, String subject);

    /**
     * 查询指定学生当天存在纸面作业且未上传图片的计时记录的id
     */
    List<String> findIdPictureNotUpload(String vipId);

    /**
     * 查询一段时间的作业记录
     * @param vipId
     * @param beginTime
     * @param endTime
     * @return
     */
    List<Homework> findRangHomeworkList (String vipId, Date beginTime, Date endTime);

    /**
     * 查询作业反馈报告
     */
    Map<String, Object> findHomeworkReport4(ZuoybStudentPush zuoybStudentPush, String parentId, boolean hideReportIfAbsent);

    List<CorrectDetailDto4> getCorrectDetails4(String vipId, Date pushDate);

    /**
     * 根据科目作业获取批改详情
     */
    CorrectDetailDto4 getCorrectDetailDto4(Homework byVipIdAndSubject);

    /**
     * 查询缓存中的批改详情
     * @param vipId
     * @param subject
     * @param date
     * @return
     */
    CorrectDetailDto4 getRedisCorrectDetail (String vipId, String subject, Date date);

    /**
     * 删除redis单科批改详情
     * @param vipId
     * @param subject
     * @param date
     */
    void removeRedisCorrectDetailDto4 (String vipId, String subject, Date date);

    /**
     * 更新作业为无作业
     * @param homeworkId
     */
    void updateHomework2NoHomework (String homeworkId);

    /**
     * 查询作业详情错题并设置缓存
     * @param homeworkId
     * @return
     */
    List<Map<String, Object>> findWrongQuestionAndSetRedis(String homeworkId);

    /**
     * 查询作业详情错题知识点并设置缓存
     * @param homeworkId
     * @return
     */
    List<RelateKnowledgeDto> findWrongHowDetailAndSetRedis(String homeworkId);

    /**
     * 根据小孩删除作业
     */
    void deleteByVipId(String vipId);
}
