package com.microservices.system.api;

import com.microservices.common.core.constant.SecurityConstants;
import com.microservices.common.core.constant.ServiceNameConstants;
import com.microservices.common.core.domain.R;
import com.microservices.common.core.web.page.GenericsTableDataInfo;
import com.microservices.system.api.domain.SysRole;
import com.microservices.system.api.domain.SysUser;
import com.microservices.system.api.domain.SysUserDeptRole;
import com.microservices.system.api.factory.RemoteUserFallbackFactory;
import com.microservices.system.api.model.LoginUser;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Set;

@FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)
public interface RemoteUserService {
    /**
     * 通过用户名查询用户信息
     *
     * @param username 用户名
     * @param source   请求来源
     * @return 结果
     */
    @GetMapping("/user/info/{username}")
    public R<LoginUser> getUserInfo(@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 通过角色Id查询角色信息
     *
     * @param roleId 角色Id
     * @param source 请求来源
     * @return 结果
     */
    @GetMapping("/role/inner/{roleId}")
    public R<SysRole> getRoleInfoByInner(@PathVariable("roleId") Long roleId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

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

    /**
     * 通过用户Id查询用户信息
     *
     * @param userId 用户Id
     * @param source 请求来源
     * @return 结果
     */
    @GetMapping("/user/getSysUserByUserId/{userId}")
    public R<SysUser> getSysUserByUserId(@PathVariable("userId") Long userId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);


    /**
     * 组织下新增用户身份
     *
     * @param deptId
     * @param userId
     * @param roleKey
     * @param source  请求来源
     * @return 结果
     */
    @PostMapping("/SysUserDeptRole/dept/{deptId}/user/{userId}/role/{roleKey}")
    public R<Boolean> addUserIdentify(
            @PathVariable("deptId") Long deptId
            , @PathVariable("userId") Long userId
            , @PathVariable("roleKey") String roleKey
            , @RequestHeader(SecurityConstants.FROM_SOURCE) String source);


    /**
     * 组织下删除用户身份
     *
     * @param deptId
     * @param userId
     * @param roleKey
     * @param source  请求来源
     * @return 结果
     */
    @DeleteMapping("/SysUserDeptRole/dept/{deptId}/user/{userId}/role/{roleKey}")
    public R<Boolean> deleteUserIdentify(
            @PathVariable("deptId") Long deptId,
            @PathVariable("userId") Long userId,
            @PathVariable("roleKey") String roleKey,
            @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);


    /**
     * 通过GitLinkToken获取本系统Token
     *
     * @param cookie
     * @param source 请求来源
     * @return 返回本系统Token
     */
    @PostMapping("/user/getSysUserTokenByGitLinkCookie")
    public R<String> getSysUserTokenByGitLinkCookie(@RequestHeader("cookie") String cookie, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 通过用户名查询用户下组织及组织对应角色列表
     *
     * @param userName 用户名
     * @param source   请求来源
     * @return 用户下组织及组织对应角色列表
     */
    @GetMapping("/SysUserDeptRole/userByUserName/{userName}/list")
    public R<List<SysUserDeptRole>> getSysUserDeptRoleListByUserName(@PathVariable("userName") String userName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);


    /**
     * 通过用户名查询用户下第一个身份
     *
     * @param userName 用户名
     * @param source   请求来源
     * @return 用户下组织及组织对应角色列表
     */
    @GetMapping("/SysUserDeptRole/getFirstUserIdentity/{userName}")
    public R<SysUserDeptRole> getFirstUserIdentity(@PathVariable("userName") String userName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 模糊查询组织下身份列表
     *
     * @param deptId   用户名
     * @param search   模糊搜索
     * @param pageNum  当前记录起始索引
     * @param pageSize 每页显示记录数
     * @param source   请求来源
     * @return 用户下组织及组织对应角色列表
     */
    @GetMapping("/SysUserDeptRole/dept/{deptId}/searchList")
    public R<GenericsTableDataInfo<SysUserDeptRole>> searchUserIdentifierListByDept(@PathVariable("deptId") Long deptId,
                                                                                    @RequestParam("search") String search,
                                                                                    @RequestParam("pageNum") Integer pageNum,
                                                                                    @RequestParam("pageSize") Integer pageSize,
                                                                                    @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 通过Token判断GItLink用户是否已登录
     *
     * @param token  GitLink Token
     * @param source 请求来源
     * @return 是否已登录
     */
    @GetMapping("/user/checkGitLinkUserLogin/{token}")
    public R<Boolean> checkGitLinkUserLogin(@PathVariable("token") String token, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 通过gitLinkUserId获取GitLink用户Token
     *
     * @param gitLinkUserId GitLink用户Id
     * @param source        请求来源
     * @return GitLink用户Token
     */
    @GetMapping("/user/getTokenByGitLinkUserId/{gitLinkUserId}")
    R<String> getTokenByGitLinkUserId(@PathVariable("gitLinkUserId") Long gitLinkUserId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 通过GitLink用户Token获取系统用户名
     *
     * @param gitLinkToken GitLinkToken
     * @param source       请求来源
     * @return 系统用户名
     */
    @GetMapping("/user/getUserNameByGitLinkToken/{gitLinkToken}")
    public R<String> getUserNameByGitLinkToken(@PathVariable("gitLinkToken") String gitLinkToken
            , @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 通过gitLinkUserId获取系统用户
     *
     * @param gitLinkUserId GitLink用户Id
     * @param source        请求来源
     * @return 系统用户
     */
    @GetMapping("/user/getSysUserByGitLinkUserId/{gitLinkUserId}")
    public R<SysUser> getSysUserByGitLinkUserId(@PathVariable("gitLinkUserId") Long gitLinkUserId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 通过GitLink用户Id创建用户
     *
     * @param gitLinkUserId GitLink用户Id
     * @param source        请求来源
     * @return 系统用户
     */
    @PostMapping("/user/createUserByGitLinkUserId/{gitLinkUserId}")
    public R<SysUser> createUserByGitLinkUserId(@PathVariable("gitLinkUserId") Long gitLinkUserId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 根据角色Key获取菜单权限集合
     *
     * @param roleKey 角色Key
     * @param source  请求来源
     * @return 菜单权限集合
     */
    @GetMapping("/menu/roleMenuPermissionByRoleKey/{roleKey}")
    R<Set<String>> selectMenuPermissionByRoleKey(@PathVariable("roleKey") String roleKey
            , @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 根据部门Id和用户Id获取所有状态的用户身份
     *
     * @param deptId 组织Id
     * @param userId 用户Id
     * @param source 请求来源
     * @return 用户身份
     */
    @GetMapping("/SysUserDeptRole/dept/{deptId}/user/{userId}/allStatus")
    R<SysUserDeptRole> getAllStatusUserIdentityByDeptIdAndUserId(
            @PathVariable("deptId") Long deptId,
            @PathVariable("userId") Long userId,
            @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}
