package org.xyzh.api.system.dept;

import java.util.List;

import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.dto.dept.TbSysDept;
import org.xyzh.common.dto.dept.TbSysDeptRole;
import org.xyzh.common.dto.role.TbSysRole;

/**
 * @description    DepartmentService.java文件描述 部门服务接口
 * @filename    DepartmentService.java
 * @author    yslg
 * @copyright xyzh
 * @ since 2025-09-28
 */
public interface DepartmentService {
    
    /**
     * @description    查询所有部门
     * @return    ResultDomain<TbSysDept> 部门列表
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysDept> getAllDepartments();

    /**
     * @description    查询部门列表
     * @param    filter 过滤条件
     * @return    ResultDomain<TbSysDept> 部门列表
     * @author    yslg
     * @since 2025-10-06
     */
    ResultDomain<TbSysDept> getDeptList(TbSysDept filter);
    
    /**
     * @description    根据ID查询部门
     * @param deptId 部门ID
     * @return    ResultDomain<TbSysDept> 部门信息
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysDept> getDepartmentById(String deptId);
    
    /**
     * @description    根据父部门ID查询子部门
     * @param parentId 父部门ID
     * @return    ResultDomain<TbSysDept> 子部门列表
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysDept> getDepartmentsByParentId(String parentId);
    
    /**
     * @description    创建部门
     * @param department 部门信息
     * @return ResultDomain<TbSysDept> 创建结果
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysDept> createDepartment(TbSysDept department);
    
    /**
     * @description    更新部门
     * @param department 部门信息
     * @return ResultDomain<TbSysDept> 更新结果
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysDept> updateDepartment(TbSysDept department);
    
    /**
     * @description    删除部门
     * @param deptId 部门ID
     * @return ResultDomain<TbSysDept> 删除结果
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysDept> deleteDepartment(String deptId);
    
    /**
     * @description    检查部门名称是否存在
     * @param deptName 部门名称
     * @param excludeId 排除的部门ID（用于更新时排除自身）
     * @return ResultDomain<Boolean> 是否存在
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<Boolean> checkDepartmentNameExists(String deptName, String excludeId);

    /**
     * @description    查询部门绑定角色
     * @param deptId 部门ID
     * @return ResultDomain<TbSysRole> 角色信息
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysRole> getDeptByRole(String deptId);

    /**
     * @description    查询部门绑定角色
     * @return ResultDomain<TbSysDeptRole> 角色信息
     * @author    yslg
     * @since 2025-10-06
     */
    ResultDomain<TbSysDeptRole> getDeptByRoleList();

    /**
     * @description    绑定部门角色
     * @param deptIDs 部门ID列表
     * @param roleIDs 角色ID列表
     * @return ResultDomain<TbSysDeptRole> 部门角色信息
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysDeptRole> bindDeptRole(List<String> deptIDs, List<String> roleIDs);

    /**
     * @description    解绑部门角色
     * @param deptIDs 部门ID列表
     * @param roleIDs 角色ID列表
     * @return ResultDomain<TbSysDeptRole> 部门角色信息
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysDeptRole> unbindDeptRole(List<String> deptIDs, List<String> roleIDs);
}
