package com.sdtool.common.api;

import com.sdtool.common.entity.base.ZTreeData;
import com.sdtool.common.entity.site.ERPTokenUser;
import com.sdtool.common.entity.system.Role;
import com.sdtool.common.entity.system.UserRole;
import com.sweetfish.service.RetResult;
import com.sweetfish.source.PageFlipper;
import org.rex.RMap;

import java.util.List;

public interface RoleService extends ScriptService {

    void writeRedisUserRole(long idUser, List<UserRole> userRoleList, long supplierCode);

    /**
     * 获取用户角色列表
     * 先从redis中获取，如果没有，则从数据库中获取，并更新redis
     *
     * @param id           用户id
     * @param dataSourceId 分库
     * @param supplierCode 分表
     * @return 用户角色列表
     */
    List<UserRole> getUserRoleList(long id, String dataSourceId, long supplierCode);

    /**
     * 获取角色列表，用于查询、增加、修改
     *
     * @param searchData 查询条件
     * @return 角色列表
     */
    @SuppressWarnings({"rawtypes"})
    RetResult<List<Role>> getRoleList(RMap searchData, PageFlipper pageFlipper, String dataSourceId, long supplierCode);

    /**
     * 增加角色
     *
     * @param role        角色信息
     * @param currentUser 操作人
     * @return 操作信息
     */
    RetResult<Role> addRole(Role role, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 修改角色
     *
     * @param role        角色信息
     * @param currentUser 操作人
     * @return 操作信息
     */
    RetResult<Role> updateRole(Role role, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 删除角色
     *
     * @param role        角色信息
     * @param currentUser 操作人
     * @return 操作信息
     */
    RetResult<Role> removeRole(Role role, ERPTokenUser currentUser, String dataSourceId, long supplierCode);

    /**
     * 获取角色对应的菜单树形结构，填充ztree
     *
     * @param roleId 角色id
     * @return 树形角色
     */
    RetResult<List<ZTreeData>> getRoleMenuTreeData(long roleId, String dataSourceId, long supplierCode);

    /**
     * 获取角色信息
     *
     * @param roleId 角色id
     * @return 角色信息
     */
    RetResult<Role> getRoleInfo(long roleId, long supplierCode);
}
