package com.kxs.user.biz.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.kxs.common.core.util.R;
import com.kxs.product.api.vo.kxsapp.excel.ExistPayPwdVO;
import com.kxs.user.api.dto.kxsapp.ConcealParentDTO;
import com.kxs.user.api.dto.kxsapp.app.ForgetPwdDTO;
import com.kxs.user.api.dto.kxsapp.app.MchRegisterDTO;
import com.kxs.user.api.dto.kxsapp.app.RegisterDTO;
import com.kxs.user.api.dto.kxsapp.user.*;
import com.kxs.user.api.model.KxsUser;
import com.kxs.user.api.vo.kxsapp.user.RealUserInfoVO;
import com.kxs.user.api.vo.kxsapp.user.SearchMyUserListVO;
import com.kxs.user.api.vo.kxsapp.user.UserCodeInfoVO;
import com.kxs.user.api.vo.kxsapp.user.UserInfoVO;
import com.kxs.user.api.vo.kxsapp.userLevel.LevelDetailVO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.util.List;

/**
 * 用户表(KxsSecurityUser)表服务接口
 *
 * @author 快秃顶的码农
 * @since 2023-12-05 13:50:16
 */
public interface KxsUserService extends IService<KxsUser> {

    /**
     * 注册
     *
     * @param registerDTO  注册dto
     * @return {@link R}
     */
    R register(RegisterDTO registerDTO);

    /**
     * 发送验证码
     *
     * @param mobile 电话
     * @return {@link Boolean}
     */
    Boolean sendCode(String mobile);

    /**
     * 忘记PWD
     *
     * @param param 参数
     * @return {@link Boolean}
     */
    Boolean forgetPwd(ForgetPwdDTO param);

    /**
     * 是否设置支付密码
     *
     * @return {@link Boolean}
     */
    ExistPayPwdVO existPayPwd();

    /**
     * 检查支付PWD
     *
     * @param payPwd 支付PWD
     * @return {@link Boolean}
     */
    Boolean checkPayPwd(String payPwd);

    /**
     * 用户代码信息
     *
     * @param userCode 用户代码
     * @return {@link UserCodeInfoVO}
     */
    UserCodeInfoVO userCodeInfo(String userCode);

    /**
     * 验证手势密码
     *
     * @param handPwd 手动PWD
     * @return {@link Boolean}
     */
    Boolean checkHandPwd(String handPwd);

    /**
     * 检查登录密码
     *
     * @param password 密码
     * @return {@link Boolean}
     */
    Boolean checkLoginPwd(String password);

    /**
     * 退出登陆
     *
     * @return {@link Boolean}
     */
    Boolean logout(String tokenValue);

    /**
     * 信息
     *
     * @return {@link UserInfoVO}
     */
    UserInfoVO info();

    /**
     * 更新区域
     *
     * @param param 参数
     * @return {@link Boolean}
     */
    R updateArea(UserUpdateAreaDTO param);

    /**
     * 修改支付 PWD
     *
     * @param param 参数
     * @return {@link Boolean}
     */
    R modifyPayPwd(KxsUser param);

    /**
     * 更新 PWD
     *
     * @param param 参数
     * @return {@link Boolean}
     */
    R updatePwd(UserUpdatePwdDTO param);

    /**
     * 更新登录电话
     *
     * @param param 参数
     * @return {@link R}
     */
    R updateLoginPhone(UserUpdateLoginPhoneDTO param);


    /**
     * 实名认证
     *
     * @param param 参数
     * @return {@link R}
     */
    R realUser(RealUserDTO param);

    /**
     * 实名认证查看
     *
     * @return {@link RealUserInfoVO}
     */
    RealUserInfoVO getRealUserInfo();

    /**
     * 手势密码
     *
     * @param param 参数
     * @return {@link R}
     */
    R handPwd(UserHandPwdDTO param);

    /**
     * 验证身份信息
     *
     * @param param 参数
     * @return {@link Boolean}
     */
    Boolean checkUserInfo(UserCheckUserInfoDTO param);

    /**
     * 修改头像
     *
     * @param param 参数
     * @return {@link Boolean}
     */
    Boolean updateHead(KxsUser param);

    /**
     * 注销账号
     *
     * @return {@link Boolean}
     */
    Boolean removeUser();

    /**
     * 检查用户是否在自己伞下
     *
     * @param userId      用户 ID
     * @param checkUserId 检查用户 ID
     * @return {@link Boolean}
     */
    Boolean checkUserIsChildren(Integer userId, Integer checkUserId);

    /**
     * 根据id获取用户银行卡和实名信息
     *
     * @param userId 用户 ID
     * @return {@link RealUserInfoVO}
     */
    RealUserInfoVO loadUserRealBankById(Integer userId);

    /**
     * 职级详情
     *
     * @return {@link LevelDetailVO}
     */
    LevelDetailVO levelDetail();

    /**
     * 验证验证码
     *
     * @param mobile 手机号
     */
    void checkValidateCode(String mobile, String code);

    /**
     * 忘记支付 PWD
     *
     * @param param 参数
     * @return {@link R}
     */
    R forgetPayPwd(ForgetPayPwdDTO param);
    /**
     * 创客列表
     *
     * @param page 分页对象
     * @param param 查询实体
     * @return 创客列表
     */
    Object myUserList(Page<KxsUser> page, UserMyUserListDTO param);
    /**
     * 用户统计
     *
     * @return 用户统计
     */
    Object myUserStatistics();

    /**
     * 用户详情
     *
     * @param id 主键ID
     * @return 用户详情
     */
    R myUserDetail(Integer id);

    /**
     * 校验推荐码
     * @param userCode
     * @return
     */
    Object verifyUserCode(String userCode);

    /**
     * 有效创客校验
     * @param userId
     * @return
     */
    boolean validUserVerify(Long userId);

    /**
     * 未实名创客列表
     * @param page
     * @return
     */
    Object notRealUser(Page<KxsUser> page);
    /**
     * 隐藏推荐关系
     *
     * @return 隐藏推荐关系
     */
    R concealParent(ConcealParentDTO concealParentDTO);

    /**
     * 商户型创客注册
     *
     * @param registerDTO 注册 DTO
     * @return {@link R}
     */
    R mchRegister(MchRegisterDTO registerDTO);

    /**
     * 搜索伞下创客
     *
     * @param keyword 关键词
     * @return {@link List}<{@link SearchMyUserListVO}>
     */
    List<SearchMyUserListVO> searchMyUserList(String keyword);
}

