"""RBAC 管理服务接口。"""

from abc import ABC, abstractmethod

from fastapi_modules.fastapi_leaudit.domian.Dto.rbacAdminDto import (
    RoleAccessSaveDTO,
    RoleCreateDTO,
    RolePermissionsBatchDTO,
    RoleRoutesUpdateDTO,
    RoleUpdateDTO,
)
from fastapi_modules.fastapi_leaudit.domian.vo.rbacAdminVo import (
    OrganizationTreeVO,
    RoleAccessSaveVO,
    RoleListVO,
    RolePermissionsVO,
    RoleRoutesVO,
    RoleRouteUpdateResultVO,
    RoleVO,
    RoutePermissionsVO,
    RouteVO,
    UserListVO,
    UserRolesVO,
)


class IRbacAdminService(ABC):
    """RBAC 管理服务接口。"""

    @abstractmethod
    async def ListRoles(self, CurrentUserId: int, Page: int, PageSize: int, RoleKey: str | None, RoleName: str | None, IncludeSystem: bool) -> RoleListVO:
        """查询角色列表。"""
        ...

    @abstractmethod
    async def CreateRole(self, CurrentUserId: int, Body: RoleCreateDTO) -> RoleVO:
        """创建角色。"""
        ...

    @abstractmethod
    async def UpdateRole(self, CurrentUserId: int, RoleId: int, Body: RoleUpdateDTO) -> RoleVO:
        """更新角色。"""
        ...

    @abstractmethod
    async def DeleteRole(self, CurrentUserId: int, RoleId: int, Force: bool) -> None:
        """删除角色。"""
        ...

    @abstractmethod
    async def ListUsers(self, CurrentUserId: int, Page: int, PageSize: int, Area: str | None, NickName: str | None) -> UserListVO:
        """查询用户列表。"""
        ...

    @abstractmethod
    async def GetOrganizationTree(self, CurrentUserId: int, IncludeUsers: bool, RootUuid: str | None) -> OrganizationTreeVO:
        """查询组织树。"""
        ...

    @abstractmethod
    async def ListRoleUsers(self, CurrentUserId: int, RoleId: int, Page: int, PageSize: int, Area: str | None, UserName: str | None) -> UserListVO:
        """查询指定角色下的用户列表。"""
        ...

    @abstractmethod
    async def AssignUserRoles(self, CurrentUserId: int, UserId: int, RoleIds: list[int]) -> UserRolesVO:
        """为用户分配角色。"""
        ...

    @abstractmethod
    async def RevokeUserRole(self, CurrentUserId: int, UserId: int, RoleId: int) -> None:
        """移除用户角色。"""
        ...

    @abstractmethod
    async def GetUserRoles(self, CurrentUserId: int, UserId: int) -> UserRolesVO:
        """查询用户角色。"""
        ...

    @abstractmethod
    async def ListAllRoutes(self, CurrentUserId: int, Format: str, IncludeHidden: bool) -> list[RouteVO]:
        """查询全部可管理路由。"""
        ...

    @abstractmethod
    async def GetRoleRoutes(self, CurrentUserId: int, RoleId: int) -> RoleRoutesVO:
        """查询角色路由授权。"""
        ...

    @abstractmethod
    async def UpdateRoleRoutes(self, CurrentUserId: int, RoleId: int, Body: RoleRoutesUpdateDTO) -> RoleRouteUpdateResultVO:
        """更新角色路由授权。"""
        ...

    @abstractmethod
    async def GetRolePermissions(self, CurrentUserId: int, RoleId: int) -> RolePermissionsVO:
        """查询角色权限授权。"""
        ...

    @abstractmethod
    async def SaveRolePermissions(self, CurrentUserId: int, Body: RolePermissionsBatchDTO) -> RolePermissionsVO:
        """保存角色权限授权。"""
        ...

    @abstractmethod
    async def SaveRoleAccess(self, CurrentUserId: int, RoleId: int, Body: RoleAccessSaveDTO) -> RoleAccessSaveVO:
        """原子保存角色菜单与接口权限。"""
        ...

    @abstractmethod
    async def GetRoutePermissions(self, CurrentUserId: int, RouteId: int) -> RoutePermissionsVO:
        """查询路由关联权限定义。"""
        ...
