package com.qmth.teachcloud.common.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.qmth.teachcloud.common.bean.dto.OrgDto;
import com.qmth.teachcloud.common.entity.SysOrg;
import com.qmth.teachcloud.common.entity.SysUser;
import com.qmth.teachcloud.common.enums.OrgTypeEnum;
import com.qmth.teachcloud.common.enums.userPush.SpecialPrivilegeEnum;

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

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

    List<OrgDto> listOrgTree(SpecialPrivilegeEnum specialPrivilegeEnum);

    /**
     * 获取所有机构
     *
     * @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);

    /**
     * 查询或新建学院
     * 根据学院名称查询数据库是否有该开课学院，有则查询id，没有则新增并取出id
     *
     * @param schoolId    学校id
     * @param collegeName 学院名称
     * @return 查询或新增的开课学院id
     */
    Long searchOrInsert(Long schoolId, String collegeName);

    /**
     * 根据机构类型查找用户
     *
     * @param schoolId
     * @param orgId
     * @param orgTypeEnum
     * @return
     */
    List<SysUser> findUserByOrgType(Long schoolId, Long orgId, OrgTypeEnum orgTypeEnum);

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

    /**
     * 递归树查询(同级及以上)
     *
     * @param orgId
     * @param orgType
     * @return
     */
    List<SysOrg> findByJxzyyConnectByParentId(Long orgId, OrgTypeEnum orgType);

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

    /**
     * 查询符合条件的机构
     *
     * @param orgTypeEnum 机构类型
     * @param orgId       某机构下级的全部符合条件的机构
     * @param auth        使用当前用户所在机构数据权限的机构
     * @return 符合条件的机构
     */
    List<SysOrg> findDeepByOrgIdAndType(OrgTypeEnum orgTypeEnum, Long orgId, boolean auth);

    /**
     * 根据机构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);

    /**
     *  根据ID查询
     * @param useOrgIds id集合
     * @return list
     */
    List<SysOrg> findByOrgIds(List<Long> useOrgIds);
}
