package org.xyzh.api.system.module;

import org.xyzh.common.core.page.PageParam;
import org.xyzh.common.dto.system.TbSysModule;
import org.xyzh.common.core.domain.ResultDomain;

import java.util.List;

/**
 * @description 系统模块服务接口
 * @filename ModuleService.java
 * @author yslg
 * @copyright xyzh
 * @since 2025-10-16
 */
public interface ModuleService {

    /**
     * @description 查询模块列表
     * @param filter 过滤条件
     * @return ResultDomain<TbSysModule> 模块列表
     * @author yslg
     * @since 2025-10-16
     */
    ResultDomain<TbSysModule> getModuleList(TbSysModule filter);

    /**
     * @description 根据模块ID查询模块信息
     * @param moduleID 模块ID
     * @return ResultDomain<TbSysModule> 模块信息
     * @author yslg
     * @since 2025-10-16
     */
    ResultDomain<TbSysModule> getModuleById(String moduleID);

    /**
     * @description 根据模块代码查询模块信息
     * @param code 模块代码
     * @return ResultDomain<TbSysModule> 模块信息
     * @author yslg
     * @since 2025-10-16
     */
    ResultDomain<TbSysModule> getModuleByCode(String code);

    /**
     * @description 查询启用的模块列表
     * @return ResultDomain<TbSysModule> 启用的模块列表
     * @author yslg
     * @since 2025-10-16
     */
    ResultDomain<TbSysModule> getActiveModules();

    /**
     * @description 创建模块
     * @param module 模块信息
     * @return ResultDomain<TbSysModule> 创建结果
     * @author yslg
     * @since 2025-10-16
     */
    ResultDomain<TbSysModule> createModule(TbSysModule module);

    /**
     * @description 更新模块
     * @param module 模块信息
     * @return ResultDomain<TbSysModule> 更新结果
     * @author yslg
     * @since 2025-10-16
     */
    ResultDomain<TbSysModule> updateModule(TbSysModule module);

    /**
     * @description 删除模块
     * @param moduleID 模块ID
     * @return ResultDomain<Boolean> 删除结果
     * @author yslg
     * @since 2025-10-16
     */
    ResultDomain<Boolean> deleteModule(String moduleID);

    /**
     * @description 批量删除模块
     * @param moduleIDs 模块ID列表
     * @return ResultDomain<Boolean> 删除结果
     * @author yslg
     * @since 2025-10-16
     */
    ResultDomain<Boolean> batchDeleteModules(List<String> moduleIDs);

    /**
     * @description 更新模块状态
     * @param moduleID 模块ID
     * @param status 状态
     * @return ResultDomain<Boolean> 更新结果
     * @author yslg
     * @since 2025-10-16
     */
    ResultDomain<Boolean> updateModuleStatus(String moduleID, Integer status);

    /**
     * @description 更新模块排序
     * @param moduleID 模块ID
     * @param orderNum 排序号
     * @return ResultDomain<Boolean> 更新结果
     * @author yslg
     * @since 2025-10-16
     */
    ResultDomain<Boolean> updateModuleOrder(String moduleID, Integer orderNum);

    /**
     * @description 分页查询模块列表
     * @param filter 过滤条件
     * @param pageParam 分页参数
     * @return ResultDomain<TbSysModule> 模块列表
     * @author yslg
     * @since 2025-10-16
     */
    ResultDomain<TbSysModule> getModuleListPage(TbSysModule filter, PageParam pageParam);

    /**
     * @description 统计模块数量
     * @param filter 过滤条件
     * @return ResultDomain<Long> 模块数量
     * @author yslg
     * @since 2025-10-16
     */
    ResultDomain<Long> countModules(TbSysModule filter);

    /**
     * @description 检查模块代码是否存在
     * @param code 模块代码
     * @param excludeID 排除的模块ID
     * @return ResultDomain<Boolean> 是否存在
     * @author yslg
     * @since 2025-10-16
     */
    ResultDomain<Boolean> checkModuleCodeExists(String code, String excludeID);

    /**
     * @description 绑定权限到模块
     * @param moduleID 模块ID
     * @param permissionIds 权限ID列表
     * @return ResultDomain<Boolean> 绑定结果
     * @author yslg
     * @since 2025-10-16
     */
    ResultDomain<Boolean> bindPermissionsToModule(String moduleID, List<String> permissionIds);

    /**
     * @description 解绑模块的权限
     * @param moduleID 模块ID
     * @param permissionIds 权限ID列表
     * @return ResultDomain<Boolean> 解绑结果
     * @author yslg
     * @since 2025-10-16
     */
    ResultDomain<Boolean> unbindPermissionsFromModule(String moduleID, List<String> permissionIds);

    /**
     * @description 获取模块的权限列表
     * @param moduleID 模块ID
     * @return ResultDomain<List<String>> 权限ID列表
     * @author yslg
     * @since 2025-10-16
     */
    ResultDomain<List<String>> getModulePermissions(String moduleID);

    /**
     * @description 批量绑定权限到模块
     * @param moduleID 模块ID
     * @param permissionIds 权限ID列表
     * @return ResultDomain<Boolean> 绑定结果
     * @author yslg
     * @since 2025-10-16
     */
    ResultDomain<Boolean> batchBindPermissionsToModule(String moduleID, List<String> permissionIds);

    /**
     * @description 批量解绑模块的权限
     * @param moduleID 模块ID
     * @param permissionIds 权限ID列表
     * @return ResultDomain<Boolean> 解绑结果
     * @author yslg
     * @since 2025-10-16
     */
    ResultDomain<Boolean> batchUnbindPermissionsFromModule(String moduleID, List<String> permissionIds);
}
