package org.xyzh.system.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.xyzh.common.dto.menu.TbSysMenu;
import org.xyzh.common.dto.permission.TbSysPermission;
import org.xyzh.common.dto.role.TbSysRole;
import org.xyzh.common.vo.PermissionVO;

import java.util.List;

/**
 * @description PermissionMapper.java文件描述 权限数据访问层
 * @filename PermissionMapper.java
 * @author yslg
 * @copyright xyzh
 * @since 2025-09-28
 */
@Mapper
public interface PermissionMapper extends BaseMapper<TbSysPermission> {

    /**
     * @description 插入权限
     * @param permission 权限对象
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-08
     */
    int insertPermission(@Param("permission") TbSysPermission permission);

    /**
     * @description 根据ID更新权限
     * @param permission 权限对象
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-08
     */
    int updatePermission(@Param("permission") TbSysPermission permission);

    /**
     * @description 根据ID删除权限（逻辑删除）
     * @param permission 权限对象
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-08
     */
    int deletePermission(@Param("permission") TbSysPermission permission);

    /**
     * @description 根据用户ID查询权限列表
     * @param userId 用户ID
     * @return List<TbSysPermission> 权限列表
     * @author yslg
     * @since 2025-09-28
     */
    List<TbSysPermission> selectPermissionsByUserId(@Param("userId") String userId);

    /**
     * @description 根据角色ID查询权限列表
     * @param roleID 角色ID
     * @return List<TbSysPermission> 权限列表
     * @author yslg
     * @since 2025-09-28
     */
    List<TbSysPermission> selectPermissionsByRoleID(@Param("roleID") String roleID);

    /**
     * @description 根据权限编码查询权限
     * @param permissionCode 权限编码
     * @return TbSysPermission 权限信息
     * @author yslg
     * @since 2025-09-28
     */
    TbSysPermission selectByPermissionCode(@Param("permissionCode") String permissionCode);

    /**
     * @description 检查权限名称是否存在
     * @param permissionName 权限名称
     * @param excludeID 排除的权限ID
     * @return int 存在数量
     * @author yslg
     * @since 2025-09-28
     */
    int countByPermissionName(@Param("permissionName") String permissionName, @Param("excludeID") String excludeID);

    /**
     * @description 检查权限编码是否存在
     * @param permissionCode 权限编码
     * @param excludeID 排除的权限ID
     * @return int 存在数量
     * @author yslg
     * @since 2025-09-28
     */
    int countByPermissionCode(@Param("permissionCode") String permissionCode, @Param("excludeID") String excludeID);

    /**
     * @description 批量删除权限（逻辑删除）
     * @param permissionIds 权限ID列表
     * @param updater 更新人
     * @return int 影响行数
     * @author yslg
     * @since 2025-09-28
     */
    int batchDeletePermissions(@Param("permissionIds") List<String> permissionIds, @Param("updater") String updater);

    /**
     * @description 检查权限是否存在
     * @param permissionIds 权限ID列表
     * @return List<TbSysPermission> 权限列表
     * @author yslg
     * @since 2025-10-07
     */
    List<TbSysPermission> checkPermissionExists(@Param("permissionIds") List<String> permissionIds);

    /**
     * @description 查询权限
     * @param permission 权限对象
     * @return TbSysPermission 权限对象
     * @author yslg
     * @since 2025-10-08
     */
    TbSysPermission selectPermission(@Param("permission") TbSysPermission permission);

    /**
     * @description 查询权限列表
     * @param permission 权限对象
     * @return List<PermissionVO> 权限列表
     * @author yslg
     * @since 2025-10-08
     */
    List<PermissionVO> selectPermissionList(@Param("permission") PermissionVO permission);

    /**
     * @description 查询权限
     * @param permission 权限对象
     * @return PermissionVO 权限对象
     * @author yslg
     * @since 2025-10-08
     */
    PermissionVO selectPermissionVO(@Param("permission") PermissionVO permission);

    /**
     * @description 查询权限绑定菜单
     * @param permission 权限对象
     * @return List<TbSysMenu> 权限绑定菜单列表
     * @author yslg
     * @since 2025-10-08
     */
    List<TbSysMenu> selectPermissionBindMenu(@Param("permission") PermissionVO permission);

    /**
     * @description 查询权限绑定角色
     * @param permission 权限对象
     * @return List<TbSysRole> 权限绑定角色列表
     * @author yslg
     * @since 2025-10-08
     */
    List<TbSysRole> selectPermissionBindRole(@Param("permission") PermissionVO permission);

    /**
     * @description 根据模块ID查询权限列表
     * @param moduleID 模块ID
     * @return List<TbSysPermission> 权限列表
     * @author yslg
     * @since 2025-10-16
     */
    List<TbSysPermission> selectPermissionsByModuleID(@Param("moduleID") String moduleID);

    /**
     * @description 绑定权限到模块
     * @param moduleID 模块ID
     * @param permissionIds 权限ID列表
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-16
     */
    int bindPermissionsToModule(@Param("moduleID") String moduleID, @Param("permissionIds") List<String> permissionIds);

    /**
     * @description 解绑模块的权限
     * @param moduleID 模块ID
     * @param permissionIds 权限ID列表
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-16
     */
    int unbindPermissionsFromModule(@Param("moduleID") String moduleID, @Param("permissionIds") List<String> permissionIds);

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