package com.yida.data.user.service;

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.common.core.entity.QueryRequest;
import com.yida.data.common.core.entity.constant.FebsConstant;
import com.yida.data.common.core.entity.system.Dept;
import com.yida.data.common.core.entity.system.EduApp;
import com.yida.data.common.core.entity.user.EduUserDept;
import com.yida.data.common.core.entity.user.EduUserDeptStandardGrade;
import com.yida.data.common.core.entity.user.enums.SectionTypeEnum;
import com.yida.data.common.core.entity.user.enums.UserDeptTypeEnum;
import com.yida.data.common.core.enums.IncludeTypeEnum;
import com.yida.data.system.vo.ClassInfoVO;
import com.yida.data.user.dto.*;
import com.yida.data.user.vo.AllDeptInfoVO;
import com.yida.data.user.vo.ClassAttendanceDataVO;
import com.yida.data.user.vo.CollectDataVO;
import com.yida.data.user.vo.TeacherDeptVO;
import org.springframework.scheduling.annotation.Async;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

/**
 * 家校部门表(只有学校会有) Service接口
 *
 * @author ZYJ
 * @date 2021-11-11 09:25:44
 */
public interface EduUserDeptService extends IService<EduUserDept> {

    /**
     * 查询所有子节点
     *
     * @param userDeptIdList 家校部门id集合
     * @return java.util.List<com.yida.data.common.core.entity.user.EduUserDept>
     * @author ZYJ
     * @date 2021/11/11 10:10
     */
    List<EduUserDept> findListByParent(List<Long> userDeptIdList);

    /**
     * 查询直接子节点
     *
     * @param userDeptId 家校部门父节点id，不能为空
     * @return java.util.List<com.yida.data.common.core.entity.user.EduUserDept>
     * @author ZYJ
     * @date 2021/11/11 10:21
     */
    List<EduUserDept> findChildByParent(Long userDeptId);

    /**
     * 向下查询指定家校部门类型的家校部门数据(可查询非直接子家校部门)
     *
     * @param userDeptIdList 父节点id集合
     * @param type           子节点类型, 1表示班级，2表示年级，3表示学段，4表示校区, 默认所有直接子节点
     * @return java.util.List<com.yida.data.common.core.entity.user.EduUserDept>
     * @author ZYJ
     * @date 2021/11/11 10:28
     */
    List<EduUserDept> findChildByParentAndType(List<Long> userDeptIdList, Integer type);


    List<CollectDataVO> findVisibleClassByUserId(Long staffId);


    List<ClassAttendanceDataVO> findClassAttendanceByUserId(Long staffId, LocalDate date);

    List<Object> findClassAttendanceDetailByDeptId(Long deptId, Integer type, LocalDate date);

    /**
     * 向下查询指定家校部门类型的家校部门id(可查询非直接子家校部门) 未毕业家校部门
     *
     * @param userDeptIdList 父节点id集合
     * @param type           家校部门类型 {@link UserDeptTypeEnum}
     * @return java.util.List<com.yida.data.common.core.entity.user.EduUserDept>
     * @author ZYJ
     * @date 2022/7/11 16:08
     */
    List<EduUserDept> findChildIdByParentAndType(List<Long> userDeptIdList, Integer type, List<EduUserDept> resultList);

    /**
     * 根据家校部门id查询所属学校
     *
     * @param userDeptId 根据家校部门id查询所属学校
     * @return com.yida.data.common.core.entity.system.Dept
     * @author ZYJ
     * @date 2021/11/11 10:53
     */
    Dept findSchoolByDept(Long userDeptId);

    /**
     * 查询家校部门
     *
     * @param request     分页请求
     * @param dept        查询条件
     * @param includeType 是否包含班级 {@link IncludeTypeEnum}
     * @return java.util.Map<java.lang.String, java.lang.Object>
     * @author ZYJ
     * @date 2021/11/11 10:57
     */
    Map<String, Object> findDeptList(QueryRequest request, EduUserDept dept, String includeType);

    /**
     * 家校部门树
     *
     * @param deptId 根节点Id
     * @return java.util.List
     * @author ZYJ
     * @date 2021/11/11 13:40
     */
    List getUserDeptTree(Long deptId);


    /**
     * 家校部门树
     *
     * @param deptIds 根节点Id
     * @return java.util.List
     * @author ZYJ
     * @date 2021/11/11 13:40
     */
    List getUserDeptTree(List<Long> deptIds);

    /**
     * 根据各层名称查询班级信息
     *
     * @param schoolId    学校id
     * @param campusName  学期名称
     * @param sectionName 学段名称
     * @param gradeName   年级名称
     * @param className   班级名称
     * @return java.util.Map<java.lang.String, com.yida.data.common.core.entity.user.EduUserDept>
     * @author ZYJ
     * @date 2021/11/11 13:51
     */
    Map<String, EduUserDept> findClassInfoByName(Long schoolId, String campusName, String sectionName,
        String gradeName, String className);

    /**
     * 新增学区信息(包含学段、年级和班级)
     *
     * @param saveCampusDTO 保存校区数据请求类
     * @author ZYJ
     * @date 2021/11/17 11:10
     */
    void addCampus(SaveCampusDTO saveCampusDTO);

    /**
     * 新增学段信息(包含年级和班级)
     *
     * @param sectionDTO      保存学段数据请求类
     * @param needCheckSchool 是否需要再次查询学校相关数据
     * @param bindFlag        学校是否绑定企业微信
     * @param eduApp          企业微信应用信息
     * @param bindDaHuaFlag   学校是否绑定大华
     * @author ZYJ
     * @date 2021/11/18 14:00
     */
    void addSection(SectionDTO sectionDTO, boolean needCheckSchool, boolean bindFlag, EduApp eduApp, boolean bindDaHuaFlag);


    /**
     * 新增年级信息(包含班级)
     *
     * @param saveGradeDTO 保存年级数据请求类
     * @author ZYJ
     * @date 2021/11/19 13:48
     */
    void addGrade(SaveGradeDTO saveGradeDTO);

    /**
     * 页面添加家校部门
     *
     * @param addUserDeptDTO 添加家校部门请求类
     * @author ZYJ
     * @date 2021/11/19 16:28
     */
    void addUserDept(AddUserDeptDTO addUserDeptDTO);

    /**
     * 编辑家校部门
     *
     * @param editUserDeptDTO 编辑家校部门请求类
     * @author ZYJ
     * @date 2021/11/17 17:27
     */
    void editUserDept(EditUserDeptDTO editUserDeptDTO);

    /**
     * 批量删除家校部门
     *
     * @param deptIds  家校部门id字符串
     * @param schoolId 学校id
     * @author ZYJ
     * @date 2021/11/19 17:44
     */
    void deleteUserDeptBatch(String deptIds, Long schoolId);

    /**
     * 根据学段类型查询对应的标准年级
     *
     * @param sectionType 学段类型 {@link SectionTypeEnum}
     * @return java.util.List<com.yida.data.common.core.entity.user.EduUserDeptStandardGrade>
     * @author ZYJ
     * @date 2021/11/18 17:26
     */
    List<EduUserDeptStandardGrade> listStandardGradeBySectionType(String sectionType);

    /**
     * 查询父级部门是否存在
     *
     * @param deptIdList 家校部门id集合
     * @param parentWxId 家校部门父级企业微信id
     * @return com.yida.data.common.core.entity.user.EduUserDept
     * @author ZYJ
     * @date 2021/11/22 17:53
     */
    EduUserDept getUserDeptByDeptAndWx(List<Long> deptIdList, Long parentWxId);

    /**
     * 企业微信创建家校部门
     *
     * @param userDept 创建的家校部门信息
     * @author ZYJ
     * @date 2021/11/22 17:59
     */
    void createUserDept(EduUserDept userDept);

    /**
     * 根据学校id和班级企业微信id查询当前学校下对应的班级信息
     *
     * @param schoolId  学校id
     * @param classWxId 班级企业微信id
     * @return com.yida.data.common.core.entity.user.EduUserDept
     * @author ZYJ
     * @date 2021/11/25 16:45
     */
    EduUserDept getClassBySchoolAndWx(Long schoolId, Long classWxId);

    /**
     * 根据家校部门id查询上级家校部门信息
     *
     * @param deptId 家校部门id
     * @return com.yida.data.common.core.entity.user.EduUserDept
     * @author ZYJ
     * @date 2021/11/30 10:06
     */
    EduUserDept getParentByDeptId(Long deptId);

    List<EduUserDept> getParentListByDeptId(Long deptId);

    /**
     * 批量保存家校部门
     *
     * @param saveDeptList 批量保存的家校部门数据
     * @author ZYJ
     * @date 2021/11/30 10:20
     */
    void updateBatchUserDept(List<EduUserDept> saveDeptList);

    /**
     * 递归删除家校部门
     *
     * @param deleteUserDeptDTO 企业微信回调删除本地家校部门请求类
     * @author ZYJ
     * @date 2021/11/30 10:44
     */
    void deleteUserDeptRecur(DeleteUserDeptDTO deleteUserDeptDTO);

    /**
     * 同步企业微信家校部门
     *
     * @author ZYJ
     * @date 2021/11/30 13:47
     */
    @Async(FebsConstant.ASYNC_POOL)
    void syncUserDept(Long schoolId);

    /**
     * 处理挂在学校下的家校部门
     *
     * @author ZYJ
     * @date 2021/11/30 14:10
     */
    @Async(FebsConstant.ASYNC_POOL)
    void dealNoParentUserDept();

    /**
     * 向下获取包含的班级id
     *
     * @param deptIds 父级id集合
     * @return java.util.List<java.lang.Long>
     * @author ZYJ
     * @date 2021/11/30 15:20
     */
    List<Long> listClassByDept(List<Long> deptIds);

    /**
     * 查询班级年级等信息
     *
     * @param classId 班级id
     * @return com.yida.data.system.vo.ClassInfoVO
     * @author ZYJ
     * @date 2021/11/30 16:04
     */
    ClassInfoVO getClassInfo(Long classId);

    List<Long> getUpId(List<Long> deptId);

    List<Long> getUpAndDownId(List<Long> deptId);

    List<Long> getDownId(List<Long> deptId);

    /**
     * 向上查询部门链
     *
     * @param deptId 其实部门id
     * @param type   查询到的最上级部门类型
     * @return
     */
    AllDeptInfoVO findParentUp(Long deptId, Integer type);


    List<TeacherDeptVO> listClassByStaffId(Long staffId);

    /**
     * 查询学校年级分布
     *
     * @param schoolId 学校id
     * @return cn.hutool.json.JSONArray
     * @author ZYJ
     * @date 2023/4/25 10:26
     */
    JSONArray getGradeDistribution(Long schoolId);
}
