package com.ssj.service.weixin.library.service;

import com.ssj.bean.common.framework.core.domain.Response;
import com.ssj.bean.weixin.libmy.domain.TbLibManager;
import com.ssj.bean.weixin.user.domain.User;
import com.ssj.framework.core.common.service.BaseService;
import com.ssj.framework.core.util.ResponseEntity;
import com.ssj.service.conch.curator.request.CreateTeacherRequest;
import com.ssj.service.conch.teacher.app.request.VcodeSubmitReq;
import com.ssj.service.sys.teacher.dto.CorrectionCountDTO;
import com.ssj.service.sys.teacher.dto.OnlineCorrectTeacherDTO;
import com.ssj.service.weixin.library.dto.SchoolManagerDTO;
import com.ssj.service.weixin.library.dto.TeacherInfoDTO;
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 IBookManagerService extends BaseService<TbLibManager, String> {

	public TbLibManager findByUserId(String userId);
	public List<TbLibManager> getByUserId(String userId);
	public List<TbLibManager> getByDistinctUserId(String userId);
	TbLibManager findByOnoTwoOnoTearcher(String userId);
	/*
	 * 根据userId,管理员类型
	 */
	public TbLibManager findByUserId(String userId,Integer type);

	public List<TbLibManager> find121Teacher (int type);

	public TbLibManager findByUserIdAndType(String userId, Integer type);

	public TbLibManager findExerciseTeacherByUserIdAndType(String userId,int type);

	public TbLibManager findByLibIdAndUserIdAndType(String libId,String userId,Integer type);

	public List<Map<String, Object>> findManageList(String libId);
	public List<Map<String, Object>> findManageUserList(String userId);

	public List<Map<String, Object>> findSaleList(String libId);

	public Map<String, Object> getLibUserInfo(String userId,String libId);

	public Page<Map<String, Object>> vipUserList(Map<String, Object> params, Pageable pageable);

	public Map<String, Object> getSaleUserInfo(String userId, String libId);

	public Page<Map<String, Object>> vipList(Map<String, Object> params, Pageable pageable);

	public List<Map<String, Object>> findLibUserList(Map<String, Object> params);

	public List<Map<String, Object>> findVipUserList(Map<String, Object> params);

	public List<Map<String, Object>> searchAddUser(Map<String, Object> params);

	List<Map<String, Object>> searchAddUserList(Map<String, Object> params);

	public TbLibManager findByUserIdAndLibId(String id, String libId);

	public List<String> findManageOpenidList(String libId,int type);

	public List<Map<String, Object>> findAnything(String libId, int type);



	public List<Map<String,Object>> findKmtTeacherByPage();

	public Map<String,Object> findKmtTeacherByUserId(String userId);
	public Map<String,Object> findKmtTeacherByUserIdAndCourse(String userId);

	/**
	 * @param courseName
	 * @return

	 * 方法说明: 根据科目随机分配一名相应的老师

	 * 创立日期:2018年5月8日 下午1:31:40
	 * 创建人:yangcan

	 */
	public Map<String,Object> findRandomByCourseName(String courseName);


	/**
	 * @param courseName
	 * @param grade
	 * @return
	 * 方法说明: 根据科目,年级随机分配一名相应的老师
	 */
	Map<String, Object> findRandomByCourseNameAndGrade(String courseName, String grade);

	public List<TbLibManager> findManagerList (String userId, int type);
	
	public List<TbLibManager> findManagerList (String libId,String userId, int type);

	/**
	 *
	 * @return
	 * 方法说明: 老师绑定校长，不分馆
	 */
	int  bindByMasterAndTeacher(String teacherId,String masterId);

	/**
	 * 搜索老师
	 * @param libIds
	 * @param types
	 * @param masterId
	 * @return
	 */
	public List<TbLibManager> findManagerList (String[] libIds, int[] types, String masterId);

	public List<TbLibManager> searchTeacherList (String[] libIds, String masterId, String key);



	/**
	 * 查询授课老师信息
	 * @param userIds
	 * @return
	 */
	List<TbLibManager> findByUserIdIn (String[] userIds);

	public Map<String,Object> findKmtTeacherByUserIdAndOne(String userId);

	public TbLibManager findByUserIdAndTypeAndGradeAndTeacherLever(String userId,int type,String grade, String teacherLever);

	/**
	 * @param userId
	 * @param type
	 * @return

	 * 方法说明:通过老师查询绑定校长列表

	 * 创立日期:2018年6月28日 下午8:47:14
	 * 创建人:yangcan

	 */
	public List<TbLibManager> findMasterListByUserIdAndType(String userId,int type);


	/**
	 * @param userId
	 * @return

	 * 方法说明:查询老师的所有角色集合

	 * 创立日期:2018年6月29日 上午9:50:32
	 * 创建人:yangcan

	 */
	public List<TbLibManager> findTeacherByUserId(String userId);

	public TbLibManager findByUserIdAndLibIsNotNull(String userId);

	public List<Map<String,Object>> findMasterIdByLibId(List<String[]> masterIdByLibId);

	public List<Map<String,Object>> findTeacherIdByMasterId(List<String[]> teacherIdByMasterId);

	/**
	 * 查询某个馆某个类型的老师
	 * @param libId
	 * @param type
	 * @return
	 */
	public List<Map<String, Object>> findByLibIdAndType (String libId, int type);
	/**
	 * 查询在线老师
	 * @param params
	 * @param pageable
	 * @return
	 */
	Page<Map<String, Object>> findKmtTeacherByPage(Map<String, Object> params, Pageable pageable);

	/**
	 * 查询指定角色的有效用户信息
	 *
	 * @return
	 */
	List<TbLibManager> findByUserIdAndTypeIn(String userId, int[] type);



    /**
     * 将注销后的更新为失效的
     * @param userId
     * @param type
     * @return
     */
    void updateByUserIdAndTypeAndCancelled(String userId,int type,int cancelled);

	/**
	 * 查询指定角色的用户信息（包含失效）
	 * @param userId
	 * @param type
	 * @return
	 */
	List<TbLibManager> findAllByUserIdAndTypeIn(String userId, int[] type);


	/**
	 * 查询指定角色的用户信息（包含失效）
	 * @param userId
	 * @param type
	 * @return
	 */
	List<TbLibManager> findAllByUserIdAndTypeInAndIsCancelled(String userId, int[] type, int isCancelled);

	/**
     * 查询指定角色的有效用户列表
     *
     * @param type
     * @return
     */
    List<TbLibManager> findByType(int type);

	List<TbLibManager> findByTypeIn(int[] type);

	/**
	 *查询申请老师列表
	 */
   Page<Map<String,Object>> findTbLibTeacherByPage(Map<String,Object>params,Pageable pageable);



	/**
	 * 查询下级角色用户
	 * @param parentId
	 * @return
	 */
	List<TbLibManager> findByParentId(String parentId);

	/**
	 * 查询指定类型下级角色用户
	 * @param parentId
	 * @return
	 */
	List<TbLibManager> findByParentIdAndType(String parentId,int type);

	/**
	 * 更改在线批改管理平台的角色信息
	 * @param userId
	 * @param type 1:设置上线，2：设置下线
	 */
	void setCorretSysRoleInfo(String userId, int type);

	/**
	 * 查询指定角色的所有用户信息，不区分有效无效
	 * @param userId
	 * @param type
	 * @return
	 */
	TbLibManager findAllByUserIdAndType(String userId, int type);


	/**
	 * 查询指定角色的所有用户信息，区分注销
	 * @param userId
	 * @param type
	 * @return
	 */
	TbLibManager findAllByUserIdAndTypeAndCancelled(String userId, int type);

	TbLibManager findAllByUserIdAndTypeAndState(String userId, int type,int state);

    void allotHomework(String homeworkId, String teacherId);

	/**
	 * 更新选定老师的实时权重和批改图片总数
	 * @param vipId 学生id
	 * @param teacherId 老师userId
	 * @param num 需要增加的图片数量，若是减少则为负值
	 */
	void updateCorrectHomeworkNum(String vipId, String teacherId, int num);

	Page<OnlineCorrectTeacherDTO> findCorrectTeacherPage(String teacherName, Pageable pageable);

	Page<CorrectionCountDTO> correctionCount(String teacherName, Date beginTime, Date endTime, Pageable pageable);

	void resetCorrectHomeworkNum();

	/**
	 * 查找该科目该年级当前待批改作业最少的老师
	 */
    TbLibManager findByCourseNameAndGrade(String courseName, String grade);
	TbLibManager findByCourseNameAndGrade(String courseName, String grade,String teacherId);
	TbLibManager findByCourseNameAndGrade(String courseName, String grade,int teacherType);
	TbLibManager findByCourseName(String courseName);
	TbLibManager findByCourseName(String courseName,String teacherId);
	  
	/**
	 * 查看指定批改时间的老师
	 *
	 * @param period
	 * @return
	 */
	List<TbLibManager> findCorrectTeacherByPeriod(String period);

    Page<SchoolManagerDTO> findPageByTypeIn(String subject, List<Integer> typeList, Pageable pageable);

	/**
	 * 查询个人资料
	 * @param teacherId
	 * @return
	 */
	TeacherInfoDTO findMyInfo(String teacherId);

    TbLibManager findByCourseNameAndGrade(String subject, String grade, int teacherType, int correctType);

	/**
	 * 查询批改老师的数据（在线批改老师、匹配知识点老师）
	 * @param userId
	 * @param isAll false则只包含state=1的有效数据
	 * @return
	 */
	TbLibManager findCorrectTeacherByUserId(String userId, boolean isAll);

	/**
	 * 查询批改老师的数据（在线批改老师、匹配知识点老师）
	 * @param userId
	 * @param isAll false则只包含state=1的有效数据
	 * @return
	 */
	TbLibManager findCorrectTeacherByUserIdAndIsCancelled(String userId, boolean isAll,int cancel);


	/**
	 * @param
	 * @return
	 * 方法说明:查询老师的角色类型汇总
	 * 创建时间:2019/7/23 16:17
	 * @author yangcan
	 */
	List<Integer> findTeacherTypeByUserId(String userId);

	/**
	 * 查询用户属于在线批改管理系统中的角色类型：批改老师（8,11），匹配知识点老师（13）
	 * @param userId
	 * @return
	 */
	int findCorrectOrKnowRoleByUserId(String userId);

	TbLibManager findTopByUserIdAndTypeIn(String userId, int[] type);
	
	List<String> findByParentIdAndTypeAndCourseName(String parentId,Integer type, String courseName,String teacherName);

	/**
	 * 校验校区管理员的科目与所选科目是否一致，如果一致返回true，否则返回false
	 * @param managerUserId 所选校区管理员
	 * @param subject 所选科目
	 * @return 校验结果
	 */
    boolean checkSchoolManagerSubject(String managerUserId, String subject);

	TbLibManager findUserInfoByPhone(String phone);

    void getVerificationCode(String userId, String phone);

	ResponseEntity bindTelPhone(String userId, VcodeSubmitReq req);

	void updateManagerPhone(String userId, String phone);
	
	void updateManagerPhoto(String userId, String photo);
	

    TbLibManager findByCourseNameAndGradeNotThis(String subject, String grade, int i, String teacherId);

	int findActiveTeacherByLoginTime(String loginTime);

	int findRegisterUser();

	int findActiveUserByCreateTime(String createTime);

	/**
	 * 查找馆里的老师
	 *
	 * @param libId
	 * @return
	 */
	List<TbLibManager> findLibTeacherByLibId(String libId);

	/**
	 * 查找馆里科目老师
	 * @param libId
	 * @param subject
	 * @return
	 */
	List<TbLibManager> findLibTeacherByLibId(String libId, String subject);

	/**
	 * 查询批改的老师的类型
	 * @param teacherId
	 * @return
	 */
	int findCorrectTeacherType (String teacherId);

	/**
	 * 查询机构自批改老师的资料
	 * @param teacherId 老师id
	 * @return 老师资料
	 */
	ResponseEntity findOrgMyInfo(String teacherId);

	/**
	 * 查询机构自批改老师的资料 多校区
	 * @param teacherId 老师id
	 * @return 老师资料
	 */
	ResponseEntity findOrgMyInfoV1(String teacherId);
	
	List<TbLibManager> findByUserIdAndTypeInAndState(String userId, int[] type, int state);

	/**
	 * 保存老师类型记录
	 */
	void saveTypeTbLibManager (User user, CreateTeacherRequest dto, String libId, int type);

	/**
	 * 将身份置失效
	 * @param userId
	 * @param type
	 * @param status
	 */
	void saveTbLibManagerStatus (String userId, int type, int status);

	/**
	 * 将老师身份列表置失效
	 */
	void saveTbLibManagerListStatus (String userId, int[] types, int status);
	void saveTbLibManagerListStatus (String libId,String userId, int[] types, int status);
	
	List<TbLibManager> findTbLibManagerByLibId(String libId,int type, int status);

	/**
	 * 找到与学生统一班级指定角色的老师
	 * @param vipId 学生vipid
	 * @param subject 科目
	 * @param type 2:管理老师 10学科老师（难题批改） 15自批改老师
	 * @return
	 */
	List<TbLibManager> findClassTeacherList(String vipId, String subject, int type);

	TbLibManager findTopClassTeacherList(String vipId, String subject, int type);

	/**
	 * 查询有效的老师记录数
	 * @param userId
	 * @param types
	 * @return
	 */
	int findCountByUserIdAndTypesAndStatus1 (String userId, int[] types);
	int findCountByUserIdAndTypesAndStatus1 (String libId,String userId, int[] types);
	int findCountIsNotLibByUserIdAndTypesAndStatus (String libId,String userId, int[] type);

	TbLibManager  findByTelephoneAndTypesIn(String telephone, int[] types);
	/**
	 * 查询老师所有的角色
	 */
    List<TbLibManager> findAllManagerByTeacherId(String teacherId);

	/**
	 *查询馆长
	 */
	List<TbLibManager> findLibTeacherByLibIdAndType(String libId,int type);

	/**
	 * 该老师设置为无效
	 */
	void updateCancelStatusByUserId(String userId);

	/**
	 * 该老师设置为
	 */
	void updateStatusByUserId(String userId);

	/**
	 * 查询有效的老师列表
	 */
	List<TbLibManager> findAllValidTeacherList(String userId, int[] types);

	TbLibManager findAllByUserIdAndTypeAndState(String libId, String userId, int type, int state);

	//List<TbLibManager> findByUserIdAndTypeInAndState(String libId, String userId, int[] type, int state);

	/**
	 * 查找指定馆下的指定老师的指定角色
	 * @param libId
	 * @param userId
	 * @param type
	 * @param state
	 * @return
	 */
	List<TbLibManager> findList(String libId, String userId, int[] type, Integer state);

	/**
	 * 查找指定馆下的指定老师的指定角色
	 * @param libId
	 * @param userId
	 * @param type
	 * @return
	 */
	TbLibManager findByLibIdAndUserIdAndType(String libId, String userId, int type);

	List<TbLibManager> findAllByUserIdAndTypeAndStatus(String teacherId,int type);

	TbLibManager findByTypeAndState(int type,int state);

	/**
	 * 根据名字模糊查询用户角色记录
	 * @param name
	 * @param type
	 * @return
	 */
	List<TbLibManager>  findByNameAndType (String name, int type);

	/**
	 * 随机查询一位题库审核老师
	 * @param subject
	 * @return
	 */
	TbLibManager findOneManagerBySubject (String subject);

	/**
	 * 添加校长
	 * @param libId
	 * @param name
	 * @param mobile
	 * @return
	 */
    Response managerAddSave(String libId, String name, String mobile);
}
