package com.bonus.system.api;

import com.bonus.common.core.constant.SecurityConstants;
import com.bonus.common.core.constant.ServiceNameConstants;
import com.bonus.common.core.domain.R;
import com.bonus.common.core.web.domain.AjaxResult;
import com.bonus.common.core.web.page.TableDataInfo;
import com.bonus.system.api.domain.RoleParams;
import com.bonus.system.api.domain.SysDept;
import com.bonus.system.api.domain.SysUser;
import com.bonus.system.api.factory.RemoteUserFallbackFactory;
import com.bonus.system.api.model.LoginUser;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
 * 用户服务
 *
 * @author bonus
 */
@FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)
public interface RemoteUserService {

    /**
     * 根据条件如用户名，手机号码，状态（停用或正常）和创建时间获取当前登录用户数据权限范围内的用户信息
     *
     * @param user   角色信息
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 满足条件的用户信息分页信息
     */
    @GetMapping("/user/list}")
    public TableDataInfo list(SysUser user, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);


    /**
     * 通过用户名查询用户信息
     *
     * @param username 用户名
     * @param source   请求来源
     * @return 结果
     */
    @GetMapping("/user/info/{username}")
    public R<LoginUser> getUserInfo(@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 通过用户名查询用户信息
     *
     * @param phone 手机号
     * @param source      请求来源
     * @return 结果
     */
    @GetMapping("/user/infoPhoto/{phone}")
    public R<LoginUser> getUserInfoByPhone(@PathVariable("phone") String phone, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);


    /**
     * 通过用户名查询用户信息
     *
     * @param email 邮箱
     * @param source   请求来源
     * @return 结果
     */
    @GetMapping("/user/infoEmail/{email}")
    public R<LoginUser> getUserInfoByEmail(@PathVariable("email") String email, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 注册用户信息
     *
     * @param sysUser 用户信息
     * @param source  请求来源
     * @return 结果
     */
    @PostMapping("/user/register")
    public R<Boolean> registerUserInfo(@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 获取当前登录用户权限内的角色和权限集合
     *
     * @param source 请求来源
     * @return 用户信息
     */
    @GetMapping("/user/getInfo")
    public AjaxResult getInfo(@RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 根据用户编号获取详细信息,用户权限内的角色和权限集合
     *
     * @param userId 用户id
     * @param source 请求来源
     * @return 用户信息
     */
    @GetMapping(value = "/user/{userId}")
    public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    @GetMapping(value = "/user/ids/{userIds}")
    public AjaxResult getUsers(@PathVariable("userIds") Long[] userIds, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    @PostMapping("/user/")
    public AjaxResult add(@Validated @RequestBody SysUser user, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 修改用户
     *
     * @param user   修改用户的用户信息
     * @param source 请求来源
     * @return 修改用户影响的行数或错误信息
     */
   @PostMapping("/user/edit")
    public AjaxResult edit(@Validated @RequestBody SysUser user, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 修改用户
     *
     * @param user   修改用户的用户信息
     * @param source 请求来源
     * @return 修改用户影响的行数或错误信息
     */
    @PostMapping("/user/systemUpdateUser")
    public AjaxResult systemUpdateUser(@Validated @RequestBody SysUser user, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

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

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

    /**
     * 根据用户编号获取授权角色信息
     *
     * @param userId 用户id
     * @param source 请求来源
     * @return 用户角色信息
     */
    @GetMapping("/user/authRole/{userId}")
    public AjaxResult authRole(@PathVariable("userId") Long userId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 给定用户id给用户授权角色
     *
     * @param userId  用户id
     * @param roleIds 授权角色id列表
     * @param source  请求来源
     * @return 成功授权消息或失败消息，
     */
   @PostMapping("/user/authRole/edit")
    public AjaxResult insertAuthRole(@PathVariable("userId") Long userId, @PathVariable("roleIds") Long[] roleIds, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);


    @PostMapping("/user/authRole/insertRole")
    public AjaxResult insertRole(@RequestBody RoleParams roleParams, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
    /**
     * 获取当前登录用户数据权限范围内的部门权限下的部门树列表
     *
     * @param dept   部门信息
     * @param source 请求来源
     * @return 部门树列表或失败消息
     */
    @GetMapping("/user/deptTree")
    public AjaxResult deptTree(SysDept dept, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 查询部门人员树列表
     *
     * @param sysUser   部门信息
     * @param source 请求来源
     * @return 部门人员树列表或失败消息
     */
    @PostMapping("/user/deptUserTree")
    public AjaxResult deptUserTree(SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 修改用户审批状态
     *
     * @param user   用户信息
     * @param source 请求来源
     * @return 部门树列表或失败消息
     */
    @PostMapping("/approvalStatus")
    public AjaxResult approvalStatus(@RequestBody SysUser user, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}
