package com.zd.system.api;

import com.zd.common.core.web.domain.AjaxResult;
import com.zd.system.api.domain.SysLogoConfigVO;
import com.zd.system.api.model.SimpleUserVO;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import com.zd.common.core.constant.SecurityConstants;
import com.zd.common.core.constant.ServiceNameConstants;
import com.zd.common.core.domain.R;
import com.zd.system.api.domain.SysUser;
import com.zd.system.api.factory.RemoteUserFallbackFactory;
import com.zd.system.api.model.LoginUser;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 用户服务
 *
 * @author zd
 */
@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/info/{username}/{loginType}")
     R<LoginUser> getUserInfo(@PathVariable("username") String username, @PathVariable("loginType") Integer loginType,
                                    @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

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


    /**
     * 通过用户账户查询用户信息
     *
     * @param userName 用户账户
     * @param source   请求来源
     * @return 结果
     */
    @GetMapping("/user/info/username/{username}")
     R<SysUser> getUserInfoByUserName(@PathVariable("username") String userName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
    /**
     * 通过用户卡号查询用户信息
     *
     * @param cardnum 用户账户
     * @param source   请求来源
     * @return 结果
     */
    @GetMapping("/user/info/cardnum/{cardnum}")
     R<SysUser> getUserInfoByCardNum(@PathVariable("cardnum")String cardnum, @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);


    @GetMapping("/user/my/info/Simple")
     R<SimpleUserVO> myInfoSimple(@RequestHeader(SecurityConstants.FROM_SOURCE) String source);
    /**
     * 获取所有可用户IDS
     *
     * @return 结果
     */
    @GetMapping("/user/all")
     R<List<Long>> userALLIDS(@RequestHeader(SecurityConstants.FROM_SOURCE) String source);


    /**
     * 根据用户ids获取电话
     *
     * @return 结果
     */
    @GetMapping("/user/phone/{ids}")
     R<List<String>> getPhoneByUserIDS(@PathVariable("ids") String ids);
    /**
     * 获取指定院系用户IDS
     *
     * @param deptId
     * @return 结果
     */
    @GetMapping("/user/dept/{deptIds}")
     R<List<Long>> userDeptIDS(@PathVariable("deptIds") String deptId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);


    /**
     * 小程序查询院系列表（用户端，管理端）
     */
    @ApiOperation(value = "小程序查询院系列表（用户端，管理端）")
    @GetMapping(value = "/dept/departments/list")
     R<Object> departmentsList();


    /**
     * 小程序查询院系下楼栋列表（用户端，管理端）
     */
    @ApiOperation(value = "小程序查询院系下楼栋列表（用户端，管理端）")
    @GetMapping(value = "/dept/{deptId}/building/list")
     R<Object> building(@PathVariable("deptId") Long deptId);

    /**
     * 登录查询大屏用户的路由菜单
     */
    @GetMapping("/menu/getRouterById/{userId}")
     AjaxResult getRouters(@PathVariable("userId") Long userId);

    /**
     * 大屏用户权限判断
     */
    @GetMapping("/role/authUser/power")
     AjaxResult selectAuthUserPower(@RequestParam("userId") Long userId);

    /**
     * 修改学生信息
     */
    @PutMapping("/user/student")
     AjaxResult editUser(@RequestBody SysUser user);

    /**
     * 修改学生信息
     */
    @PutMapping("/user/student/editStudent")
     AjaxResult editStudent(@RequestBody SysUser user);

    @PostMapping(value = "/user/updateSignature", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
     R updateSignature(@RequestPart("file") MultipartFile file);


    /**
     * 获取用户默认密码
     */
    @GetMapping("/config/configKey/{configKey}")
     AjaxResult getConfigKey(@PathVariable("configKey") String configKey);

    @PostMapping("/user/querySignature")
    R querySignature();


    /**
     * 获取用户默认密码
     */
    @GetMapping("/logo/config/getLogoInfo")
     R<SysLogoConfigVO> getConfigLogo();

    @DeleteMapping("/user/{userIds}")
    AjaxResult remove(@PathVariable("userIds") Long[] userIds);

    /**
     * 获取当前登录用户所属学校以及院系id集合
     * @return
     */
    @GetMapping("/user/getLogingUserDeptids")
    R<List<Long>> getLogingUserDeptids();

    /**
     * 获取当前登录用户所属学校的deptid
     * @return
     */
    @GetMapping("/user/getLoginUserSchoolDeptid")
    R<Long> getLoginUserSchoolDeptid();

    /***
     * 根据电话查询用户信息
     * @param phone
     * @return
     */
    @RequestMapping("/user/getUserByPhone/{phone}")
    R<SysUser> getUserByPhone(@PathVariable("phone") String phone);
}
