package com.kxs.user.biz.controller.kxsapp;


import cn.hutool.core.text.StrPool;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.kxs.common.core.util.R;
import com.kxs.common.security.annotation.Inner;
import com.kxs.user.api.dto.kxsapp.ConcealParentDTO;
import com.kxs.user.api.dto.kxsapp.user.*;
import com.kxs.user.api.model.KxsUser;
import com.kxs.user.api.model.KxsUserReal;
import com.kxs.user.api.vo.kxsapp.user.UserMyUserListVO;
import com.kxs.user.biz.constant.enums.UserErrorTypeEnum;
import com.kxs.user.biz.service.KxsUserBankService;
import com.kxs.user.biz.service.KxsUserRealService;
import com.kxs.user.biz.service.KxsUserService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springdoc.core.annotations.ParameterObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 用户表(KxsSecurityUser)表控制层
 *
 * @author 快秃顶的码农
 * @since 2023-12-05 14:06:37
 */
@RestController
@RequiredArgsConstructor
@RequestMapping("user")
public class KxsUserController {

    private final KxsUserService kxsUserService;
    private final KxsUserBankService kxsUserBankService;
    private final KxsUserRealService kxsUserRealService;



    /**
     * 获取指定用户全部信息
     * 内部调用
     * @return 用户信息
     */
    @Inner
    @GetMapping(value = { "/loadUserByPhone" })
    public R loadUserByPhone(@RequestParam("phone") String phone) {
        KxsUser user = kxsUserService.getOne(Wrappers.<KxsUser>query()
                .lambda()
                .eq(KxsUser::getPhone, phone));
        if (user == null) {
            return R.failed(UserErrorTypeEnum.USER_EMPTY.getDescription());
        }
        return R.ok(user);
    }

    /**
     * 根据code获取用户全部信息
     * 内部调用
     * @return 用户信息
     */
    @Inner
    @GetMapping(value = { "/loadUserByCode" })
    public R loadUserByCode(@RequestParam("userCode") String userCode) {
        KxsUser user = kxsUserService.getOne(Wrappers.<KxsUser>query()
                .lambda()
                .eq(KxsUser::getUserCode, userCode));
        return R.ok(user);
    }
    /**
     * 有效创客校验
     */
    @Inner
    @GetMapping(value = { "/validUserVerify" })
    public boolean validUserVerify(@RequestParam("userId") Long userId) {

        return kxsUserService.validUserVerify(userId);
    }
    /**
     * 检查用户是否在自己伞下
     * 内部调用
     * @return Boolean
     */
    @Inner
    @GetMapping(value = { "/checkUserIsChildren" })
    public R checkUserIsChildren(@RequestParam("userId") Integer userId, @RequestParam("checkUserId") Integer checkUserId) {

        return R.ok(kxsUserService.checkUserIsChildren(userId, checkUserId));
    }

    /**
     * 根据id获取用户全部信息
     * 内部调用
     * @return 用户信息
     */
    @Inner
    @GetMapping(value = { "/loadUserById" })
    public R loadUserById(@RequestParam("userId") Integer userId) {

        return R.ok(kxsUserService.getById(userId));
    }
    /**
     * 根据id获取用户实名认证信息
     * 内部调用
     * @return 用户信息
     */
    @Inner
    @GetMapping(value = { "/loadUserRealById" })
    public R loadUserRealById(@RequestParam("userId") Integer userId) {

        return R.ok(kxsUserRealService.getOne(Wrappers.<KxsUserReal>query().lambda().eq(KxsUserReal::getUserId,userId)));
    }

    /**
     * 根据id获取用户银行卡和实名信息
     * 内部调用
     * @return 用户信息
     */
    @Inner
    @GetMapping(value = { "/loadUserRealBankById" })
    public R loadUserRealBankById(@RequestParam("userId") Integer userId) {

        return R.ok(kxsUserService.loadUserRealBankById(userId));
    }

    /**
     * 获取用户数据
     *
     * @return 获取用户数据
     */
    @GetMapping("/info")
    public R info() {
        return R.ok(kxsUserService. info());
    }


    /**
     * 个人资料-修改地区
     *
     * @param param 实体对象
     * @return 个人资料-修改地区
     */
    @PostMapping("/updateArea")
    public R updateArea(@Valid @RequestBody UserUpdateAreaDTO param) {
        return kxsUserService.updateArea(param);
    }
    /**
     * 个人资料-修改地区
     *
     * @param kxsUser 实体对象
     * @return 个人资料-修改地区
     */
    @Inner
    @PostMapping("/updateById")
    public R updateById(@RequestBody KxsUser kxsUser) {
        return R.ok(kxsUserService.updateById(kxsUser));
    }
    /**
     * 设置-修改支付密码
     *
     * @param param 实体对象
     * @return 设置-修改支付密码
     */
    @PostMapping("/modifyPayPwd")
    public R modifyPayPwd(@RequestBody KxsUser param) {

        return kxsUserService.modifyPayPwd(param);
    }

    /**
     * 设置-忘记支付密码
     *
     * @param param 实体对象
     * @return 设置-忘记支付密码
     */
    @PostMapping("/forgetPayPwd")
    public R forgetPayPwd(@RequestBody ForgetPayPwdDTO param) {

        return kxsUserService.forgetPayPwd(param);
    }


    /**
     * 设置-修改登陆密码
     *
     * @param param 实体对象
     * @return 设置-修改登陆密码
     */
    @PostMapping("/updatePwd")
    public R updatePwd(@Valid @RequestBody UserUpdatePwdDTO param) {

        return kxsUserService.updatePwd(param);
    }


    /**
     * 设置-修改登陆手机号
     *
     * @param param 实体对象
     * @return 设置-修改登陆手机号
     */
    @PostMapping("/updateLoginPhone")
    public R updateLoginPhone(@Valid @RequestBody UserUpdateLoginPhoneDTO param) {

        return kxsUserService.updateLoginPhone(param);
    }


    /**
     * 设置-变更结算卡
     *
     * @param param 实体对象
     * @return 设置-变更结算卡
     */
    @PostMapping("/updateBankInfo")
    public R updateBankInfo(@Valid @RequestBody UserUpdateBankInfoDTO param) {

        kxsUserService.checkValidateCode(param.getPhone(), param.getCode());
        return kxsUserBankService.updateBankInfo(param);
    }


    /**
     * 设置-实名认证
     *
     * @param param 实体对象
     * @return 设置-实名认证
     */
    @PostMapping("/realUser")
    public R realUser(@Valid @RequestBody RealUserDTO param) {
        return kxsUserService.realUser(param);
    }


    /**
     * 设置-实名认证查看
     *
     * @return 设置-实名认证查看
     */
    @GetMapping("/getRealUserInfo")
    public R getRealUserInfo() {
        return R.ok(kxsUserService.getRealUserInfo());
    }


    /**
     * 设置-手势密码
     *
     * @param param 实体对象
     * @return 设置-手势密码
     */
    @PostMapping("/handPwd")
    public R handPwd(@Valid @RequestBody UserHandPwdDTO param) {

        return kxsUserService.handPwd(param);
    }


    /**
     * 设置-验证身份信息
     *
     * @param param 实体对象
     * @return 设置-验证身份信息
     */
    @PostMapping("/checkUserInfo")
    public R checkUserInfo(@Valid @RequestBody UserCheckUserInfoDTO param) {
        return R.ok(kxsUserService.checkUserInfo(param));
    }



    /**
     * 个人资料-修改头像
     *
     * @param param 实体对象
     * @return 个人资料-修改头像
     */
    @PostMapping("/updateHead")
    public R updateHead(@RequestBody KxsUser param) {

        return R.ok(kxsUserService.updateHead(param));
    }



    /**
     * 设置-注销账号
     *
     * @return 设置-注销账号
     */
    @PostMapping("/removeUser")
    public R removeUser() {
        return R.ok(kxsUserService.removeUser());
    }


    /**
     * 创客列表
     *
     * @param page 分页对象
     * @param param 查询实体
     * @return 创客列表
     */
    @GetMapping("/myUserList")
    public R myUserList(@ParameterObject Page<KxsUser> page, @Valid @ParameterObject UserMyUserListDTO param) {
        return R.ok(kxsUserService.myUserList(page,param));
    }
    /**
     * 未实名列表
     *
     * @param page 分页对象
     * @return 未实名创客列表
     */
    @GetMapping("/notRealUser")
    public R notRealUser(@ParameterObject Page<KxsUser> page) {
        return R.ok(kxsUserService.notRealUser(page));
    }

    /**
     * 隐藏推荐关系
     *
     * @return 隐藏推荐关系
     */
    @PostMapping("/concealParent")
    public R concealParent(@Valid @RequestBody ConcealParentDTO concealParentDTO) {
        return kxsUserService.concealParent(concealParentDTO);
    }

    /**
     * 用户统计
     *
     * @return 用户统计
     */
    @GetMapping("/myUserStatistics")
    public R myUserStatistics() {
        return R.ok(kxsUserService.myUserStatistics());
    }


    /**
     * 用户详情
     *
     * @param id 主键ID
     * @return 用户详情
     */
    @GetMapping("/myUserDetail")
    public R myUserDetail(@RequestParam("id") Integer id) {

        return kxsUserService.myUserDetail(id);
    }

    /**
     * 校验推荐码
     *
     * @param userCode 用户编码
     */
    @GetMapping("/verifyUserCode")
    public R verifyUserCode(@RequestParam("userCode") String userCode) {

        return R.ok(kxsUserService.verifyUserCode(userCode));
    }

}

