package com.qmth.paper.library.common.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.qmth.paper.library.common.bean.dto.OrgDto;
import com.qmth.paper.library.common.entity.SysOrg;
import com.qmth.paper.library.common.entity.SysUser;

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

/**
 * <p>
 * 学校组织架构 服务类
 * </p>
 *
 * @author xf
 * @since 2021-03-23
 */
public interface SysOrgService extends IService<SysOrg> {

    /**
     * 机构树
     *
     * @return 查询到的机构
     */
    List<OrgDto> listOrgTree();

    /**
     * 获取所有机构
     *
     * @param schoolId
     * @return
     */
    List<OrgDto> listOrgAll(Long schoolId);

    boolean saveOrg(SysOrg org);

    boolean saveReportOrg(SysOrg org);

    /**
     * 根据外键查找学院信息
     *
     * @param schoolId    学校id
     * @param collegeCode 学院编号
     * @param collegeName 学院名称
     * @return 学院数据
     */
    SysOrg findByForeignKey(Long schoolId, String collegeCode, String collegeName);

    /**
     * 查询机构ids
     *
     * @param orgId
     * @return
     */
    List<Long> findCollegeIds(Long orgId);

    /**
     * 递归树查询(同级及以上)
     *
     * @param orgId
     * @param school
     * @param college
     * @return
     */
    List<SysOrg> findByConnectByParentId(Long orgId, Boolean school, Boolean college);

    /**
     * 递归树查询(同级及以下)
     *
     * @param orgId
     * @return
     */
    List<SysOrg> findByConnectByRootOrgId(Long orgId);

    /**
     * 查询符合条件的机构
     *
     * @return 符合条件的机构
     */
    List<SysOrg> findDeepByOrgIdAndType(String orgType);

    /**
     * 根据机构id查询他的父亲们
     *
     * @param orgId 机构id
     * @return 父亲们
     */
    List<SysOrg> findParentsByOrgId(Long orgId);

    /**
     * 根据用户id查找其所在的机构和下属机构集合
     *
     * @param userId 用户id
     * @return 机构id集合
     */
    Set<Long> findDeepOrgIdListByUserId(Long userId);

    /**
     * 根据机构集合查询其和其下属机构id集合
     *
     * @param orgIdList 机构id集合
     * @return 机构id集合
     */
    Set<Long> findDeepOrgIdListByOrgIdList(List<Long> orgIdList);

    /**
     * 根据机构信息集合创建或获取机构
     *
     * @param orgInfoList 机构信息集合（eg. 化学学院/核化学（院系）/放射化学  ||  化学学院/核化学（院系）/聚变化学）
     * @param requestUser 请求的用户
     * @return 根据机构信息创建或查询到的最后一级机构id
     * （
     * eg。
     * k -> 化学学院 v -> 111111111111111
     * k -> 化学学院/核化学（院系） v -> 111111111111112
     * k -> 化学学院/核化学（院系）/放射化学 v -> 111111111111113
     * k -> 化学学院/核化学（院系）/聚变化学 v -> 111111111111114
     * ）
     */
    Map<String, Long> createOrGetOrgByOrgInfo(List<String> orgInfoList, SysUser requestUser);

    /**
     * 根据机构id查询学院级机构
     *
     * @param orgId 机构id（课程所在教研室）
     * @return 开课学院
     */
    SysOrg findCollegeLevelOrgByOrgId(Long orgId);

    /**
     * 查询学院级别机构集合
     *
     * @param schoolId 学校id
     * @return 学院级机构集合
     */
    List<SysOrg> findCollegeLevelOrgList(Long schoolId);
}
