package com.bonus.system.api;

import com.bonus.common.core.constant.SecurityConstants;
import com.bonus.common.core.constant.ServiceNameConstants;
import com.bonus.common.core.web.domain.AjaxResult;
import com.bonus.common.core.web.page.TableDataInfo;
import com.bonus.system.api.domain.SysRole;
import com.bonus.system.api.domain.SysUser;
import com.bonus.system.api.domain.SysUserRole;
import com.bonus.system.api.factory.RemoteRoleFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
 * @author wangvivi
 */
@FeignClient(contextId = "remoteRoleService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteRoleFallbackFactory.class)
public interface RemoteRoleService {
    /**
     * 获取当前登录用户数据权限范围内的角色列表
     * @param role 角色信息
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 角色列表
     */
    @GetMapping("/role/list")
    public TableDataInfo list(SysRole role, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 根据角色id获取角色详细信息
     * @param roleId 角色id
     * @param source 请求来源,使用SecurityConstants.INNER
     * @return 角色列表
     */
    @GetMapping(value = "/role/{roleId}")
    public AjaxResult getInfo(@PathVariable("roleId") Long roleId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 新增角色
     * @param role 新增的角色信息
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 新增角色影响的行数或错误信息
     */
    @PostMapping("/role")
    public AjaxResult add(@Validated @RequestBody SysRole role, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 修改角色
     * @param role 修改的角色信息
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 修改角色影响的行数或错误信息
     */
   @PostMapping("/role/edit")
    public AjaxResult edit(@Validated @RequestBody SysRole role, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 修改保存数据权限
     * @param role 修改的角色信息
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 修改角色影响的行数或错误信息
     */
   @PostMapping("/role/dataScope")
    public AjaxResult dataScope(@RequestBody SysRole role, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 状态修改
     * @param role 修改的角色信息
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 修改角色状态影响的行数或错误信息
     */
   @PostMapping("/role/changeStatus")
    public AjaxResult changeStatus(@RequestBody SysRole role, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 删除角色
     * @param roleIds 删除的角色id列表
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 删除角色影响的行数或错误信息
     */
    @PostMapping("/role/delete/{roleIds}")
    public AjaxResult remove(@PathVariable("roleIds") Long[] roleIds, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 获取所有角色
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 删除角色影响的行数或错误信息
     */
    @GetMapping("/role/optionselect")
    public AjaxResult optionselect(@RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 查询登录用户数据权限内的已分配用户角色列表
     * @param user 查询条件
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 角色列表
     */
    @GetMapping("/role/authUser/allocatedList")
    public TableDataInfo allocatedList(SysUser user, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 查询登录用户数据权限内的未分配用户角色列表
     * @param user 查询条件
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 角色列表
     */
    @GetMapping("/role/authUser/unallocatedList")
    public TableDataInfo unallocatedList(SysUser user, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 取消授权用户
     * @param userRole 查询条件
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 取消用户的行数或错误信息
     */
   @PostMapping("/role/authUser/cancel")
    public AjaxResult cancelAuthUser(@RequestBody SysUserRole userRole, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 批量取消授权用户
     * @param roleId 取消角色id
     * @param userIds 取消的用户id列表
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 成功或失败消息
     */
   @PostMapping("/role/authUser/cancelAll")
    public AjaxResult cancelAuthUserAll(@PathVariable("roleId")Long roleId, @PathVariable("userIds")Long[] userIds, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 批量选择用户授权
     * @param roleId 授权角色id
     * @param userIds 授权的用户id列表
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 成功或失败消息
     */
   @PostMapping("/role/authUser/selectAll")
    public AjaxResult selectAuthUserAll(@PathVariable("roleId")Long roleId, @PathVariable("userIds")Long[] userIds, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 获取对应角色的部门树列表
     * @param roleId 角色id
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 部门树列表或错误消息
     */
    @GetMapping(value = "/role/deptTree/{roleId}")
    public AjaxResult deptTree(@PathVariable("roleId") Long roleId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}
