package com.vctgo.system.api;

import com.vctgo.common.core.constant.SecurityConstants;
import com.vctgo.common.core.constant.ServiceNameConstants;
import com.vctgo.common.core.domain.R;
import com.vctgo.common.core.web.domain.AjaxResult;
import com.vctgo.system.api.domain.SysPlatformDept;
import com.vctgo.system.api.domain.SysPlatformUser;
import com.vctgo.system.api.domain.SysUser;
import com.vctgo.system.api.domain.SysUserTempalte;
import com.vctgo.system.api.domain.dto.StaticsUserPermsDto;
import com.vctgo.system.api.domain.dto.SysUserDto;
import com.vctgo.system.api.factory.RemoteUserFallbackFactory;
import com.vctgo.system.api.model.LoginUser;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.web.bind.annotation.*;

import java.util.List;

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

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

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

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

    /**
     * 获取当前租户下的可见用户（视对象SysUser中的参数而定）
     *
     * @param sysUserDto 用户信息
     * @param source  请求来源
     * @return 结果
     */
    @GetMapping("/user/list/all")
    R<List<SysUser>> getAllUserByTenantId(@SpringQueryMap SysUserDto sysUserDto, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 全量获取用户列表
     */
    @GetMapping("/user/allList")
    R<List<SysUser>> userList();

    /**
     * 通过租户id获取特定的用户列表
     */
    @GetMapping("/user/allList/tenantIds")
    R<List<SysUserTempalte>> userListByTenantIds(@RequestParam("tenantIds") String tenantIds);

    /**
     * 通过用户id查询用户信息
     */
    @GetMapping("/user/name/info/{userId}")
    R<SysUser> getUserInfo(@PathVariable("userId") Long userId);

    /**
     * 通过用户id查询用户信息
     */
    @GetMapping("/user/plat/name/info/{userId}")
    R<SysPlatformUser> getPlatUserInfo(@PathVariable("userId") Long userId);

    @GetMapping("/user/name/info/permissions")
    R<String> getSysUserPermissions();

    @GetMapping("/plat/user/name/info/permissions")
    R<String> getSysPlatformUserPermissions();

    /**
     * 判断用户是否存在指定的权限
     *
     * @param  staticsUserPermsDto 部门信息
     * @param source  请求来源
     * @return 统计对象集合
     */
    @GetMapping("/user/exist/perms")
    R<Boolean> judgeUserIsExistPointPerms(@SpringQueryMap StaticsUserPermsDto staticsUserPermsDto, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    @GetMapping("/user/role/check/{roleKey}")
    R<List<Long>> selectUserAndRoleList(@PathVariable("roleKey") String roleKey);

    @GetMapping("/plat/user/profile/user/list")
    R<List<SysPlatformDept>> selectProfileUserList();

    /**
     * 根据用户Id获取授权角色
     */
    @GetMapping("/plat/user/authRole/{userId}")
    R<AjaxResult> getPlatformUserInfo(@PathVariable("userId") String userId);

    @GetMapping("/plat/user/getUserList/{nickName}")
    R<List<SysPlatformUser>> getUserList(@PathVariable("nickName") String nickName);

    /**
     * 根据手机号查询用户
     */
    @GetMapping("/user/appUserInfo/{account}")
    R<LoginUser> getAppUserInfo(@PathVariable("account") String account);

    @GetMapping("/user/selectByOpenId/{wxCode}")
    R<LoginUser> getUserInfoByOpenId(String wxCode);

    /**
     * 获取用户昵称
     */
    @GetMapping("/user/getUserName/{userIds}")
    R<List<String>> getUserName(@PathVariable("userIds") List<Long> userIds);
}
