package com.yida.data.system.service;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yida.data.common.core.common.ResultBean;
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.EduHotWord;
import com.yida.data.common.core.entity.system.EduLabel;
import com.yida.data.system.dto.AgentSchoolSaveDTO;
import com.yida.data.system.dto.AgentSchoolSelectPageDTO;
import com.yida.data.system.dto.SchoolInformationDTO;
import com.yida.data.system.dto.SchoolPageDTO;
import com.yida.data.system.vo.AgentSchoolDetailVO;
import com.yida.data.system.vo.AgentSchoolSelectPageVO;
import com.yida.data.system.vo.AllDeptInfoVO;
import com.yida.data.system.vo.SchoolClassInfoVO;
import org.springframework.scheduling.annotation.Async;

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

/**
 * @author MrBird
 */
public interface IDeptService extends IService<Dept> {

    /**
     * 查询该部门下 wxId所代表的家校部门（不包含该部门）
     */
    Dept getSchoolDeptByDeptAndWx(List<Long> deptId, Long wxId);

    /**
     * 查询该部门下 wxId所代表的通讯录部门（不包含该部门）
     */
    Dept getSysDeptByDeptAndWx(List<Long> deptId, Long wxId);

    /**
     * 区域内所有学校
     */
    List<Dept> getSchoolByArea(Long areaId, String schoolName);

    /**
     * 获取所有子部门
     */
    List<Dept> findListByParent(List<Long> deptId, Integer type);

    List<Dept> findChildByParent(Long deptgId, Integer type);

    List<Dept> findChildByParentAndType(List<Long> deptgId, Integer type);

    Dept findSchooleByDept(Long deptId);

    /**
     * 根据部门id向上查询到年级
     *
     * @param deptId
     * @return
     */
    Dept findGradeByDept(Long deptId);

    /**
     * 获取部门信息
     *
     * @param request request
     * @param dept    dept
     * @return 部门信息
     */
    Map<String, Object> findDepts(QueryRequest request, Dept dept);

    /**
     * 获取部门列表
     *
     * @param dept    dept
     * @param request request
     * @return 部门列表
     */
    List<Dept> findDepts(Dept dept, QueryRequest request);

    /**
     * 创建部门
     *
     * @param dept dept
     */
    void createDept(Dept dept);

    /**
     * 更新部门
     *
     * @param dept dept
     */
    void updateDept(Dept dept);

    /**
     * 删除部门
     *
     * @param deptIds 部门id数组
     */
    void deleteDepts(String[] deptIds);

    /**
     * 递归删除部门
     */
    void deleteDeptRecur(List<Long> deptId, Dept scool);

    List getDeptTree(Long deptId, Integer type);

    List getDeptTree(List<Long> deptIds);

    Dept getParentById(Long deptId);

    List<Long> listClassByDept(List<Long> ids);

    /**
     * 获取下属部门（非家校部门）
     */
    Dept getDeptBySchoolAndName(List<Long> deptId, String deptName);

    /**
     * 获取学校和区域信息
     */
    SchoolClassInfoVO getSchoolAreaInfo(Long id);

    /**
     * 向上查询父级部门
     */
    AllDeptInfoVO findParentUp(Long deptId, Integer type);

    /**
     * 通过区域分页查询部分
     */
    IPage<Dept> getPageSchoolByArea(Long areaId, String schoolName, Page page);

    /**
     * 通过学校与微信id 查询班级
     */
    Dept getClassBySchoolAndWx(Long schoolId, Long classWxId);

    /**
     * 同步企业微信部门
     */
    @Async(FebsConstant.ASYNC_POOL)
    void syncQywxDept(Long schoolId);

    /**
     * 处理挂在学校下的部门
     */
    void dealNoParentDept();

    /**
     * 查询代理商管理的学校列表数据
     *
     * @param agentSchoolSelectPageDTO 查询代理商管理的学校列表数据请求类
     * @return com.yida.data.common.core.common.ResultBean<com.baomidou.mybatisplus.core.metadata.IPage <
        * com.yida.data.system.vo.AgentSchoolVO>>
     * @author ZYJ
     * @date 2021/9/27 17:05
     */
    ResultBean<IPage<AgentSchoolSelectPageVO>> listAgentSchoolPage(AgentSchoolSelectPageDTO agentSchoolSelectPageDTO);

    /**
     * 代理商保存学校数据
     *
     * @param agentSchoolSaveDTO 代理商保存学校请求类
     * @return com.yida.data.common.core.common.ResultBean<java.lang.String>
     * @author ZYJ
     * @date 2021/9/27 18:00
     */
    ResultBean<String> saveAgentSchool(AgentSchoolSaveDTO agentSchoolSaveDTO);

    /**
     * 查询学校信息
     *
     * @param schoolId 学校id
     * @return com.yida.data.common.core.common.ResultBean<com.yida.data.system.vo.AgentSchoolDetailVO>
     * @author ZYJ
     * @date 2021/9/27 20:54
     */
    ResultBean<AgentSchoolDetailVO> getAgentSchoolInfo(Long schoolId);

    /**
     * 启用或停用学校
     *
     * @param schoolId     学校id
     * @param enableStatus 需要设置的启用或停用状态. 启用: 1, 停用: 0
     * @return com.yida.data.common.core.common.ResultBean<java.lang.String>
     * @author ZYJ
     * @date 2021/9/28 9:46
     */
    ResultBean<String> updateEnableStatus(Long schoolId, Integer enableStatus);

    void saveOrUpdateDeptSchool(SchoolInformationDTO information);

    Page<SchoolInformationDTO> findSchoolListByDeptId(Long deptId, String schoolName, Integer schoolType,
        Integer natureType, String address, String tag, Page<SchoolInformationDTO> page, Integer schoolOwnership);

    Page<SchoolInformationDTO> findSchoolPageList(String schoolName, List<Integer> schoolType, List<Integer> natureType,
        Page<SchoolInformationDTO> page, String tag, Long deptId, List<Integer> schoolOwnership);

    Page<SchoolInformationDTO> findSchoolByAddress(Page<SchoolInformationDTO> page, String address, Long deptId);

    Page<EduLabel> findDeptLabelList(Page<EduLabel> page, Long deptId, Integer type, String label);

    void saveOrUpdateLabel(EduLabel label);

    void removeLabel(Long id);

    List<EduHotWord> findHotWord(Integer num, Integer type, Long deptId);

    /**
     * 根据名称和类型查询教育局学校列表
     *
     * @param dto 查询教育局学校列表请求类
     * @return com.baomidou.mybatisplus.core.metadata.IPage<com.yida.data.system.dto.SchoolInformationDTO>
     * @author ZYJ
     * @date 2022/7/4 16:13
     */
    IPage<SchoolInformationDTO> listSchoolPage(SchoolPageDTO dto);


    /**
     * 根据子部门查询父级IDList
     *
     * @param deptIds
     * @return
     */
    List<Dept> findParentDeptByChild(List<Long> deptIds);
}
