package com.sdtool.common.api;

import com.sdtool.common.entity.site.ERPTokenUser;
import com.sdtool.common.entity.system.*;
import com.sweetfish.service.RetResult;
import com.sweetfish.source.PageFlipper;
import org.rex.RMap;

import java.util.List;

public interface PermissionService extends ScriptService {

    void writeRedisRoleMenu(long roleId,
                            List<RoleMenu> roleMenuList,
                            List<RoleMenu> roleActionList,
                            long supplierCode);

    /**
     * 在redis中构造角色、角色菜单、角色功能等缓存
     * 系统启动的时候做一次，然后修改菜单的时候需要手工进行处理，否则菜单权限不正确
     */
    int buildRoleCache(boolean sync, String dataSourceId, long supplierCode);

    /**
     * 检查用户权限
     *
     * @param userInfo     用户信息
     * @param moduleId     模块
     * @param actionId     操作
     * @param dataSourceId 分库
     * @param supplierCode 分表
     * @return 是否有权限
     */
    Boolean checkUserAuth(ERPTokenUser userInfo, long moduleId, long actionId, String dataSourceId, long supplierCode);

    /**
     * 判断用户角色是否有某个字符串描述的权限
     *
     * @param user         用户
     * @param permission   权限描述，单个权限
     * @param dataSourceId 分库
     * @param supplierCode 分表
     * @return 是否有权限
     */
    int ifPermission(ERPTokenUser user, String permission, List<UserRole> srcRoleList, String dataSourceId, long supplierCode);

    /**
     * 判断用户角色是否有某个字符串描述的权限
     *
     * @param user         用户
     * @param permissions  权限描述，多个使用|分割
     * @param dataSourceId 分库
     * @param supplierCode 分表
     * @return 是否有权限
     */
    String ifPermissionList(ERPTokenUser user, String permissions, String dataSourceId, long supplierCode);

    RetResult<Menu> reindexRoleMenuCache(ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    RetResult<List<Role>> queryMenuRoles(long idMenu, PageFlipper pageFlipper, String dataSourceId, long supplierCode);

    RetResult<List<LoginUser>> queryRoleUsers(long idRole, PageFlipper pageFlipper, String dataSourceId, long supplierCode);

    //region 系统数据权限

    /**
     * 获取数据权限管理人列表
     *
     * @param searchData   查询条件
     * @param dataSourceId 分库
     * @param supplierCode 分表
     * @return 管理人列表
     */
    @SuppressWarnings({"rawtypes"})
    RetResult<List<LoginUser>> getDataPurviewControlerList(RMap searchData, PageFlipper pageFlipper, String dataSourceId, long supplierCode);

    /**
     * 获取数据权限列表
     * 前端需要做左右布局，左边为权限标识列表，右边为数据
     * 增加时选权限、选控制人，然后选操作人列表
     *
     * @param searchData   查询条件
     * @param dataSourceId 分库
     * @param supplierCode 分表
     * @return 权限数据列表
     */
    @SuppressWarnings("rawtypes")
    RetResult<List<DataPurview>> getDataPurviewList(RMap searchData, String dataSourceId, long supplierCode);

    /**
     * 增加数据权限
     *
     * @param dataPurviewList 权限列表
     * @param currentUser     操作人
     * @param dataSourceId    分库
     * @param supplierCode    分表
     * @return 操作信息
     */
    RetResult<DataPurview> addDataPurview(List<DataPurview> dataPurviewList, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 删除数据权限
     *
     * @param dataPurviewList 数据权限
     * @param currentUser     操作人
     * @param dataSourceId    分库
     * @param supplierCode    分表
     * @return 操作信息
     */
    RetResult<DataPurview> deleteDataPurview(List<DataPurview> dataPurviewList, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 检查数据权限，提供其他业务使用
     *
     * @param idData       权限类型
     * @param idSrcUser    控制人
     * @param idCreateUser 制单人
     * @param dataSourceId 分库
     * @param supplierCode 分表
     * @return 权限检查
     */
    @SuppressWarnings("unused")
    boolean checkDataPurview(long idData, long idSrcUser, long idCreateUser, String dataSourceId, long supplierCode);

    List<Long> getPersonDataPurviewList(long idData, long idUser, String dataSourceId, long supplierCode);

    //endregion
}
