package com.seer.teach.user.api;

import com.seer.teach.user.api.dto.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.Collection;
import java.util.List;

@FeignClient(name = ApiConstants.SERVER_NAME, contextId = "userInfoServiceApi", path = "/seer/user")
public interface UserInfoServiceApi {

    /**
     * 通过ID获取用户信息
     *
     * @param id 用户ID
     * @return 用户信息
     */
    /*@Cached(name = UserInfoCacheService.USER_CACHE_NAME, cacheType = CacheType.REMOTE, expire = 3600, key = "#id")*/
    @GetMapping("/getById")
    UserInfoDTO getById(@RequestParam("id") Integer id);

    /**
     * 通过ID获取用户信息
     *
     * @param ids 用户ID
     * @return 用户信息
     */
    @PostMapping("/getListByUserIds")
    List<UserInfoDTO> getListByUserIds(@RequestBody Collection<Integer> ids);

    /**
     * 通过家长id获取默认的孩子信息
     *
     * @param ids 用户ID
     * @return 用户信息
     */
    @PostMapping("/getChildrenByUserIds")
    List<UserInfoDTO> getDefaultChildrenByUserIds(@RequestBody Collection<Integer> ids);

    /**
     * 通过ID获取用户权限信息
     *
     * @param userId 用户ID
     * @param appId  appId
     * @return 用户权限信息
     */
    @GetMapping("/getUserAuthByUserIdAndAppId")
    UserAuthDTO getUserAuthByUserIdAndAppId(@RequestParam("userId") Integer userId, @RequestParam("appId") String appId);

    /**
     * 通过ID获取用户信息
     *
     * @param userAuthQueryDTO 查询请求参数
     * @return 用户信息
     */
    @PostMapping("/getUserAuthListByUserIdsAndAppId")
    List<UserAuthDTO> getUserAuthListByUserIdsAndAppId(@RequestBody UserAuthQueryDTO userAuthQueryDTO);

    /**
     * 通过ID获取用户信息
     *
     * @param openId 用户的openId
     * @return 用户信息
     */
    @GetMapping("/getByOpenId")
    UserInfoDTO getByOpenId(@RequestParam("id") String openId);

    /**
     * 通过用户ID获取用户权限信息
     *
     * @param userId 用户ID
     * @return 用户权限信息
     */
    @GetMapping("/getUserPermissionByUserId")
    UserPermissionDTO getUserPermission(@RequestParam("userId") Integer userId);


    /**
     * 为指定用户添加经验值
     *
     * @param userId          用户ID
     * @param experienceValue 要添加的经验值
     */
    @GetMapping("/addExperience")
    void addExperience(@RequestParam("userId") Integer userId, @RequestParam("experienceValue") Integer experienceValue);

    /**
     * 获取指定用户的儿童信息
     *
     * @param userId 用户ID
     * @return 儿童信息数据传输对象
     */
    @GetMapping("/getChildrenInfo")
    ChildrenInfoDTO getChildrenInfo(@RequestParam("userId") Integer userId);

    /**
     * 获取指定用户儿童的年级ID
     *
     * @param userId 用户ID
     * @return 儿童所在年级的ID
     */
    @GetMapping("/getChildrenGradeId")
    Integer getChildrenGradeId(@RequestParam("userId") Integer userId);

    /**
     * 保存用户信息
     *
     * @param userInfoDTO 用户信息
     * @return 用户ID
     */
    @PostMapping("/save-user")
    Integer save(@RequestBody UserInfoDTO userInfoDTO);

    /**
     * 跟新用户信息
     *
     * @param userInfoDTO 用户信息
     * @return 用户ID
     */
    @PostMapping("/update-user-assign-role")
    boolean updateUserInfoAndAssignRole(@RequestBody UserInfoDTO userInfoDTO);

    /**
     * 跟新用户信息
     *
     * @param userInfoDTO 用户信息
     * @return 用户ID
     */
    @PutMapping("/update")
    boolean updateUserInfo(@RequestBody UserInfoDTO userInfoDTO);

    /**
     * 新增用户信息并分配角色
     *
     * @param userInfoDTO 用户信息
     * @return 用户ID
     */
    @PostMapping("/add-user-assign-role")
    Integer addUserInfoAndAssignRole(@RequestBody UserInfoDTO userInfoDTO);

    /**
     * 根据孩子Id获取家长信息
     *
     * @param childrenId 用户ID
     * @return 用户信息
     */
    @GetMapping("/getParentIdByChildrenId")
    Integer getParentIdByChildrenId(@RequestParam("childrenId") Integer childrenId);


    /**
     * 通过手机号获取用户信息
     *
     * @param mobile
     * @return
     */
    @GetMapping("/listByMobile")
    List<UserInfoDTO> listByMobile(@RequestParam("mobile") String mobile);


    @GetMapping("/getUserByMobile")
    UserInfoDTO getUserByMobile(@RequestParam("mobile") String mobile);

    /**
     * 通过用户ID列表获取用户信息
     *
     * @param userIds
     * @return
     */
    @GetMapping("/listByIds")
    List<UserDeviceDTO> listByIds(@RequestParam("userIds") List<Integer> userIds);

    /**
     * 通过用户ID获取用户信息
     *
     * @param userId
     * @return
     */
    @GetMapping("/getByUserId")
    UserInfoDTO getByUserId(@RequestParam("userId") Integer userId);

    @GetMapping("/saveDefaultChildrenUser")
    Integer saveDefaultChildrenUser();

    @GetMapping("/checkUserInfo")
    Integer checkUserInfo(@RequestParam("userId") Integer userId);

    @GetMapping("/getUserIdByUserName")
    Integer getUserIdByUserName(@RequestParam("userName") String userName);

}