package com.keyware.shandan.bianmu.service;

import com.keyware.shandan.bianmu.entity.DirectoryVo;
import com.keyware.shandan.bianmu.entity.MetadataBasicVo;
import com.keyware.shandan.bianmu.enums.ReviewStatus;
import com.keyware.shandan.common.service.IBaseService;
import com.keyware.shandan.system.entity.SysFile;
import com.keyware.shandan.system.entity.SysOrg;
import com.keyware.shandan.system.entity.SysUser;
import org.apache.ibatis.session.ResultHandler;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

/**
 * <p>
 * 目录表 服务类
 * </p>
 *
 * @author GuoXin
 * @since 2021-06-01
 */
public interface DirectoryService extends IBaseService<DirectoryVo, String> {

    /**
     * 获取树的子节点
     *
     * @param vo 父节点ID
     * @return
     */
    List<DirectoryVo> treeChildren(DirectoryVo vo);

    /**
     * 获取目录下的数据资源
     *
     * @param id 目录ID
     * @return
     */
    List<MetadataBasicVo> directoryMetadata(String id);

    /**
     * 获取目录下所有的数据资源，包含子级
     *
     * @param id 目录ID
     * @return
     */
    List<MetadataBasicVo> directoryAllMetadata(String id);

    /**
     * 获取目录的所有父级目录
     *
     * @param dir
     * @return
     */
    List<DirectoryVo> parentLists(DirectoryVo dir);

    /**
     * 获取目录的所有子节点
     *
     * @param dir
     * @return
     */
    List<DirectoryVo> childrenLists(DirectoryVo dir);

    /**
     * 获取目录的所有子节点和文件
     * @param dir
     * @return
     */
    List<DirectoryVo> allChildrenLists(DirectoryVo dir);

    /**
     * 获取目录的所有子节点
     *
     * @param dir
     * @param status
     * @return
     */
    List<DirectoryVo> childrenLists(DirectoryVo dir, ReviewStatus status);

    /**
     * 根据路径查询目录
     *
     * @param path 查询路径
     * @return 目录数据
     */
    DirectoryVo getByPath(String path);

    /**
     * 自动创建目录根据部门
     *
     * @param org 部门
     */
    DirectoryVo autoCreateDirByOrg(SysOrg org) throws Exception;

    /**
     * 查询与部门对应的目录
     * 目录与部门对应的依据为：目录名称与部门名称相同，且目录拥有者ID与部门ID相同
     *
     * @param org 部门
     * @return
     */
    DirectoryVo getCreateByOrgDir(SysOrg org);

    /**
     * 将指定用户下的数据移动至其部门下
     *
     * @param userId
     */
    void moveDataToOrg(SysUser userId);

    void moveDataToNewOrg(Collection<SysOrg> orgs, SysOrg newOrg);

    /**
     * 移除指定目录下的非目录结构类型的目录，如数据表类型的目录、文件类型的目录、软连接类型的目录
     * @param directoryId 父级目录ID
     * @param resourceId 数据资源ID
     */
    void deleteByDirectoryIdAndResourceId(Serializable directoryId, Serializable resourceId);

    /**
     * 保存文件类型的目录
     * @param file
     * @return
     */
    boolean saveFileDIr(SysFile file, String parentId);

    List<DirectoryVo> childrenListByParent(String parentId);

    void handlerAllChildrenListById(String dirId, ResultHandler<DirectoryVo> handler);
}
