package cn.nianxx.thhotel.platform.access.repository;

import cn.nianxx.thhotel.platform.access.domain.PlatformRolePermissionEntity;
import cn.nianxx.thhotel.platform.access.domain.PlatformUserRoleEntity;
import cn.nianxx.thhotel.platform.common.dto.PlatformPageSnapshot;
import cn.nianxx.thhotel.platform.access.domain.PlatformPermissionEntity;
import cn.nianxx.thhotel.platform.access.domain.PlatformRoleEntity;
import java.util.List;
import java.util.Optional;

/**
 * 平台角色权限仓储。负责内置权限、角色和用户授权关系的持久化。
 */
public interface PlatformAccessRepository {

    /**
     * 按角色代码查询角色。
     */
    Optional<PlatformRoleEntity> findRoleByCode(String roleCode);

    /**
     * 按角色内部 ID 查询角色。
     */
    Optional<PlatformRoleEntity> findRoleById(Long roleId);

    /**
     * 按权限代码查询权限。
     */
    Optional<PlatformPermissionEntity> findPermissionByCode(String permissionCode);

    /**
     * 按权限内部 ID 查询权限。
     */
    Optional<PlatformPermissionEntity> findPermissionById(Long permissionId);

    /**
     * 管理后台分页查询角色。
     */
    PlatformPageSnapshot<PlatformRoleEntity> queryRoles(String keyword, String roleStatus, int pageNum, int pageSize);

    /**
     * 查询全部角色。
     */
    List<PlatformRoleEntity> listAllRoles();

    /**
     * 查询指定角色 ID 列表对应角色。
     */
    List<PlatformRoleEntity> listRolesByIds(List<Long> roleIds);

    /**
     * 查询全部权限。
     */
    List<PlatformPermissionEntity> listAllPermissions();

    /**
     * 查询指定用户 ID 列表对应用户角色关系。
     */
    List<PlatformUserRoleEntity> listUserRolesByUserIds(List<Long> userIds);

    /**
     * 查询指定角色 ID 列表对应角色权限关系。
     */
    List<PlatformRolePermissionEntity> listRolePermissionsByRoleIds(List<Long> roleIds);

    /**
     * 查询单个角色的权限关系。
     */
    List<PlatformRolePermissionEntity> listRolePermissionsByRoleId(Long roleId);

    /**
     * 统计角色关联用户数量。
     */
    long countUsersByRoleId(Long roleId);

    /**
     * 统计角色关联权限数量。
     */
    long countPermissionsByRoleId(Long roleId);

    /**
     * 新增角色。
     */
    void insertRole(PlatformRoleEntity role);

    /**
     * 更新角色。
     */
    void updateRole(PlatformRoleEntity role);

    /**
     * 新增权限。
     */
    void insertPermission(PlatformPermissionEntity permission);

    /**
     * 更新权限。
     */
    void updatePermission(PlatformPermissionEntity permission);

    /**
     * 确保角色权限关系存在。
     */
    void ensureRolePermission(Long roleId, Long permissionId);

    /**
     * 同步内置角色权限矩阵，确保预期权限存在并删除不再属于矩阵的旧关系。
     */
    void syncRolePermissions(Long roleId, List<Long> permissionIds);

    /**
     * 确保用户角色关系存在。
     */
    void ensureUserRole(Long userId, Long roleId);

    /**
     * 覆盖指定用户的角色关系。
     */
    void replaceUserRoles(Long userId, List<Long> roleIds);

    /**
     * 覆盖指定角色的权限关系。
     */
    void replaceRolePermissions(Long roleId, List<Long> permissionIds);

    /**
     * 查询用户全部启用权限码。
     */
    List<String> listActivePermissionCodesByUserId(Long userId);
}
