package org.xyzh.api.system.permission;

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

import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.dto.permission.TbSysPermission;
import org.xyzh.common.dto.role.TbSysRolePermission;
import org.xyzh.common.vo.PermissionVO;
import org.xyzh.common.dto.menu.TbSysMenuPermission;

/**
 * @description    PermissionRemoteService.java文件描述 权限远程服务接口
 * @filename    PermissionRemoteService.java
 * @author    yslg
 * @copyright xyzh
 * @since 2025-09-26
 */

public interface PermissionService {

    /**
     * @description    创建权限
     * @param    permission 权限对象
     * @return    ResultDomain<TbSysPermission> 创建结果
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysPermission> createPermission(TbSysPermission permission);

    /**
     * @description    获取权限
     * @param    permission 权限对象
     * @return    ResultDomain<PermissionVO> 权限对象
     * @author    yslg
     * @since 2025-10-08
     */
    ResultDomain<PermissionVO> getPermissionVO(PermissionVO permission);

    /**
     * @description    更新权限
     * @param    permission 权限对象
     * @return    ResultDomain<TbSysPermission> 更新结果
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysPermission> updatePermission(TbSysPermission permission);

    /**
     * @description    删除权限
     * @param    permissionId 权限ID
     * @return    ResultDomain<TbSysPermission> 删除结果
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysPermission> deletePermission(String permissionId);

    // ----------------------角色权限管理--------------------------
    // 角色权限绑定
    ResultDomain<TbSysRolePermission> bindRolePermission(String roleId, String permissionId);
    ResultDomain<TbSysRolePermission> batchBindRolePermission(List<String> roleIds, List<String> permissionIds);
    // 角色权限解绑
    ResultDomain<TbSysRolePermission> unbindRolePermission(String roleId, String permissionId);
    ResultDomain<TbSysRolePermission> batchUnbindRolePermission(List<String> roleIds, List<String> permissionIds);

    // ----------------------菜单权限管理--------------------------
    // 菜单权限绑定
    ResultDomain<TbSysMenuPermission> bindMenuPermission(String menuId, String permissionId);
    ResultDomain<TbSysMenuPermission> batchBindMenuPermission(List<String> menuIds, List<String> permissionIds);
    // 菜单权限解绑
    ResultDomain<TbSysMenuPermission> unbindMenuPermission(String menuId, String permissionId);
    ResultDomain<TbSysMenuPermission> batchUnbindMenuPermission(List<String> menuIds, List<String> permissionIds);

    /**
     * @description    检查权限名称是否存在
     * @param    permissionName 权限名称
     * @param    excludeId 排除的权限ID（用于更新时排除自身）
     * @return    ResultDomain<Boolean> 是否存在
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<Boolean> checkPermissionNameExists(String permissionName, String excludeId);

    /**
     * @description    检查权限编码是否存在
     * @param    permissionCode 权限编码
     * @param    excludeId 排除的权限ID（用于更新时排除自身）
     * @return    ResultDomain<Boolean> 是否存在
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<Boolean> checkPermissionCodeExists(String permissionCode, String excludeId);

    /**
     * @description    修改权限状态
     * @param    permissionId 权限ID
     * @param    status 新状态
     * @return    ResultDomain<TbSysPermission> 修改结果
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysPermission> changePermissionStatus(String permissionId, Integer status);

    /**
     * @description    获取所有权限
     * @return    ResultDomain<TbSysPermission> 权限列表
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysPermission> getAllPermissions();

    /**
     * @description    根据权限ID查询权限
     * @param    permissionId 权限ID
     * @return    ResultDomain<TbSysPermission> 权限信息
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysPermission> getPermissionById(String permissionId);

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

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

    /**
     * @description    根据角色ID查询权限列表
     * @param    roleId 角色ID
     * @return    ResultDomain<TbSysPermission> 权限列表
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysPermission> getPermissionsByRoleId(String roleId);


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

    /**
     * @description    查询权限绑定列表
     * @param    permission 权限对象
     * @return    ResultDomain<PermissionVO> 权限绑定列表
     * @author    yslg
     * @since 2025-10-08
     */
    ResultDomain<PermissionVO> listPermissionBinding(PermissionVO permission);
}
